"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Actualización del contenido del sitio web según lo programado a través de GitHub Actions

Actualización del contenido del sitio web según lo programado a través de GitHub Actions

Publicado el 2024-11-06
Navegar:189

Me gustaría compartir mi viaje hacia la construcción de un sistema de gestión de contenido autosostenible que no requiera una base de datos de contenido en el sentido tradicional.

El problema

El contenido (publicaciones de blog y marcadores) de este sitio web se almacena en una base de datos de Notion:

Updating website content on schedule via GitHub Actions

La base de datos con marcadores –  Notion UI

El problema que estaba tratando de resolver era no tener que implementar el sitio web manualmente después de cada marcador que agrego allí. Y además de eso, mantenga el alojamiento lo más barato posible, porque para mí realmente no importa qué tan rápido terminen en línea los marcadores que agrego a mi base de datos de Notion.

Entonces, después de investigar un poco, se me ocurrió la siguiente configuración:

Updating website content on schedule via GitHub Actions

Una descripción general de alto nivel del mecanismo de entrega de contenido

El sistema consta de varios componentes:

  • La acción "Enviar a principal" que implementa los cambios
  • La acción "Actualizar contenido" que descarga contenido de Notion API y confirma los cambios
  • La acción “Actualizar contenido según lo programado” se ejecuta de vez en cuando y activa la acción “Actualizar contenido”

Veamos cada uno de ellos desde adentro hacia afuera en detalle.

El flujo de trabajo "Enviar a principal"

No hay mucho que decir aquí, configuración bastante estándar: cuando hay un impulso a la rama principal, este flujo de trabajo crea la aplicación y la implementa en Cloudflare Pages usando la CLI de Wrangler:

name: Push to Main
on:
  push:
    branches: [main]
  workflow_dispatch: {}
jobs:
  deploy-cloudflare-pages:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Setup pnpm
        uses: pnpm/action-setup@v4
      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version-file: .node-version
          cache: pnpm
      - name: Install node modules
        run: |
          pnpm --version
          pnpm install --frozen-lockfile
      - name: Build the App
        run: |
          pnpm build
      - name: Publish Cloudflare Pages
        env:
          CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
          CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
        run: |
          pnpm wrangler pages deploy ./out --project-name ${{ secrets.CLOUDFLARE_PROJECT_NAME }}

El flujo de trabajo "Actualizar contenido"

Este flujo de trabajo solo se puede activar "manualmente"... pero también automáticamente porque puedes activarlo usando un token de acceso personal de GitHub, también conocido como PAT. Inicialmente lo escribí porque quería implementar cambios desde mi teléfono. Descarga las publicaciones y los marcadores utilizando la API de Notion y luego, si hay algún cambio en el código base, crea una confirmación y la envía. Para funcionar correctamente, este flujo de trabajo debe contar con una PAT que tenga “acceso de lectura y escritura al código” del repositorio:

name: Update Content
on:
  workflow_dispatch: {}
jobs:
  download-content:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          # A Github Personal Access Token with access to the repository 
          # that has the follwing permissions:
          # ✅ Read and Write access to code
          token: ${{ secrets.GITHUB_PAT_CONTENT }}
      - name: Setup pnpm
        uses: pnpm/action-setup@v4
      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version-file: .node-version
          cache: pnpm
      - name: Install node modules
        run: |
          pnpm --version
          pnpm install --frozen-lockfile
      - name: Download articles content from Notion
        env:
          NOTION_KEY: "${{ secrets.NOTION_KEY }}"
          NOTION_ARTICLES_DATABASE_ID: "${{ secrets.NOTION_ARTICLES_DATABASE_ID }}"
        run: |
          pnpm download-articles
      - name: Download bookmarks content from Notion
        env:
          NOTION_KEY: ${{ secrets.NOTION_KEY }}
          NOTION_BOOKMARKS_DATABASE_ID: ${{ secrets.NOTION_BOOKMARKS_DATABASE_ID }}
        run: |
          pnpm download-bookmarks
      - name: Configure Git
        run: |
          git config --global user.email "${{ secrets.GIT_USER_EMAIL }}"
          git config --global user.name "${{ secrets.GIT_USER_NAME }}"
      - name: Check if anything changed
        id: check-changes
        run: |
          if [ -n "$(git status --porcelain)" ]; then
            echo "There are changes"
            echo "HAS_CHANGED=true" >> $GITHUB_OUTPUT
          else
            echo "There are no changes"
            echo "HAS_CHANGED=false" >> $GITHUB_OUTPUT
          fi
      - name: Commit changes
        if: steps.check-changes.outputs.HAS_CHANGED == 'true'
        run: |
          git add ./src/content
          git add ./public
          git commit -m "Automatic content update commit"
          git push

El flujo de trabajo "Actualizar contenido según lo programado"

Este es bastante simple: simplemente se ejecuta de vez en cuando y activa el flujo de trabajo anterior. Para funcionar correctamente, este flujo de trabajo debe contar con una PAT de GitHub que tenga "acceso de lectura y escritura a acciones" del repositorio. En mi caso es un PAT diferente:

name: Update Content on Schedule
on:
  schedule:
    - cron: "13 0,12 * * *"
  workflow_dispatch: {}
jobs:
  trigger-update-content:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Dispatch the Update Content workflow
        env:
          # A Github Personal Access Token with access to the repository 
          # that has the follwing permissions:
          # ✅ Read and Write access to actions
          GH_TOKEN: ${{ secrets.GITHUB_PAT_ACTIONS }}
        run: |
          gh workflow run "Update Content" --ref main

Conclusión

Para mí, esta configuración ha demostrado ser realmente buena y flexible. Debido a la estructura modular, la acción "Actualizar contenido" se puede activar manualmente, p. desde mi teléfono mientras viajo. Para mí, esta fue otra experiencia valiosa de mejora progresiva de un flujo de trabajo.

¿Espero que te resulte útil?

Declaración de liberación Este artículo se reproduce en: https://dev.to/prudkohliad/updating-website-content-on-schedule-via-github-actions-39o7?1 Si hay alguna infracción, comuníquese con [email protected] para eliminar él
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3