برنامه نویسی

استقرار سایت های GitHub Pages با GitHub Workflows

قبلاً در مورد نحوه استفاده از GitHub Workflows برای به روز نگه داشتن وب سایت های “نیمه استاتیک” نوشته ام. این تکنیکی است که به نظر من واقعاً مفید است. وقتی آن پست وبلاگ را نوشتم، همه چیز بسیار ساده بود – شما انتخاب کردید که کدام شعبه وب سایت شما را نگه دارد (سنتی برای مدتی وجود داشت که از آن استفاده کنید. gh-pages) و اینکه آیا صفحات وب سایت در دایرکتوری ریشه مخزن یا دایرکتوری فراخوانی شده بودند /docs. من معمولا فایل های وب سایت خود را در آن قرار می دهم /docs دایرکتوری در master (اکنون main) شعبه و همه چیز به خوبی کار می کرد.

دلیل ذخیره سازی سایت در /docs به طوری که بین فایل هایی که برای تولید سایت استفاده می شد از خود سایت خروجی تولید شده جدایی وجود داشت. بسیاری از مخازن من دارای یک /tt دایرکتوری که حاوی الگوها است، a /data دایرکتوری که حاوی فایل های JSON یا پایگاه داده SQLite و a /bin دایرکتوری با a build برنامه ای که همه آن چیزها را با هم جمع می کند و انبوهی از فایل های HTML را تولید می کند که در نهایت به آن می رسند /docs فهرست راهنما. در پست اصلی وبلاگم در مورد این موضوع، یک تعریف گردش کار GitHub را نشان دادم که سایت را بازسازی می کند (هنگامی که فایل های ورودی تغییر می کنند یا طبق یک برنامه زمان بندی شده است) و هر فایل تغییر یافته را متعهد می کند. /docs فهرست راهنما. سپس مقداری جادوی GitHub اطمینان حاصل می کند که نسخه جدید سایت در سرور GitHub Pages مستقر شده است. همه چیز با دنیا خوب بود.

سپس، چند ماه پیش، اوضاع کمی پیچیده تر شد. ما گزینه هایی در مورد نحوه استقرار سایت GitHub Pages شما به دست آوردیم. نسخه استانداردی که قبلاً از آن استفاده می‌کردم «استقرار از یک شعبه» نام داشت، اما گزینه دیگری به نام «اقدامات GitHub» وجود داشت. به نظرم محتمل بود که واقعاً نیاز به استفاده از گزینه “GitHub Actions” داشتم، اما همه چیز همچنان به روش قبلی کار می کرد، و من چیزهای بسیار جالب تری برای بررسی داشتم، بنابراین همه چیز را به همان شکلی که بود رها کردم.

خوب، من می گویم که کارها هنوز به روش قدیمی کار می کردند … آنها بودند، اما یک چیز کمی متفاوت بود. به نظر می رسید که روش قدیمی توسط یک جریان کاری جدید GitHub به نام “pages-build-deployment” که به طور خودکار به تمام مخازنی که به آن نیاز داشتند اضافه شده بود، پشتیبانی می شد. و با نگاهی به جزئیات آن گردش کار، متوجه شدم که برخی از کارهای غیرضروری را در مخازن من انجام می دهد – برای مثال فرض می شود که سایت با استفاده از Jekyll ساخته می شود و این فقط برای چند مخزن من صادق است. برای اکثر آنها، این کار غیر ضروری بود. بنابراین من نیاز داشتم که گزینه استقرار جدید را با جزئیات بیشتری بررسی کنم.

من چند هفته پیش، با تغییر گزینه از “deploy from a branch” به “GitHub Actions” شروع کردم به این امید که، چون قبلا از GitHub Actions استفاده می کردم، همه چیز فقط کار می کند. اما متاسفانه اینطور نبود. سایت جدید من در حال ایجاد و متعهد به مخزن بود – اما تغییرات در سایت زنده نشان داده نمی شد. بنابراین من همه چیز را به عقب تغییر دادم تا زمانی که فرصت پیدا کردم جزئیات بیشتری را بررسی کنم.

