جامد جنریٹر سائٹ اور گٹ ہب صفحات کے لیے CI/CD کے بطور GitHub ایکشن

جامد جنریٹر سائٹ اور گٹ ہب صفحات کے لیے CI/CD کے بطور GitHub ایکشن

حبر کو تھوڑا سا گھورنے کے بعد، میں حیران رہ گیا کہ GitHub کی (بیٹا) فیچر - ایکشنز کے موضوع پر بہت کم مضامین شائع ہوئے ہیں۔

ایسا لگتا ہے کہ اس طرح کی چھوٹی چھوٹی باتوں کی وضاحت اس حقیقت سے کی جاسکتی ہے کہ "بیٹا" کے باوجود فعالیت ابھی بھی جانچ میں ہے۔ لیکن یہ بیٹا کی ایک مفید خصوصیت ہے جو اس ٹول کو پرائیویٹ ریپوزٹریز میں استعمال کرنے کی اجازت دیتی ہے۔ یہ اس ٹیکنالوجی کے ساتھ کام کرنے کے بارے میں ہے جس کے بارے میں میں اس مضمون میں بات کروں گا۔

قبل از تاریخ

اگر ہم ترتیب سے شروع کرتے ہیں، تو شاید یہ بات قابل ذکر ہے کہ ذاتی "میرے بارے میں" ویب سائٹ کو ذخیرہ کرنے کے لیے تیز، آسان، آسان اور مفت آپشن کی تلاش کے عمل میں، مجھے کئی راتیں گزارنی پڑیں اور بہت سے مضامین میں کنگھی کرنی پڑی۔

کچھ لوگ ہوسٹنگ کا انتخاب کرتے ہیں، دوسروں کو کلاؤڈ سرور، اور وہ لوگ جو اس سب کے لیے کام، تعامل اور ادائیگی کو سمجھنا نہیں چاہتے ہیں جیسے کہ سٹیٹک سائٹس کو کسی ذخیرہ میں اپ لوڈ کرنا، کیونکہ اب یہ GitHub اور GitLab دونوں پر کیا جا سکتا ہے۔

یقیناً یہ ہر ایک کا ذاتی انتخاب ہے۔

میرا آخری انتخاب گٹ ہب پیجز تھا۔

صفحات کے بارے میں

کون نہیں جانتا gh-pages - یہ ویب سائٹ کی شکل میں دستاویزات کو ذخیرہ کرنے کا ایک آپشن ہے اور یہ مفت فراہم کیا جاتا ہے، اور دستاویزات کے علاوہ، ذاتی ویب سائٹس کو ذخیرہ کرنے کی بھی تجویز ہے۔ یہ فعالیت GitHub کی طرف سے تمام صارفین کو فراہم کی گئی ہے اور ذخیرہ کی ترتیبات میں دستیاب ہے۔

پروجیکٹ ریپوزٹری ایک برانچ استعمال کرتی ہے۔ gh-pages، صارف کی سائٹ کے لیے - نام کے ساتھ ایک الگ ذخیرہ username.github.io سائٹ کے ذرائع کے ساتھ master شاخ

آپ مزید تفصیلات دیکھ سکتے ہیں۔ دستاویزات میں، لیکن مجھے صرف یہ نوٹ کرنے دو کہ GitHub حیرت انگیز طور پر فراخ دلی سے کسی کو بھی صرف ایک فائل شامل کرکے اپنے ڈومین کو ایسی سائٹ سے لنک کرنے کی اجازت دیتا ہے۔ CNAME ڈومین نام کے ساتھ اور GitHub سرورز پر اپنے ڈومین فراہم کنندہ کے DNS کو ترتیب دینا۔

مجھے یقین ہے کہ ایسی سائٹ کو کیسے تیار کیا جائے اس کے بارے میں یہاں بہت سے مضامین موجود ہیں، لہذا یہ وہ نہیں ہے جس کے بارے میں میں مزید بات کرنے جا رہا ہوں۔

ایک مسئلہ کی موجودگی

مسئلہ یہ تھا کہ جامد جنریٹر استعمال کرتے وقت، صفحات بنانے اور انہیں ذخیرہ میں لوڈ کرنے کے عمل کو آسان بنانے کے لیے اضافی اسکرپٹ لکھنے اور لائبریریوں کو استعمال کرنے کی ضرورت ہوتی ہے۔ بس، اگر آپ ذرائع کو ایک علیحدہ پرائیویٹ ریپوزٹری میں اسٹور کرتے ہیں، تو جب بھی سائٹ پر کوئی تبدیلی ہوتی ہے، تو یہ ضروری تھا کہ بعد میں آنے والے جامد صفحات اور اشاعت کی مرکزی سائٹ کے ذخیرے میں مقامی ماحول کو متعین کیا جائے۔

کثرت ہے۔ جامد جنریٹرز اور ان سب کا ایک ہی مسئلہ ہے۔ ان کارروائیوں میں بہت زیادہ وقت اور محنت لگتی ہے، اور بالآخر سائٹ پر کام کو سست کر دیتے ہیں، خاص طور پر OS سے OS پر کئی منتقلی کے بعد یا ہارڈ ڈرائیوز پر ڈیٹا ضائع ہونے کے واقعات کے بعد۔ (میرے معاملے میں ایسا ہی تھا).

ابھی حال ہی میں، یا تو ویب سائٹ پر ایک پاپ اپ نوٹیفکیشن میں یا GitHub کے ایک نیوز لیٹر میں، ایک نئی تعمیر شدہ CI/CD نظر آئی، جس نے ان کارروائیوں کو کم سے کم کوشش کے ساتھ انجام دینے کی اجازت دی۔

جامد صفحہ جنریٹرز کے بارے میں

میں اس ذیلی آئٹم پر خصوصی توجہ نہیں دوں گا، لیکن میں چند مقالوں کا اشتراک کروں گا جو درج ذیل کے انتخاب اور استعمال کے دوران میرے پاس آئے تھے۔

1) ایسے جنریٹر کا انتخاب کریں جو آپ کی پروگرامنگ لینگویج کے مطابق ہو، یا ایسا جو جتنا ممکن ہو واضح ہو۔ مجھے یہ خیال ایک ایسے وقت میں آیا جب مجھے خود سائٹ کے کام کرنے کے لیے کچھ فعالیت شامل کرنی پڑی، اس کے زیادہ استحکام اور آٹومیشن کے لیے بیساکھیوں کو شامل کرنا پڑا۔ اس کے علاوہ، پلگ ان کی شکل میں اضافی فعالیت خود لکھنے کی یہ ایک اچھی وجہ ہے۔

2) کون سا جنریٹر منتخب کرنا ہے یہ ایک ذاتی انتخاب ہے، لیکن یہ بات قابل غور ہے کہ GitHub Pages کی فعالیت کے کام میں ابتدائی ڈوبنے کے لیے، آپ کو پہلے انسٹال کرنا ہوگا۔ Jekyll کی. خوش قسمتی سے، یہ آپ کو براہ راست ذخیرہ میں موجود ذرائع سے ویب سائٹ بنانے کی اجازت دیتا ہے۔ (میں اسے اپنی پسند کے ساتھ دہراؤں گا).

میرا جنریٹر کا انتخاب پہلے نقطہ پر مبنی ہے۔ ہواسیل جو کہ Python میں لکھا گیا ہے آسانی سے Jekyll کی جگہ لے لیا، جو کہ میرے لیے غیر ملکی ہے۔ (تقریباً ایک سال تک استعمال کیا). نتیجے کے طور پر، مضامین بنانا اور ان میں ترمیم کرنا اور ویب سائٹ پر کام کرنا بھی اس زبان میں اضافی تجربہ فراہم کرتا ہے جو میرے لیے دلچسپ ہے۔

__

مسئلہ کی تشکیل

بنیادی کام ایک اسکرپٹ (دراصل ایک کنفیگریشن فائل) لکھنا ہوگا جو خود بخود ایک نجی ذخیرہ سے جامد صفحات تیار کرے گا۔ حل میں ورچوئل ماحول کی فعالیت شامل ہوگی۔ اسکرپٹ خود عوامی ذخیرہ میں ریڈی میڈ صفحات کا اضافہ کرے گا۔

حل کے اوزار

وہ اوزار جو ہم مسئلہ کو حل کرنے کے لیے استعمال کریں گے:

  • GitHub ایکشنز؛
  • ازگر 3.7;
  • پیلیکن
  • گٹ؛
  • GitHub صفحات۔

حل

لہذا، دستاویزات سے تھوڑا سا واقف ہونے اور یہ سمجھنے کے بعد کہ اعمال کے لیے اسکرپٹ کیسے لکھے جاتے ہیں، یہ واضح ہو گیا کہ یہ طریقہ کار اس مسئلے کو مکمل طور پر حل کر دے گا جو پیدا ہوا ہے۔ لکھنے کے وقت، آپ کو اس فعالیت کو استعمال کرنے کے لیے سبسکرائب کرنا ہوگا۔ بیٹا ٹیسٹنگ کے لیے!

جامد جنریٹر سائٹ اور گٹ ہب صفحات کے لیے CI/CD کے بطور GitHub ایکشن
خود گیتوب کے ذریعہ نئی فعالیت کی تفصیل

