GitHub harakatlari statik generator va GitHub sahifalarida sayt uchun CI/CD sifatida

GitHub harakatlari statik generator va GitHub sahifalarida sayt uchun CI/CD sifatida

Xabrni biroz o'rganib chiqib, GitHub-ning (beta) xususiyati - Harakatlar mavzusida juda kam maqolalar nashr etilganiga hayron bo'ldim.

Ko'rinib turibdiki, bunday past baho funksionallik "beta" bo'lsa ham hali ham sinovdan o'tkazilayotgani bilan izohlanishi mumkin. Ammo bu beta-versiyasining foydali xususiyati bo'lib, bu vositadan shaxsiy omborlarda foydalanish imkonini beradi. Ushbu texnologiya bilan ishlash haqida men ushbu maqolada gaplashaman.

Tarixdan oldingi

Agar biz tartib bilan boshlasak, shuni ta'kidlash kerakki, shaxsiy "Men haqimda" veb-saytini saqlashning tez, qulay, oson va bepul variantini izlash jarayonida men bir necha tunni o'tkazib, ko'plab maqolalarni tarashga majbur bo'ldim.

Ba'zi odamlar xostingni, boshqalari bulutli serverni va bularning barchasi uchun ish, o'zaro ta'sir va to'lovni tushunishni istamaydiganlar statik saytlarni omborga yuklashni yoqtirishadi, chunki endi buni GitHub va GitLabda ham qilish mumkin.

Albatta, bu har kimning shaxsiy tanlovi.

Mening oxirgi tanlovim GitHub Pages edi.

Sahifalar haqida

Kim bilmaydi gh-pages - bu veb-sayt shaklida hujjatlarni saqlash variantidir va u bepul taqdim etiladi va hujjatlardan tashqari, shaxsiy veb-saytlarni ham saqlash taklif etiladi. Bu funksiya GitHub tomonidan barcha foydalanuvchilarga taqdim etiladi va ombor sozlamalarida mavjud.

Loyiha ombori filialdan foydalanadi gh-pages, foydalanuvchi sayti uchun - nomi bilan alohida ombor username.github.io sayt manbalari bilan master filiali.

Batafsil ma'lumotlarni ko'rishingiz mumkin hujjatlarda, lekin shuni ta'kidlashim kerakki, GitHub hayratlanarli darajada saxiydir, har kimga fayl qo'shish orqali o'z domenini bunday saytga bog'lash imkonini beradi. CNAME domen nomi bilan va GitHub serverlarida domen provayderingizning DNS-ni sozlash.

Ishonchim komilki, bunday saytni qanday rivojlantirish bo'yicha ko'plab maqolalar mavjud, shuning uchun men bundan keyin gaplashmoqchi emasman.

Muammo paydo bo'lishi

Muammo shundaki, statik generatordan foydalanganda sahifalarni yaratish va ularni omborga yuklash jarayonini soddalashtirish uchun qo'shimcha skriptlar yozish va kutubxonalardan foydalanish zarurati paydo bo'ldi. Oddiy qilib aytganda, agar siz manbalarni alohida shaxsiy omborda saqlasangiz, har safar saytda biron bir o'zgarish yuz berganda, statik sahifalarni keyingi yaratish va asosiy sayt omborida nashr qilish uchun mahalliy muhitni o'rnatish kerak edi.

Mo'l-ko'lchilik bor statik generatorlar va ularning barchasi bir xil muammoga ega. Ushbu harakatlar juda ko'p vaqt va kuch talab qiladi va natijada saytdagi ishni sekinlashtiradi, ayniqsa OS dan OS ga bir necha marta o'tish yoki qattiq disklarda ma'lumotlar yo'qolishi bilan bog'liq hodisalardan keyin (mening ishimda shunday bo'lgan).

Yaqinda veb-saytdagi qalqib chiquvchi bildirishnomada yoki GitHub axborot byulletenida yangi qurilgan CI/CD e'tiborga olindi, bu esa ushbu harakatlarni minimal kuch bilan bajarishga imkon berdi.

Statik sahifa generatorlari haqida

Men ushbu kichik bandga alohida e'tibor bermayman, lekin men quyidagilarni tanlash va ishlatish paytida kelgan bir nechta tezislar bilan o'rtoqlashaman:

