اقدامات GitHub به عنوان CI/CD برای یک سایت در یک ژنراتور استاتیک و صفحات GitHub

اقدامات GitHub به عنوان CI/CD برای یک سایت در یک ژنراتور استاتیک و صفحات GitHub

با کمی جست و جوی Habr، از اینکه مقالات بسیار کمی در مورد ویژگی GitHub (بتا) - Actions منتشر شده است، متعجب شدم.

به نظر می رسد که چنین کم بیانی را می توان با این واقعیت توضیح داد که عملکرد هنوز در حال آزمایش است، البته "بتا". اما این یک ویژگی مفید نسخه بتا است که به این ابزار اجازه می دهد تا در مخازن خصوصی استفاده شود. در مورد کار با این فناوری است که در این مقاله در مورد آن صحبت خواهم کرد.

تاریخ انقضا

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

برخی از افراد میزبانی را انتخاب می کنند، برخی دیگر سرور ابری را انتخاب می کنند، و کسانی که نمی خواهند کار، تعامل و پرداخت را برای همه اینها درک کنند، مانند آپلود سایت های ثابت در یک مخزن، زیرا اکنون این کار را می توان در GitHub و GitLab انجام داد.

البته این انتخاب شخصی هر کسی است.

انتخاب نهایی من GitHub Pages بود.

درباره صفحات

که آگاه نیست gh-pages - این گزینه برای ذخیره اسناد در قالب وب سایت است و به صورت رایگان ارائه می شود و علاوه بر مستندات، ذخیره وب سایت های شخصی نیز پیشنهاد می شود. این قابلیت توسط GitHub برای همه کاربران ارائه شده است و در تنظیمات مخزن در دسترس است.

مخزن پروژه از یک شاخه استفاده می کند gh-pages، برای یک سایت کاربر - یک مخزن جداگانه با نام username.github.io با منابع سایت در master شاخه.

می توانید جزئیات بیشتری را مشاهده کنید در مستندات، اما اجازه دهید فقط توجه داشته باشم که GitHub به طور شگفت انگیزی سخاوتمندانه است که به هر کسی اجازه می دهد دامنه خود را با اضافه کردن یک فایل به چنین سایتی پیوند دهد. CNAME با نام دامنه و تنظیم DNS ارائه دهنده دامنه خود در سرورهای GitHub.

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

مشکل بوجود آمده

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

فراوانی وجود دارد ژنراتورهای ساکن و همه آنها همین مشکل را دارند. این اقدامات زمان و تلاش زیادی را می طلبد و در نهایت باعث کاهش سرعت کار در سایت می شود، به خصوص پس از چندین بار مهاجرت از سیستم عامل به سیستم عامل یا حوادثی با از دست دادن اطلاعات در هارد دیسک (در مورد من اینطور بود).

اخیراً، یا در یک اعلان پاپ آپ در وب سایت یا در یک خبرنامه از GitHub، یک CI/CD جدید ساخته شده است که انجام این اقدامات را با حداقل تلاش ممکن می کند.

درباره ژنراتورهای صفحه استاتیک

من توجه خاصی به این مورد فرعی نخواهم داشت، اما یکی از پایان نامه هایی که در هنگام انتخاب و استفاده از موارد زیر به آنها رسیدم را به اشتراک می گذارم:

1) ژنراتوری را انتخاب کنید که مناسب زبان برنامه نویسی شما باشد یا تا حد امکان واضح باشد. زمانی به این ایده رسیدم که خودم مجبور بودم برای کارکرد سایت، عصاهایی برای ثبات و اتوماسیون بیشتر آن اضافه کنم. علاوه بر این، این دلیل خوبی برای نوشتن قابلیت های اضافی در قالب افزونه ها است.

2) اینکه کدام ژنراتور را انتخاب کنید یک انتخاب شخصی است، اما شایان ذکر است که برای غوطه ور شدن اولیه در کار عملکرد GitHub Pages، ابتدا باید نصب کنید جکیل. خوشبختانه، به شما امکان می دهد یک وب سایت را از منابع مستقیماً در مخزن ایجاد کنید (این را با انتخاب خود تکرار می کنم).

انتخاب ژنراتور من بر اساس اولین نکته است. مرغ ماهیخوار که به زبان پایتون نوشته شده به راحتی جایگزین جکیل شد که برای من بیگانه است (تقریبا یک سال استفاده کردم). در نتیجه، حتی ایجاد و ویرایش مقالات و کار بر روی یک وب سایت، تجربه بیشتری به زبانی که برای من جالب است، می دهد.

__

بیانیه مشکل

وظیفه اصلی نوشتن یک اسکریپت (در واقع یک فایل پیکربندی) است که به طور خودکار صفحات استاتیک را از یک مخزن خصوصی تولید کند. راه حل شامل عملکرد یک محیط مجازی است. خود اسکریپت صفحات آماده را به مخزن عمومی اضافه می کند.

ابزارهایی برای راه حل

ابزارهایی که برای حل مشکل استفاده خواهیم کرد:

  • اقدامات GitHub;
  • پایتون 3.7;
  • پلیکان;
  • Git;
  • صفحات GitHub.