ایکشن اسکرپٹ لکھنا ایک فولڈر میں ایک نامزد فائل بنانے سے شروع ہوتا ہے۔ .github اور اس کا ذیلی فولڈر workflows. یہ یا تو دستی طور پر یا مخزن کے صفحہ پر ایکشن ٹیب میں ایڈیٹر سے کیا جا سکتا ہے۔

جامد جنریٹر سائٹ اور گٹ ہب صفحات کے لیے 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) اس کے بعد، آپ کو ایکشن/ٹرگر کو منتخب کرنے کی ضرورت ہے جو اسکرپٹ کو لانچ کرے گا، ہمارے معاملے میں یہ ریپوزٹری کے لیے ایک نئی کمٹ کا معمول ہے۔

on:
  push

2) ہم اس تصویر کو بھی چھوڑ دیں گے جس کی بنیاد پر اسکرپٹ کو ایک مثال کے طور پر لانچ کیا جائے گا، کیونکہ Ubuntu ضروری فعالیت سے کافی مطمئن ہے۔ کی طرف دیکھ دستیاب اوزار یہ واضح ہو جاتا ہے کہ یہ کوئی بھی ضروری یا آسان تصویر ہو سکتی ہے (یا اس پر مبنی ڈوکر کنٹینر)۔

  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 ہمارے ذخیرے کی ترتیبات۔ براہ کرم نوٹ کریں کہ نسل کے دوران ٹوکن ہمیں ایک بار فراہم کیا جائے گا، اس تک مزید رسائی نہیں ہوگی۔ نیز راز کی اشیاء کی قدریں۔

5) آئیے اپنے صفحات بنانے کی طرف بڑھتے ہیں:

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

جنریٹر کو بھیجے گئے پیرامیٹرز اس ڈائریکٹری کے ذمہ دار ہیں جہاں تیار کردہ فائلیں بھیجی جائیں گی (-o output) اور کنفیگریشن فائل جسے ہم بنانے کے لیے استعمال کرتے ہیں (-s publishconf.py; آپ پیلیکن دستاویزات میں مقامی ترتیب اور اشاعت کے لیے ترتیب کو الگ کرنے کے طریقہ کار کے بارے میں پڑھ سکتے ہیں۔).

میں آپ کو یاد دلاتا ہوں کہ ہمارے فولڈر میں کیا ہے۔ output سائٹ کا ذخیرہ پہلے ہی کلون کیا جا چکا ہے۔

6) آئیے گٹ ترتیب دیں اور اپنی تبدیل شدہ فائلوں کو انڈیکس کریں:

    - 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) آئیے ایک کمٹ میسیج بنائیں، تبدیلیاں کریں اور انہیں ریپوزٹری میں دھکیلیں۔ تاکہ کمٹ بیکار نہ ہو اور اس وجہ سے 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

نتیجہ

نتیجے کے طور پر، ایسی اسکرپٹ آپ کو جامد صفحات بنانے کے بارے میں سوچنے کی اجازت نہیں دیتی ہے۔ کسی پرائیویٹ ریپوزٹری میں براہ راست تبدیلیاں شامل کر کے، چاہے کسی بھی سسٹم کے تحت گٹ کے ساتھ کام کر کے یا GitHub ویب انٹرفیس کے ذریعے فائل بنا کر، ایکشنز خود سب کچھ کریں گے۔ اگر اسکرپٹ غیر متوقع طور پر کریش ہو جاتا ہے، تو آپ کے ای میل پر ایک اطلاع بھیجی جائے گی۔

مکمل کوڈ

میں اپنا ورکنگ ورژن چھوڑ دوں گا، جس میں آخری مرحلہ ایک نوٹیفکیشن بھیجتا ہے کہ ایک کمٹ کو مرکزی ذخیرے میں دھکیل دیا گیا ہے۔

اوپر بیان کردہ راز استعمال کیے جاتے ہیں، جہاں بوٹ ٹوکن اور صارف کی شناخت شامل کی جاتی ہے جسے پیغام بھیجنے کی ضرورت ہوتی ہے۔

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

سکرینشاٹ

جامد جنریٹر سائٹ اور گٹ ہب صفحات کے لیے CI/CD کے بطور GitHub ایکشن
سورس ریپوزٹری کے ایکشن ٹیب میں دکھائے جانے والے رن میں سے ایک کا نتیجہ

جامد جنریٹر سائٹ اور گٹ ہب صفحات کے لیے CI/CD کے بطور GitHub ایکشن
اسکرپٹ کی تکمیل کے بارے میں بوٹ سے پیغام

کارآمد ویب سائٹس

اعمال کو سمجھنا
اعمال کا نحو
محرکات کی فہرست
مجازی ماحول کے لیے اختیارات
گیتھب پیجز
جامد جنریٹر کی فہرست

ماخذ: www.habr.com

نیا تبصرہ شامل کریں