1) dasturlash tilingizga mos keladigan yoki iloji boricha tushunarli generatorni tanlang. Men bu fikrga o'zim saytning ishlashi uchun ba'zi funktsiyalarni qo'shishim, uning barqarorligi va avtomatizatsiyasi uchun qo'ltiq tayoqchalarini qo'shishim kerak bo'lgan paytda keldim. Bundan tashqari, bu plaginlar shaklida qo'shimcha funktsiyalarni o'zingiz yozish uchun yaxshi sababdir;

2) qaysi generatorni tanlash shaxsiy tanlovdir, lekin GitHub Pages funksionalligi ishiga dastlabki kirish uchun avvalo o'rnatish kerakligini hisobga olish kerak. Jekyll. Yaxshiyamki, bu sizga to'g'ridan-to'g'ri ombordagi manbalardan veb-sayt yaratish imkonini beradi (Men buni o'z tanlovim bilan takrorlayman).

Jeneratorni tanlashim birinchi nuqtaga asoslanadi. pelikan Pythonda yozilgan bu men uchun begona bo'lgan Jekyll o'rnini osongina egalladi (deyarli bir yil foydalandim). Natijada, hatto maqolalar yaratish va tahrirlash va veb-saytda ishlash men uchun qiziqarli bo'lgan tilda qo'shimcha tajriba beradi.

__

Muammoni shakllantirish

Asosiy vazifa shaxsiy ombordan statik sahifalarni avtomatik ravishda yaratadigan skriptni (aslida konfiguratsiya fayli) yozish bo'ladi. Yechim virtual muhitning funksionalligini o'z ichiga oladi. Skriptning o'zi tayyor sahifalarni umumiy omborga qo'shadi.

Yechim uchun vositalar

Muammoni hal qilish uchun biz foydalanadigan vositalar:

  • GitHub harakatlari;
  • Python3.7;
  • Pelikan;
  • Git;
  • GitHub sahifalari.

Muammolarni bartaraf etish

Shunday qilib, hujjatlar bilan bir oz tanishib, Actions uchun skriptlar qanday yozilishini tushungandan so'ng, ushbu mexanizm paydo bo'lgan muammoni to'liq hal qilishi aniq bo'ldi. Yozish paytida siz ushbu funksiyadan foydalanish uchun obuna bo'lishingiz kerak. beta sinovlari uchun!

GitHub harakatlari statik generator va GitHub sahifalarida sayt uchun CI/CD sifatida
Github tomonidan yangi funksionallikning tavsifi

Harakatlar skriptini yozish papkada nomli fayl yaratishdan boshlanadi .github va uning pastki papkasi workflows. Buni qo'lda yoki ombor sahifasidagi Harakatlar yorlig'idagi muharrir orqali amalga oshirish mumkin.

GitHub harakatlari statik generator va GitHub sahifalarida sayt uchun CI/CD sifatida
Bo'sh skript shakliga misol

Shakl haqida qisqacha izoh beraman

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.

Keling, shablon asosida o'zimizni yozamiz:

0) Siz "CI" nomini ham qoldirishingiz mumkin. Bu lazzat masalasi.

1) Keyinchalik, skriptni ishga tushiradigan harakat/triggerni tanlashingiz kerak, bizning holatlarimizda bu omborga yangi majburiyatning odatiy surishidir.

on:
  push

2) Shuningdek, biz misol sifatida skript ishga tushiriladigan tasvirni qoldiramiz, chunki Ubuntu kerakli funksionallikdan juda mamnun. Ga qarash mavjud vositalar Bu har qanday kerakli yoki oddiygina qulay tasvir (yoki unga asoslangan Docker konteyneri) bo'lishi mumkinligi ayon bo'ladi.

  build:
    runs-on: ubuntu-latest

3) Bosqichlarda biz birinchi navbatda asosiy ishga tayyorgarlik ko'rish uchun muhitni o'rnatamiz.

3.1) bizga kerak bo'lgan filialga o'ting (standart qadam checkout):

- uses: actions/checkout@v1

3.2) Python-ni o'rnating:

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

3.3) generatorimizning bog'liqliklarini o'rnating:

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

3.4) sayt sahifalari yaratiladigan katalog yarating:

   - name: Make output folder
      run: mkdir output

4) Saytdagi ish izchil bo'lishi uchun, ya'ni oldingi o'zgarishlarni o'chirmaslik va sayt omboriga ziddiyatlarsiz o'zgartirishlar qo'shish imkoniyatiga ega bo'lish uchun keyingi qadam har safar sayt omborini klonlash bo'ladi:

   - 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

Ushbu qadam tizim o'zgaruvchilarini chaqiradi:

  • o'zgaruvchan GITHUB_ACTOR GitHub o'zini o'rnatadi va bu foydalanuvchi nomi, uning aybi bilan ushbu skript ishga tushirilgan;
  • o'zgaruvchan secrets.ACCESS_TOKEN bu hosil bo'ladi Github-ni boshqarish uchun token, biz uni yorliqda o'rnatish orqali uni muhit o'zgaruvchisi sifatida o'tkazishimiz mumkin Secrets bizning ombor sozlamalarimiz. Esda tutingki, ishlab chiqarish jarayonida token bizga bir marta beriladi, bundan keyin unga kirish imkoni bo'lmaydi. Shuningdek, Secrets elementlarining qiymatlari.

5) Keling, sahifalarimizni yaratishga o'tamiz:

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

Jeneratörga uzatilgan parametrlar yaratilgan fayllar yuboriladigan katalog uchun javobgardir (-o output) va biz yaratish uchun foydalanadigan konfiguratsiya fayli (-s publishconf.py; Mahalliy konfiguratsiyani va nashr qilish uchun konfiguratsiyani ajratish yondashuvi haqida Pelican hujjatlarida o'qishingiz mumkin.).

Papkamizda nima borligini eslatib qo'yay output Sayt ombori allaqachon klonlangan.

6) git-ni o'rnatamiz va o'zgartirilgan fayllarimizni indekslaymiz:

    - 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

Ushbu nuqtada allaqachon ma'lum bo'lgan o'zgaruvchidan foydalaniladi va ushbu bosqichdagi buyruqlar ishga tushiriladigan ishchi katalog ko'rsatiladi. Ishchi katalogga o'tish buyrug'i boshqacha ko'rinadi - cd output.

7) Keling, majburiyat haqida xabar yarataylik, o'zgarishlarni bajaramiz va ularni omborga joylaymiz. Shunday qilib, majburiyat behuda emas va shuning uchun bashda xatolikka yo'l qo'ymaydi (chiqish natijasi emas 0) — avvalo, biror narsani majburlash va surish zarurligini tekshirib ko'raylik. Buning uchun biz buyruqdan foydalanamiz git diff-index --quiet --cached HEAD -- terminalga chiqadi 0 saytning oldingi versiyasiga nisbatan hech qanday o'zgarishlar bo'lmasa va 1 shunday o'zgarishlar mavjud. Keyin biz ushbu buyruqning natijasini qayta ishlaymiz. Shunday qilib, skriptning bajarilishi haqidagi ma'lumotlarda biz avtomatik ravishda ishlamay qolishi va skriptning buzilishi haqida bizga xabar yuborish o'rniga, ushbu bosqichda saytning holati haqida foydali ma'lumotlarni yozib olamiz.

Biz ushbu harakatlarni tayyor sahifalar bilan katalogimizda ham bajaramiz.

   - 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

natija

Natijada, bunday skript statik sahifalarni yaratish haqida o'ylamaslikka imkon beradi. Har qanday tizim ostidagi git bilan ishlash yoki GitHub veb-interfeysi orqali fayl yaratish orqali to'g'ridan-to'g'ri shaxsiy omborga o'zgarishlar kiritish orqali, Harakatlar hamma narsani o'zi bajaradi. Agar skript kutilmaganda ishlamay qolsa, elektron pochtangizga bildirishnoma yuboriladi.

To'liq kod

Men o'zimning ishchi versiyamni qoldiraman, unda oxirgi bosqichda majburiyat asosiy omborga yuborilganligi to'g'risida bildirishnoma yuboriladi.

Yuqorida tavsiflangan sirlardan foydalaniladi, bu erda bot tokeni va xabar yuborilishi kerak bo'lgan foydalanuvchi identifikatori qo'shiladi.

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

Skrinshotlar

GitHub harakatlari statik generator va GitHub sahifalarida sayt uchun CI/CD sifatida
Ishlashlardan birining natijasi manba omborining Harakatlar ko'rinishida ko'rsatiladi

GitHub harakatlari statik generator va GitHub sahifalarida sayt uchun CI/CD sifatida
Skript tugallangani haqida botdan xabar

Foydali havolalar

Harakatlarni tushunish
Amallar sintaksisi
Triggerlar ro'yxati
Virtual muhit uchun imkoniyatlar
Github sahifalari
Statik generatorlar ro'yxati

Manba: www.habr.com

a Izoh qo'shish