برنامه نویسی

به روز رسانی محتوای وب سایت طبق برنامه از طریق GitHub Actions

من می خواهم سفر خود را در ساختن یک سیستم مدیریت محتوای خودپایدار که نیازی به پایگاه داده محتوا به معنای سنتی ندارد به اشتراک بگذارم.

مشکل

محتوای (پست های وبلاگ و نشانک ها) این وب سایت در پایگاه داده Notion ذخیره می شود:

پایگاه داده با نشانک ها – Notion UI

پایگاه داده با نشانک ها – Notion UI

مشکلی که من سعی در حل آن داشتم این بود که مجبور نباشم وب سایت را به صورت دستی بعد از هر نشانکی که در آنجا اضافه می کنم مستقر کنم. و علاوه بر آن – میزبانی را تا حد امکان ارزان نگه دارید، زیرا برای من واقعاً مهم نیست که نشانک‌هایی که به پایگاه داده Notion خود اضافه می‌کنم با چه سرعتی آنلاین شوند.

بنابراین، پس از کمی تحقیق، به تنظیمات زیر رسیدم:

یک نمای کلی در سطح بالا از مکانیسم تحویل محتوا

یک نمای کلی در سطح بالا از مکانیسم تحویل محتوا

این سیستم از چندین جزء تشکیل شده است:

  • عمل “Push to Main” که تغییرات را اجرا می کند
  • اقدام «به‌روزرسانی محتوا» که محتوا را از Notion API دانلود می‌کند و تغییرات را انجام می‌دهد
  • اقدام «به‌روزرسانی محتوا در زمان‌بندی» هر چند وقت یک‌بار اجرا می‌شود و اقدام «به‌روزرسانی محتوا» را آغاز می‌کند.

اجازه دهید هر یک از آنها را از درون به بیرون با جزئیات بررسی کنیم.

گردش کار “Push to Main”.

در اینجا چیز زیادی برای گفتن وجود ندارد، تنظیم بسیار استاندارد، – وقتی فشاری به آن وارد شود main شاخه، این گردش کار برنامه را می سازد و با استفاده از Wrangler CLI آن را در صفحات Cloudflare مستقر می کند:

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 دانلود می کند و سپس – در صورت تغییر در پایگاه کد – یک commit ایجاد می کند و آن را فشار می دهد. به منظور عملکرد صحیح، این گردش کار باید با یک 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 متفاوت است:

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
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتیجه گیری

برای من این راه اندازی ثابت کرده است که واقعا خوب و انعطاف پذیر است. به دلیل ساختار ماژولار، عمل “به روز رسانی محتوا” را می توان به صورت دستی فعال کرد – به عنوان مثال از تلفن من در حین سفر. برای من این یک تجربه ارزشمند دیگر از بهبود تدریجی یک گردش کار بود.

امیدوارم که این برای شما مفید باشد 😉

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا