GitHub әрекеттері статикалық генератордағы және GitHub беттеріндегі сайт үшін CI/CD ретінде

GitHub әрекеттері статикалық генератордағы және GitHub беттеріндегі сайт үшін CI/CD ретінде

Хабрды біраз зерттеп, мен GitHub (бета) мүмкіндігі - Әрекеттер тақырыбына өте аз мақалалар жарияланғанына таң қалдым.

Мұндай төмендетпеуді функционалдық «бета» болса да әлі де тестілеуде болуымен түсіндіруге болатын сияқты. Бірақ бұл бета нұсқасының пайдалы мүмкіндігі, бұл құралды жеке репозиторийлерде пайдалануға мүмкіндік береді. Бұл технологиямен жұмыс істеу туралы мен осы мақалада айтатын боламын.

Prehistory

Егер біз ретімен бастасақ, «Мен туралы» жеке веб-сайтты сақтаудың жылдам, ыңғайлы, оңай және тегін нұсқасын іздеу барысында мен бірнеше түнді өткізіп, көптеген мақалаларды ақтаруға тура келгенін айта кеткен жөн.

Кейбір адамдар хостингті, басқалары бұлтты серверді таңдайды, ал мұның барлығы үшін жұмысты, өзара әрекеттесу мен төлемді түсінгісі келмейтіндер статикалық сайттарды репозиторийге жүктеп салуды ұнатады, өйткені қазір мұны GitHub және GitLab екеуінде де жасауға болады.

Әрине, бұл әркімнің жеке таңдауы.

Менің соңғы таңдауым GitHub беттері болды.

Беттер туралы

Кім білмейді gh-pages - бұл құжаттаманы веб-сайт түрінде сақтауға арналған опция және ол тегін ұсынылады, сонымен қатар құжаттамадан басқа, жеке веб-сайттарды сақтау ұсынылады. Бұл функцияны GitHub барлық пайдаланушыларға береді және репозитарий параметрлерінде қол жетімді.

Жоба репозиторийі тармақты пайдаланады gh-pages, пайдаланушы сайты үшін - аты бар бөлек репозиторий username.github.io сайт көздерімен master филиалы.

Толығырақ мәліметтерді көре аласыз құжаттамада, бірақ GitHub кез келген адамға файлды қосу арқылы өз доменін осындай сайтқа байланыстыруға мүмкіндік беретін таңқаларлық жомарт екенін атап өтейін. CNAME домен атауымен және GitHub серверлерінде домен провайдеріңіздің DNS параметрлерін орнату.

Мен мұнда мұндай сайтты қалай әзірлеуге болатыны туралы көптеген мақалалар бар екеніне сенімдімін, сондықтан мен бұл туралы әрі қарай сөйлеспеймін.

Проблеманың пайда болуы

Мәселе статикалық генераторды пайдалану кезінде беттерді жасау және оларды репозиторийге жүктеу процесін жеңілдету үшін қосымша сценарийлер жазу және кітапханаларды пайдалану қажеттілігі болды. Жай ғана, егер сіз дереккөздерді жеке жеке репозиторийде сақтасаңыз, сайтта кез келген өзгеріс болған сайын, тұрақты беттерді кейінгі генерациялау және сайттың негізгі репозиторийінде жариялау үшін жергілікті ортаны орналастыру қажет болды.

Молшылық бар статикалық генераторлар және олардың барлығында бірдей мәселе бар. Бұл әрекеттер тым көп уақыт пен күш жұмсайды және сайып келгенде сайттағы жұмысты баяулатады, әсіресе ОЖ-дан ОЖ-ға бірнеше көшу немесе қатты дискілердегі деректердің жоғалуымен байланысты оқиғалардан кейін (бұл менің жағдайымда болды).

Жақында веб-сайттағы қалқымалы хабарландыруда немесе GitHub ақпараттық бюллетенінде жаңадан салынған CI/CD байқалды, бұл бұл әрекеттерді аз күш-жігермен орындауға мүмкіндік берді.

Статикалық бет генераторлары туралы

Мен бұл тармақшаға ерекше назар аудармаймын, бірақ мен келесілерді таңдау және пайдалану кезінде келген бірнеше тезистермен бөлісемін:

1) бағдарламалау тіліңізге сәйкес келетін генераторды немесе мүмкіндігінше түсінікті генераторды таңдаңыз. Мен бұл идеяға сайттың жұмыс істеуі үшін кейбір функционалдылықты қосу, оның тұрақтылығы мен автоматтандыруы үшін балдақтарды қосу керек болған кезде келдім. Сонымен қатар, бұл қосымша функционалдылықты плагиндер түрінде жазудың жақсы себебі;

