首頁 >web前端 >js教程 >透過 GitHub Actions 按計畫更新網站內容

透過 GitHub Actions 按計畫更新網站內容

PHPz
PHPz原創
2024-08-17 15:20:01725瀏覽

我想分享我建立一個自我永續的內容管理系統的旅程,該系統不需要傳統意義上的內容資料庫。

問題

網站的內容(部落格文章和書籤)儲存在 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn