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

من می خواهم سفر خود را در ساختن یک سیستم مدیریت محتوای خودپایدار که نیازی به پایگاه داده محتوا به معنای سنتی ندارد به اشتراک بگذارم.
مشکل
محتوای (پست های وبلاگ و نشانک ها) این وب سایت در پایگاه داده Notion ذخیره می شود:
مشکلی که من سعی در حل آن داشتم این بود که مجبور نباشم وب سایت را به صورت دستی بعد از هر نشانکی که در آنجا اضافه می کنم مستقر کنم. و علاوه بر آن – میزبانی را تا حد امکان ارزان نگه دارید، زیرا برای من واقعاً مهم نیست که نشانکهایی که به پایگاه داده 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
نتیجه گیری
برای من این راه اندازی ثابت کرده است که واقعا خوب و انعطاف پذیر است. به دلیل ساختار ماژولار، عمل “به روز رسانی محتوا” را می توان به صورت دستی فعال کرد – به عنوان مثال از تلفن من در حین سفر. برای من این یک تجربه ارزشمند دیگر از بهبود تدریجی یک گردش کار بود.
امیدوارم که این برای شما مفید باشد 😉