آن زمان امروز بود. به نظر می رسید که من باید کدی را در گردش کار GitHub خود وارد کنم که در واقع استقرار سایت را در سرورهای GitHub Pages انجام دهد. یک جستجوی سریع در بازار GitHub Actions، اقدام سایت Deploy GitHub Pages را پیدا کرد که به نظر کار درستی بود. اما با خواندن مستندات، متوجه شدم که می‌خواهد سایت را از یک مصنوع مستقر کند، بنابراین ابتدا باید آن را ایجاد می‌کردم. و سپس مصنوع آپلود GitHub Pages را پیدا کردم که کار درست را انجام داد. بنابراین فقط موردی بود که این دو عمل را به روش صحیح به گردش کار خود اضافه کردم.

قبلاً، گردش کار من برای این سایت ها فقط به یک کار (به نام build) اما حالا یک را اضافه کردم deploy شغلی که به آن بستگی داشت build. برای مثال، گردش کاری که Planet Perl را می‌سازد اکنون به این شکل است:

name: Generate web page

on:
  push:
    branches: '*'
  schedule:
    - cron: '37 */4 * * *'
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest
    container: davorg/perl-perlanet:latest

    steps:
    - name: Checkout
      uses: actions/checkout@v3

    - name: Create pages
      run: |
        mkdir -p docs
        perlanet > perlanet.log 2>&1
    - name: Commit new page
      if: github.repository == 'davorg/planetperl'
      run: |
        git config --global --add safe.directory /__w/planetperl/planetperl
        GIT_STATUS=$(git status --porcelain)
        echo $GIT_STATUS
        git config user.name github-actions[bot]
        git config user.email 41898282+github-actions[bot]@users.noreply.github.com
        git add docs/
        if [ "$GIT_STATUS" != "" ]; then git commit -m "Automated Web page generation"; fi
        if [ "$GIT_STATUS" != "" ]; then git push; fi
    - name: Archive perlanet logs
      uses: actions/upload-artifact@v3
      with:
        name: perlanet.log
        path: ./perlanet.log
        retention-days: 3

    - name: Update pages artifact
      uses: actions/upload-pages-artifact@v1
      with:
        path: docs/

  deploy:
    needs: build
    permissions:
      pages: write
      id-token: write
    environment:
      name: github-pages
      url: ${\{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    steps:
    - name: Deploy to GitHub Pages
      id: deployment
      uses: actions/deploy-pages@v1
وارد حالت تمام صفحه شوید

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

بیت هایی که من اضافه کرده ام آخرین مرحله است build job (“به روز رسانی مصنوع صفحات”) و جدید deploy کار. تمام کدها عمدتاً از مستندات دو عملی که در بالا ذکر کردم کپی شده است.

با ایجاد این تغییرات در یکی از سایت‌های سیاره‌ام، روش استقرار را تغییر دادم و گردش کار را مجبور کردم اجرا شود. و از اینکه دیدم با موفقیت اجرا شد و نسخه جدید سایت به محض تغییر استقرار در URL زنده ظاهر شد بسیار خوشحال شدم.

این باعث خوشحالی من می شود زیرا احساس می کنم از استقرار صفحات GitHub به روشی که قرار است استفاده شود استفاده می کنم. من تمام سایت‌های سیاره‌ام را برای استفاده از این روش به‌روزرسانی کرده‌ام، اما چندین سایت دیگر دارم که باید در مقطعی به تغییر آن‌ها بپردازم.

مثل همیشه وقتی چیز جدیدی در مورد یک ویژگی GitHub می‌فهمم، چند پیشنهاد دیگر برای بهبود به من می‌دهد:

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

به هر حال، فکر کردم آنچه را که امروز کشف کرده بودم به اشتراک بگذارم. آیا شخص دیگری از این طریق وب سایت تولید می کند؟ چگونه آن را انجام دهید؟

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

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

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

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