راه حل

بنابراین، پس از آشنایی کمی با مستندات و درک نحوه نگارش اسکریپت های Actions، مشخص شد که این مکانیسم مشکل پیش آمده را به طور کامل حل می کند. در زمان نوشتن، برای استفاده از این قابلیت باید مشترک شوید. برای تست بتا!

اقدامات GitHub به عنوان CI/CD برای یک سایت در یک ژنراتور استاتیک و صفحات GitHub
شرح عملکرد جدید توسط خود Github

نوشتن یک اسکریپت Actions با ایجاد یک فایل با نام در یک پوشه آغاز می شود .github و زیر پوشه آن workflows. این کار را می توان به صورت دستی یا از ویرایشگر در تب Actions در صفحه مخزن انجام داد.

اقدامات GitHub به عنوان CI/CD برای یک سایت در یک ژنراتور استاتیک و صفحات GitHub
نمونه ای از فرم اسکریپت خالی

من به طور خلاصه در مورد فرم نظر خواهم داد

name: CI    # название скрипта: будет отображаться во вкладке Actions

on: [push]  # действие, по которому запускается данный скрипт

jobs:       # роботы, которые будут выполняться
  build:    # сборка, которая..

    runs-on: ubuntu-latest      # ..будет запущена на основе этого образа

    steps:              # шаги которые будут проделаны после запуска образа
    - uses: actions/checkout@v1     # переход в самую актуальную ветку
    - name: Run a one-line script   # имя работы номер 1
      run: echo Hello, world!       # суть работы номер 1 (bash-команда записана в одну строку)
    - name: Run a multi-line script   # имя работы номер 2
      run: |                    # суть работы номер 2 (многострочная)
        echo Add other actions to build,
        echo test, and deploy your project.

بیایید خودمان را بر اساس الگو بنویسیم:

0) شما همچنین می توانید نام "CI" را بگذارید. این یک موضوع سلیقه ای است.

1) در مرحله بعد، باید اکشن/تریگر را انتخاب کنید که اسکریپت را راه اندازی می کند، در مورد ما این فشار معمول یک commit جدید به مخزن است.

on:
  push

2) همچنین تصویری را که بر اساس آن اسکریپت راه اندازی می شود را به عنوان مثال می گذاریم، زیرا اوبونتو از عملکرد لازم کاملا راضی است. نگاه كردن ابزارهای موجود مشخص می شود که این می تواند هر تصویر ضروری یا ساده (یا یک ظرف داکر بر اساس آن) باشد.

  build:
    runs-on: ubuntu-latest

3) در مراحل ابتدا محیطی را برای آماده شدن برای کار اصلی تنظیم می کنیم.

3.1) به شعبه مورد نیاز خود بروید (گام استاندارد checkout):

- uses: actions/checkout@v1

3.2) پایتون را نصب کنید:

    - name: Set up Python
      uses: actions/setup-python@v1
      with:
        python-version: 3.7

3.3) وابستگی های مولد ما را نصب کنید:

    - name: Install dependencies
      run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

3.4) یک دایرکتوری ایجاد کنید که در آن صفحات سایت تولید شوند:

   - name: Make output folder
      run: mkdir output

4) برای اینکه کار روی سایت منسجم باشد، یعنی تغییرات قبلی حذف نشود و بتوان تغییرات را بدون درگیری به مخزن سایت اضافه کرد، مرحله بعدی هر بار کلون کردن مخزن سایت خواهد بود:

   - name: Clone master branch
      run: git clone "https://${{ secrets.ACCESS_TOKEN }}@github.com/${GITHUB_ACTOR}/${GITHUB_ACTOR}.github.io.git" --branch master --single-branch ./output

این مرحله متغیرهای سیستم را فراخوانی می کند:

  • متغیر GITHUB_ACTOR GitHub خود را نصب می کند و این نام کاربری است که این اسکریپت به اشتباه او راه اندازی شده است.
  • متغیر secrets.ACCESS_TOKEN این تولید می شود توکن برای مدیریت Github، می توانیم آن را به عنوان یک متغیر محیطی با تنظیم آن در تب ارسال کنیم Secrets تنظیمات مخزن ما لطفاً توجه داشته باشید که در طول تولید توکن یک بار در اختیار ما قرار می گیرد و دیگر دسترسی به آن وجود نخواهد داشت. و همچنین مقادیر آیتم های Secrets.

5) بیایید به تولید صفحات خود ادامه دهیم:

   - name: Generate static pages
      run: pelican content -o output -s publishconf.py

پارامترهای ارسال شده به ژنراتور مسئول دایرکتوری هستند که فایل های تولید شده در آن ارسال می شوند (-o output) و فایل پیکربندی که برای تولید استفاده می کنیم (-s publishconf.py; می توانید در مورد رویکرد جداسازی پیکربندی محلی و پیکربندی برای انتشار در اسناد پلیکان بخوانید.).

بگذارید به شما یادآوری کنم که در پوشه ما چیست output مخزن سایت قبلاً شبیه سازی شده است.

