Statik Generator Saytı və GitHub Səhifələri üçün CI/CD kimi GitHub Fəaliyyətləri

Statik Generator Saytı və GitHub Səhifələri üçün CI/CD kimi GitHub Fəaliyyətləri

Habrı bir az araşdırdıqdan sonra GitHub-un (beta) xüsusiyyəti - Fəaliyyətlər mövzusunda çox az məqalənin dərc edilməsinə təəccübləndim.

Belə görünür ki, bu cür aşağı ifadə funksionallığın "beta" olsa da, hələ də sınaqda olması ilə izah edilə bilər. Lakin bu, beta-nın faydalı xüsusiyyətidir ki, bu alət şəxsi depolarda istifadə etməyə imkan verir. Bu yazıda bu texnologiya ilə işləmək haqqında danışacağam.

Prehistorya

Əgər ardıcıllıqla başlasaq, yəqin ki, qeyd etmək yerinə düşərdi ki, şəxsi “Haqqımda” veb-saytını saxlamaq üçün sürətli, rahat, asan və pulsuz seçim axtarışında bir neçə gecə keçirməli və bir çox məqalələri araşdırmalı oldum.

Bəzi insanlar hostinqi, digərləri bulud serverini və bütün bunlar üçün işi, qarşılıqlı əlaqəni və ödənişi başa düşmək istəməyənlər statik saytları repozitoriyaya yükləmək kimi seçirlər, çünki indi bunu həm GitHub, həm də GitLab-da etmək olar.

Təbii ki, bu, hər kəsin şəxsi seçimidir.

Son seçimim GitHub Səhifələri oldu.

Səhifələr haqqında

Kim bilmir gh-pages - bu, veb-sayt şəklində sənədlərin saxlanması üçün bir seçimdir və pulsuz təmin edilir və sənədlərlə yanaşı, şəxsi veb-saytların saxlanması da təklif olunur. Bu funksionallıq GitHub tərəfindən bütün istifadəçilərə təqdim edilir və depo parametrlərində mövcuddur.

Layihə deposu filialdan istifadə edir gh-pages, istifadəçi saytı üçün - adı ilə ayrıca depo username.github.io sayt mənbələri ilə master filialı.

Daha ətraflı baxa bilərsiniz sənədlərdə, ancaq qeyd edim ki, GitHub hər kəsə sadəcə bir fayl əlavə etməklə öz domenini belə bir saytla əlaqələndirməyə imkan verməkdə təəccüblü dərəcədə səxavətlidir. CNAME domen adı ilə və GitHub serverlərində domen provayderinizin DNS-ni quraşdırın.

Əminəm ki, burada belə bir saytın necə inkişaf etdirilməsi ilə bağlı çoxlu məqalələr var, ona görə də bundan sonra danışacağım şey bu deyil.

Yaranan problem

Problem onda idi ki, statik generatordan istifadə edərkən səhifələrin yaradılması və onların depoya yüklənməsi prosesini sadələşdirmək üçün əlavə skriptlər yazmağa və kitabxanalardan istifadə etməyə ehtiyac var. Sadəcə olaraq, əgər siz mənbələri ayrıca şəxsi repozitoriyada saxlayırsınızsa, onda hər dəfə saytda hər hansı dəyişiklik baş verəndə, statik səhifələrin sonrakı nəsli üçün yerli mühiti yerləşdirmək və əsas sayt repozitoriyasında dərc etmək lazım gəlirdi.

Bolluq var statik generatorlar və hamısında eyni problem var. Bu hərəkətlər çox vaxt və səy tələb edir və nəticədə saytdakı işi ləngidir, xüsusən də ƏS-dən ƏS-ə bir neçə miqrasiyadan və ya sabit disklərdə məlumat itkisi ilə bağlı insidentlərdən sonra (mənim vəziyyətimdə belə idi).

Bu yaxınlarda, ya veb saytdakı pop-up bildirişində, ya da GitHub-dan bir bülletendə, bu hərəkətləri minimum səylə həyata keçirməyə imkan verən yeni qurulmuş bir CI/CD qeyd edildi.

Statik səhifə generatorları haqqında

Bu yarımbəndə xüsusi diqqət yetirməyəcəyəm, lakin aşağıdakıların seçilməsi və istifadəsi zamanı gəldiyim bir neçə tezisi paylaşacağam:

1) proqramlaşdırma dilinizə uyğun olan və ya mümkün qədər aydın olan generator seçin. Mən bu fikrə o vaxt gəldim ki, mən özüm saytın işləməsi üçün bəzi funksionallıqlar əlavə etməli, onun daha sabitliyi və avtomatlaşdırılması üçün qoltuqağacı əlavə etməli oldum. Bundan əlavə, bu, plaginlər şəklində əlavə funksionallıq yazmaq üçün yaxşı bir səbəbdir;

2) hansı generatoru seçmək şəxsi seçimdir, lakin nəzərə almaq lazımdır ki, GitHub Səhifələr funksionallığının işinə ilkin daxil olmaq üçün əvvəlcə quraşdırmalısınız. Jekyll. Xoşbəxtlikdən, o, birbaşa depodakı mənbələrdən veb sayt yaratmağa imkan verir (Bunu seçimimlə təkrarlayacağam).

Generator seçimim birinci nöqtəyə əsaslanır. qutan Pythonda yazılan, mənə yad olan Jekyll-i asanlıqla əvəz etdi (bir ilə yaxın istifadə olunur). Nəticədə, hətta məqalələr yaratmaq və redaktə etmək və vebsaytda işləmək mənim üçün maraqlı olan dildə əlavə təcrübə verir.

__

Problem problemi

Əsas vəzifə şəxsi depodan avtomatik olaraq statik səhifələr yaradan skript (əslində konfiqurasiya faylı) yazmaq olacaq. Həll virtual mühitin funksionallığını əhatə edəcək. Skript özü ictimai depoya hazır səhifələr əlavə edəcəkdir.

Həll üçün alətlər

Problemi həll etmək üçün istifadə edəcəyimiz vasitələr:

  • GitHub Fəaliyyətləri;
  • Python3.7;
  • qutan;
  • Git;
  • GitHub Səhifələri.

Həlli

Beləliklə, sənədlərlə bir az tanış olduqdan və Actions üçün skriptlərin necə yazıldığını başa düşdükdən sonra məlum oldu ki, bu mexanizm yaranmış problemi tamamilə həll edəcək. Yazı zamanı bu funksiyadan istifadə etmək üçün abunə olmalısınız. beta testi üçün!

Statik Generator Saytı və GitHub Səhifələri üçün CI/CD kimi GitHub Fəaliyyətləri
Github özü tərəfindən yeni funksionallığın təsviri

Fəaliyyət skriptinin yazılması qovluqda adlandırılmış fayl yaratmaqla başlayır .github və onun alt qovluğu workflows. Bu, ya əl ilə, ya da repozitor səhifəsindəki Fəaliyyətlər sekmesindəki redaktordan edilə bilər.

Statik Generator Saytı və GitHub Səhifələri üçün CI/CD kimi GitHub Fəaliyyətləri
Boş skript formasının nümunəsi

Formaya qısa şərh verəcəyəm

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.

Şablon əsasında özümüzü yazaq:

0) Siz həmçinin “CI” adını tərk edə bilərsiniz. Bu dad məsələsidir.

1) Sonra, skripti işə salacaq hərəkəti/tetikleyicini seçməlisiniz, bizim vəziyyətimizdə bu, depoya yeni öhdəliyin adi təkanıdır.

on:
  push

2) Skriptin nümunə kimi işə salınacağı şəkli də tərk edəcəyik, çünki Ubuntu lazımi funksionallıqdan kifayət qədər razıdır. Baxmaq mövcud alətlər aydın olur ki, bu, hər hansı zəruri və ya sadəcə olaraq rahat təsvir (və ya ona əsaslanan Docker konteyneri) ola bilər.

  build:
    runs-on: ubuntu-latest

3) Addımlarda biz ilk növbədə əsas işə hazırlaşmaq üçün mühiti quracağıq.

3.1) ehtiyac duyduğumuz filiala gedin (standart addım checkout):

- uses: actions/checkout@v1

3.2) Python quraşdırın:

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

3.3) generatorumuzun asılılıqlarını quraşdırın:

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

3.4) sayt səhifələrinin yaradılacağı kataloq yaradın:

   - name: Make output folder
      run: mkdir output

4) Saytdakı işin ardıcıl olması, yəni əvvəlki dəyişikliklərin silinməməsi və ziddiyyətlər olmadan sayt repozitoriyasına dəyişikliklər əlavə edə bilməsi üçün növbəti addım hər dəfə sayt repozitoriyasını klonlaşdırmaq olacaq:

   - 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

Bu addım sistem dəyişənlərini çağırır:

  • dəyişən GITHUB_ACTOR GitHub özü quraşdırır və bu, bu skriptin günahı ilə işə salındığı istifadəçi adıdır;
  • dəyişən secrets.ACCESS_TOKEN bu yaranır Github-u idarə etmək üçün token, tabda təyin etməklə onu mühit dəyişəni kimi ötürə bilərik Secrets depo parametrlərimiz. Nəzərə alın ki, generasiya zamanı token bizə bir dəfə veriləcək, ona əlavə giriş olmayacaq. Eləcə də Secrets elementlərinin dəyərləri.

5) Gəlin səhifələrimizin yaradılmasına keçək:

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

Generatora ötürülən parametrlər yaradılan faylların göndəriləcəyi qovluğa cavabdehdir (-o output) və yaratmaq üçün istifadə etdiyimiz konfiqurasiya faylı (-s publishconf.py; Yerli konfiqurasiyanı və dərc üçün konfiqurasiyanı ayırmağa yanaşma haqqında Pelikan sənədlərində oxuya bilərsiniz.).

Qovluğumuzda nə olduğunu sizə xatırladıram output Saytın deposu artıq klonlanıb.

6) Gəlin git-i quraşdıraq və dəyişdirilmiş fayllarımızı indeksləşdirək:

    - 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

Bu nöqtədə, artıq məlum dəyişən istifadə olunur və bu addımdan əmrlərin işə salınacağı iş kataloqu göstərilir. İş qovluğuna getmək əmri əks halda belə görünür - cd output.

7) Gəlin bir öhdəçilik mesajı yaradaq, dəyişiklikləri həyata keçirək və onları depoya yerləşdirək. Beləliklə, öhdəliyin boşa getməməsi və buna görə də bash-da səhv yaratmaması (çıxış nəticəsi deyil 0) — əvvəlcə nəyisə törətmək və itələmək lazım olub-olmadığını yoxlayaq. Bunu etmək üçün əmrdən istifadə edirik git diff-index --quiet --cached HEAD -- terminala çıxış edəcək 0 saytın əvvəlki versiyasına nisbətən heç bir dəyişiklik olmadıqda və 1 belə dəyişikliklər var. Sonra bu əmrin nəticəsini emal edirik. Beləliklə, skriptin icrası ilə bağlı məlumatlarda biz avtomatik olaraq çökmə və skript qəzası haqqında hesabat göndərmək əvəzinə, bu mərhələdə saytın vəziyyəti haqqında faydalı məlumatları qeyd edəcəyik.

Biz də hazır səhifələrlə kataloqumuzda bu hərəkətləri həyata keçiririk.

   - 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

Nəticə

Nəticədə, belə bir skript statik səhifələr yaratmaq barədə düşünməməyə imkan verir. İstənilən sistemdən git ilə işləmək və ya GitHub veb interfeysi vasitəsilə fayl yaratmaqdan asılı olmayaraq, birbaşa şəxsi depoya dəyişikliklər əlavə etməklə, Actions hər şeyi özləri edəcək. Skript gözlənilmədən çökərsə, e-poçtunuza bildiriş göndəriləcək.

Tam kod

Mən iş versiyamı tərk edəcəyəm, burada son addım öhdəliyin əsas depoya köçürülməsi barədə bildiriş göndərilməsini əlavə edir.

Yuxarıda təsvir edilən Sirlərdən istifadə olunur, burada bot nişanı və mesajın göndərilməsi lazım olan istifadəçi ID-si əlavə olunur.

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

Screenshots

Statik Generator Saytı və GitHub Səhifələri üçün CI/CD kimi GitHub Fəaliyyətləri
Mənbə deposunun Fəaliyyətlər tabında göstərilən qaçışlardan birinin nəticəsi

Statik Generator Saytı və GitHub Səhifələri üçün CI/CD kimi GitHub Fəaliyyətləri
Skriptin tamamlanması haqqında botdan mesaj

Faydalı linklər

Fəaliyyətləri Anlamaq
Fəaliyyət sintaksisi
Tətikləyicilərin siyahısı
Virtual mühitlər üçün seçimlər
Github Səhifələri
Statik Generator siyahısı

Mənbə: www.habr.com

Добавить комментарий