首页 > web前端 > js教程 > 正文

通过 GitHub Actions 按计划更新网站内容

PHPz
发布: 2024-08-17 15:20:01
原创
585 人浏览过

我想分享我构建一个自我可持续的内容管理系统的旅程,该系统不需要传统意义上的内容数据库。

问题

该网站的内容(博客文章和书签)存储在 Notion 数据库中:

Updating website content on schedule via GitHub Actions

带有书签的数据库 –  Notion UI

我试图解决的问题是不必在添加每个书签后手动部署网站。最重要的是 - 保持托管尽可能便宜,因为对我来说,添加到我的 Notion 数据库中的书签最终上线的速度有多快并不重要。

因此,经过一番研究,我提出了以下设置:

Updating website content on schedule via GitHub Actions

内容交付机制的高级概述

系统由几个组件组成:

  • 部署更改的“推送到主”操作
  • “更新内容”操作,从 Notion API 下载内容并提交更改
  • “按计划更新内容”操作偶尔运行一次并触发“更新内容”操作

让我们从内到外详细了解每一个。

“推送到主”工作流程

这里没什么可说的,非常标准的设置, – 当推送到主分支时,此工作流程会构建应用程序并使用 Wrangler CLI 将其部署到 Cloudflare Pages:

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 }}
登录后复制

“更新内容”工作流程

此工作流程只能“手动”触发……但也可以自动触发,因为您可以使用 GitHub 个人访问令牌(又名 PAT)触发它。我最初编写它是因为我想从我的手机部署更改。它使用 Notion API 下载帖子和书签,然后 - 如果代码库有任何更改 - 创建提交并推送它。为了正常运行,此工作流程必须提供具有存储库“代码读写访问权限”的 PAT:

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
登录后复制

“按计划更新内容”工作流程

这个非常简单:它只是每隔一段时间运行一次并触发上面的工作流程。为了正常运行,必须为该工作流程提供 GitHub PAT,该 PAT 具有对存储库的“actions 的读写访问权限”。就我而言,这是一个不同的 PAT:

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
登录后复制

结论

对我来说,这个设置已被证明非常好且灵活。由于模块化结构,“更新内容”操作可以手动触发 - 例如旅行时从我的手机上。对我来说,这是逐步增强工作流程的又一宝贵经验。

希望您觉得这有帮助?

以上是通过 GitHub Actions 按计划更新网站内容的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!