2) қай генераторды таңдау жеке таңдау болып табылады, бірақ GitHub Pages функционалдығының жұмысына кірісу үшін алдымен орнату керек екенін ескерген жөн. Джек. Бақытымызға орай, ол репозиторийдегі көздерден веб-сайтты жасауға мүмкіндік береді (Мен мұны өз таңдауыммен қайталаймын).

Менің генераторды таңдауым бірінші тармаққа негізделген. Пеликан Python тілінде жазылған ол маған бөтен Джекиллді оңай ауыстырды (оны бір жылға жуық пайдаландым). Нәтижесінде, тіпті мақалалар жасау және өңдеу және веб-сайтта жұмыс істеу маған қызықты тілде қосымша тәжірибе береді.

__

Мәселенің тұжырымы

Негізгі тапсырма жеке репозиторийден статикалық беттерді автоматты түрде жасайтын сценарийді (шын мәнінде конфигурация файлы) жазу болады. Шешім виртуалды ортаның функционалдығын қамтиды. Сценарийдің өзі жалпы репозиторийге дайын беттерді қосады.

Шешуге арналған құралдар

Мәселені шешу үшін қолданылатын құралдар:

  • GitHub әрекеттері;
  • Python3.7;
  • пеликан;
  • Git;
  • GitHub беттері.

сөйлеген сөзінде

Сонымен, құжаттамамен аздап танысып, Actions сценарийлерінің қалай жазылатынын түсінгеннен кейін бұл механизм туындаған мәселені толығымен шешетіні белгілі болды. Жазу кезінде сіз бұл функцияны пайдалану үшін жазылуыңыз керек. бета сынағы үшін!

GitHub әрекеттері статикалық генератордағы және GitHub беттеріндегі сайт үшін CI/CD ретінде
Github өзі жасаған жаңа функцияның сипаттамасы

Әрекеттер сценарийін жазу қалтада аталған файлды жасаудан басталады .github және оның ішкі қалтасы workflows. Мұны қолмен немесе репозитарий бетіндегі Әрекеттер қойындысындағы өңдегіштен жасауға болады.

GitHub әрекеттері статикалық генератордағы және GitHub беттеріндегі сайт үшін CI/CD ретінде
Бос сценарий пішінінің мысалы

Мен пішінге қысқаша түсініктеме беремін

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 қажетті функционалдылыққа қанағаттанған. Қарап тұр қол жетімді құралдар бұл кез келген қажетті немесе жай ыңғайлы кескін (немесе оның негізіндегі Docker контейнері) болуы мүмкін екені белгілі болды.

  build:
    runs-on: ubuntu-latest

3) Қадамдарда біз алдымен негізгі жұмысқа дайындалу үшін ортаны орнатамыз.

3.1) бізге қажет филиалға өтіңіз (стандартты қадам checkout):

- uses: actions/checkout@v1

3.2) Python орнату:

    - 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) 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) Келіңіздер, міндеттеме хабарын жасап, өзгертулерді орындап, оларды репозиторийге жіберейік. Міндеттеме бекер емес және сондықтан 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 веб-интерфейсі арқылы файл жасау арқылы әрекеттердің барлығын өздері жасайды. Егер сценарий күтпеген жерден бұзылса, электрондық поштаңызға хабарландыру жіберіледі.

Толық код

Мен өзімнің жұмыс нұсқамды қалдырамын, онда соңғы қадам міндеттеменің негізгі репозиторийге жіберілгені туралы хабарламаны жіберуді қосады.

Жоғарыда сипатталған Құпиялар пайдаланылады, мұнда бот таңбалауышы және хабар жіберілетін пайдаланушы идентификаторы қосылады.

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 әрекеттері статикалық генератордағы және GitHub беттеріндегі сайт үшін CI/CD ретінде
Бастапқы репозиторийдің Әрекеттер қойындысында көрсетілген іске қосулардың бірінің нәтижесі

GitHub әрекеттері статикалық генератордағы және GitHub беттеріндегі сайт үшін CI/CD ретінде
Боттан сценарийдің аяқталғаны туралы хабарлама

Пайдалы сілтемелер

Іс-әрекеттерді түсіну
Әрекеттер синтаксисі
Триггерлер тізімі
Виртуалды орталарға арналған опциялар
Github беттері
Статикалық генераторлар тізімі

Ақпарат көзі: www.habr.com

пікір қалдыру