6) بیایید git را تنظیم کنیم و فایل های تغییر یافته خود را ایندکس کنیم:

    - name: Set git config and add changes
      run: |
          git config --global user.email "${GITHUB_ACTOR}@https://users.noreply.github.com/"
          git config --global user.name "${GITHUB_ACTOR}"
          git add --all
      working-directory: ./output

در این مرحله، یک متغیر از قبل شناخته شده استفاده می شود و دایرکتوری کاری نشان داده می شود که در آن دستورات این مرحله راه اندازی می شوند. در غیر این صورت دستور برای رفتن به دایرکتوری کاری شبیه به - cd output.

7) بیایید یک پیام commit ایجاد کنیم، تغییرات را انجام دهیم و آنها را به مخزن فشار دهیم. به طوری که commit بیهوده نباشد و در نتیجه خطا در bash ایجاد نشود (نتیجه خروجی نیست 0) - ابتدا بررسی کنیم که آیا اصلاً لازم است چیزی را متعهد و فشار دهیم. برای این کار از دستور استفاده می کنیم git diff-index --quiet --cached HEAD -- که به ترمینال خروجی خواهد داد 0 در صورت عدم تغییر نسبت به نسخه قبلی سایت و 1 چنین تغییراتی وجود دارد. سپس نتیجه این دستور را پردازش می کنیم. بدین ترتیب در اطلاعات مربوط به اجرای اسکریپت به جای اینکه به صورت خودکار از کار بیفتد و گزارشی در مورد خرابی اسکریپت برای ما ارسال کنیم، اطلاعات مفیدی از وضعیت سایت در این مرحله ثبت می کنیم.

ما همچنین این اقدامات را در فهرست خود با صفحات آماده انجام می دهیم.

   - name: Push and send notification
      run: |
          COMMIT_MESSAGE="Update pages on $(date +'%Y-%m-%d %H:%M:%S')"
          git diff-index --quiet --cached HEAD -- && echo "No changes!" && exit 0 || echo $COMMIT_MESSAGE
          # Only if repo have changes
          git commit -m "${COMMIT_MESSAGE}"
          git push https://${{ secrets.ACCESS_TOKEN }}@github.com/${GITHUB_ACTOR}/${GITHUB_ACTOR}.github.io.git master
      working-directory: ./output

نتیجه

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

کد کامل

من نسخه کاری خود را ترک می کنم، که در آن مرحله آخر ارسال یک اعلان مبنی بر ارسال یک commit به مخزن اصلی را اضافه می کند.

اسرار توصیف شده در بالا استفاده می شود، جایی که توکن ربات و شناسه کاربری که پیام باید به آن ارسال شود اضافه می شود.

name: Push content to the user's GitHub pages repository

on:
  push

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - name: Set up Python
      uses: actions/setup-python@v1
      with:
        python-version: 3.7
    - name: Install dependencies
      run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt
    - name: Make output folder
      run: mkdir output
    - name: Clone master branch
      run: git clone "https://${{ secrets.ACCESS_TOKEN }}@github.com/${GITHUB_ACTOR}/${GITHUB_ACTOR}.github.io.git" --branch master --single-branch ./output
    - name: Generate static pages
      run: pelican content -o output -s publishconf.py
    - name: Set git config and add changes
      run: |
          git config --global user.email "${GITHUB_ACTOR}@https://users.noreply.github.com/"
          git config --global user.name "${GITHUB_ACTOR}"
          git add --all
      working-directory: ./output
    - name: Push and send notification
      run: |
          COMMIT_MESSAGE="Update pages on $(date +'%Y-%m-%d %H:%M:%S')"
          git diff-index --quiet --cached HEAD -- && echo "No changes!" && exit 0 || echo $COMMIT_MESSAGE
          git commit -m "${COMMIT_MESSAGE}"
          git push https://${{ secrets.ACCESS_TOKEN }}@github.com/${GITHUB_ACTOR}/${GITHUB_ACTOR}.github.io.git master
          curl "https://api.telegram.org/bot${{ secrets.BOT_TOKEN }}/sendMessage?text=$COMMIT_MESSAGE %0ALook at ${GITHUB_ACTOR}.github.io %0ARepository%3A github.com/${GITHUB_ACTOR}/${GITHUB_ACTOR}.github.io&chat_id=${{ secrets.ADMIN_ID }}"
      working-directory: ./output

تصاویر

اقدامات GitHub به عنوان CI/CD برای یک سایت در یک ژنراتور استاتیک و صفحات GitHub
نتیجه یکی از اجراها در تب Actions مخزن منبع نمایش داده می شود

اقدامات GitHub به عنوان CI/CD برای یک سایت در یک ژنراتور استاتیک و صفحات GitHub
پیام ربات در مورد تکمیل اسکریپت

لینک های مفید

درک اقدامات
نحو اعمال
لیست محرک ها
گزینه هایی برای محیط های مجازی
صفحات Github
لیست ژنراتور استاتیک

منبع: www.habr.com

اضافه کردن نظر