Veprimet e GitHub si CI/CD për një sajt në një gjenerator statik dhe Faqe GitHub

Veprimet e GitHub si CI/CD për një sajt në një gjenerator statik dhe Faqe GitHub

Pasi e pata pak Habrin, u habita që shumë pak artikuj janë botuar në temën e veçorisë (beta) të GitHub - Veprimet.

Duket se një nënvlerësim i tillë mund të shpjegohet me faktin se funksionaliteti është ende në testim, megjithëse "beta". Por është një veçori e dobishme e beta që lejon që ky mjet të përdoret në depo private. Bëhet fjalë për punën me këtë teknologji për të cilën do të flas në këtë artikull.

Parahistoria

Nëse fillojmë me radhë, atëherë ndoshta vlen të përmendet se në procesin e kërkimit të një opsioni të shpejtë, të përshtatshëm, të lehtë dhe falas për ruajtjen e një faqeje interneti personale "Rreth meje", më duhej të kaloja disa netë dhe të krehja shumë artikuj.

Disa njerëz zgjedhin hostimin, të tjerë një server cloud dhe ata që nuk duan të kuptojnë punën, ndërveprimin dhe pagesën për të gjitha këto si ngarkimi i faqeve statike në një depo, pasi tani kjo mund të bëhet si në GitHub ashtu edhe në GitLab.

Sigurisht, kjo është zgjedhje personale e secilit.

Zgjedhja ime përfundimtare ishte GitHub Pages.

Rreth Faqeve

Kush nuk e di gh-pages - ky është një opsion për ruajtjen e dokumentacionit në formën e faqes së internetit dhe ofrohet pa pagesë, dhe përveç dokumentacionit propozohet edhe ruajtja e faqeve personale. Ky funksion ofrohet nga GitHub për të gjithë përdoruesit dhe është i disponueshëm në cilësimet e depove.

Depoja e projektit përdor një degë gh-pages, për një faqe përdoruesi - një depo e veçantë me emrin username.github.io me burimet e sajtit në master degë.

Ju mund të shihni më shumë në dokumentacion, por më lejoni vetëm të vërej se GitHub është çuditërisht bujar duke lejuar këdo që të lidhë domenin e tij me një sajt të tillë thjesht duke shtuar një skedar CNAME me emrin e domenit dhe konfigurimin e DNS-së së ofruesit të domenit tuaj në serverët GitHub.

Jam i sigurt se ka shumë artikuj këtu se si të zhvillohet një faqe e tillë, kështu që nuk bëhet fjalë për atë më tej.

Shfaqja e një problemi

Problemi ishte se kur përdorni një gjenerator statik, ekziston nevoja për të shkruar skriptet shtesë dhe përdorimin e bibliotekave për të thjeshtuar procesin e gjenerimit të faqeve dhe ngarkimit të tyre në depo. Thjesht, nëse i ruani burimet në një depo të veçantë private, atëherë sa herë që ka ndonjë ndryshim në sit, ishte e nevojshme të vendosni mjedisin lokal për gjenerimin e mëvonshëm të faqeve statike dhe publikimin në depon kryesore të faqes.

Ka një bollëk gjeneratorë statikë dhe të gjithë kanë të njëjtin problem. Këto veprime kërkojnë shumë kohë dhe përpjekje dhe në fund ngadalësojnë punën në sit, veçanërisht pas disa migrimeve nga OS në OS ose incidenteve me humbje të të dhënave në disqet e ngurtë (ky ishte rasti në rastin tim).

Kohët e fundit, qoftë në një njoftim pop-up në faqen e internetit ose në një buletin nga GitHub, u vu re një CI/CD e sapondërtuar, e cila lejoi që këto veprime të kryheshin me përpjekje minimale.

Rreth gjeneratorëve të faqeve statike

Nuk do t'i kushtoj vëmendje të veçantë këtij nën-artikulli, por do të ndaj disa teza në të cilat arrita gjatë përzgjedhjes dhe përdorimit të sa vijon:

1) zgjidhni një gjenerator që i përshtatet gjuhës tuaj të programimit, ose një që është sa më i qartë që të jetë e mundur. Unë erdha në këtë ide në një kohë kur më duhej të shtoja disa funksionalitete që faqja të funksiononte, të shtoja paterica për stabilitetin dhe automatizimin më të madh të tij. Për më tepër, kjo është një arsye e mirë për të shkruar vetë funksionalitete shtesë në formën e shtojcave;

2) cili gjenerator të zgjidhni është një zgjedhje personale, por vlen të merret parasysh që për zhytjen fillestare në punën e funksionalitetit të GitHub Pages, së pari duhet të instaloni Jekyll. Për fat të mirë, kjo ju lejon të gjeneroni një faqe interneti nga burime direkt në depo (Unë do ta përsëris këtë me zgjedhjen time).

Zgjedhja ime e gjeneratorit bazohet në pikën e parë. pelikan e cila është e shkruar në Python zëvendësoi lehtësisht Jekyll, që është e huaj për mua (e perdori gati nje vit). Si rezultat, edhe krijimi dhe redaktimi i artikujve dhe puna në një faqe interneti jep përvojë shtesë në një gjuhë që është interesante për mua.

__

Formulimi i problemit

Detyra kryesore do të jetë të shkruani një skript (në fakt një skedar konfigurimi) që do të gjeneronte automatikisht faqe statike nga një depo private. Zgjidhja do të përfshijë funksionalitetin e një mjedisi virtual. Vetë skripti do të shtojë faqe të gatshme në depon publike.

Mjetet për zgjidhje

Mjetet që do të përdorim për të zgjidhur problemin:

  • Veprimet e GitHub;
  • Python 3.7;
  • Pelikani;
  • Git;
  • Faqet e GitHub.

Zgjidhja e problemeve

Pra, pasi u njohëm pak me dokumentacionin dhe kuptuam se si shkruhen skriptet për Veprimet, u bë e qartë se ky mekanizëm do të zgjidhë plotësisht problemin që ka lindur. Në kohën e shkrimit, duhet të abonoheni për të përdorur këtë funksion. për testimin beta!

Veprimet e GitHub si CI/CD për një sajt në një gjenerator statik dhe Faqe GitHub
Përshkrimi i funksionalitetit të ri nga vetë Github

Shkrimi i një skripti Veprimesh fillon duke krijuar një skedar me emër në një dosje .github dhe nëndosjen e saj workflows. Kjo mund të bëhet ose me dorë ose nga redaktori në skedën Veprimet në faqen e depove.

Veprimet e GitHub si CI/CD për një sajt në një gjenerator statik dhe Faqe GitHub
Shembull i një forme skripti bosh

Do të komentoj shkurtimisht formularin

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.

Le të shkruajmë tonën bazuar në shabllonin:

0) Ju gjithashtu mund të lini emrin "CI". Është çështje shije.

1) Më pas, duhet të zgjidhni veprimin/shkasin që do të nisë skriptin, në rastin tonë kjo është shtytja e zakonshme e një angazhimi të ri në depo.

on:
  push

2) Ne gjithashtu do të lëmë imazhin mbi bazën e të cilit do të lansohet skripti si shembull, pasi Ubuntu është mjaft i kënaqur me funksionalitetin e nevojshëm. Duke shikuar instrumentet e disponueshme bëhet e qartë se kjo mund të jetë çdo imazh i nevojshëm ose thjesht i përshtatshëm (ose një kontejner Docker i bazuar në të).

  build:
    runs-on: ubuntu-latest

3) Në hapat, fillimisht do të vendosim mjedisin për t'u përgatitur për punën kryesore.

3.1) shkoni në degën që na nevojitet (hapi standard checkout):

- uses: actions/checkout@v1

3.2) instaloni Python:

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

3.3) instaloni varësitë e gjeneratorit tonë:

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

3.4) krijoni një drejtori në të cilën do të gjenerohen faqet e faqes:

   - name: Make output folder
      run: mkdir output

4) Në mënyrë që puna në sit të jetë konsistente, domethënë, të mos fshihen ndryshimet e mëparshme dhe të jetë në gjendje të shtoni ndryshime në depon e faqes pa konflikte, hapi tjetër do të jetë klonimi i depove të faqes çdo herë:

   - 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

Ky hap thërret variablat e sistemit:

  • e ndryshueshme GITHUB_ACTOR GitHub instalon vetë, dhe ky është emri i përdoruesit për fajin e të cilit është nisur ky skript;
  • e ndryshueshme secrets.ACCESS_TOKEN kjo gjenerohet shenjë për menaxhimin e Github, mund ta kalojmë si variabël mjedisi duke e vendosur në skedën Secrets cilësimet e depove tona. Ju lutemi vini re se gjatë gjenerimit, token do të na jepet një herë, nuk do të ketë qasje të mëtejshme në të. Si dhe vlerat e artikujve Secrets.

5) Le të kalojmë në krijimin e faqeve tona:

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

Parametrat që i kalohen gjeneratorit janë përgjegjës për drejtorinë ku do të dërgohen skedarët e gjeneruar (-o output) dhe skedarin e konfigurimit që përdorim për të gjeneruar (-s publishconf.py; Mund të lexoni rreth qasjes për ndarjen e konfigurimit lokal dhe konfigurimit për publikim në dokumentacionin e Pelican).

Më lejoni t'ju kujtoj se çfarë është në dosjen tonë output Depoja e sajtit tashmë është klonuar.

6) Le të konfigurojmë git dhe të indeksojmë skedarët tanë të ndryshuar:

    - 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

Në këtë pikë, përdoret një variabël tashmë i njohur dhe tregohet drejtoria e punës në të cilën do të hapen komandat nga ky hap. Komanda për të shkuar në drejtorinë e punës përndryshe do të dukej si - cd output.

7) Le të krijojmë një mesazh commit, të kryejmë ndryshimet dhe t'i shtyjmë ato në depo. Kështu që kryerja të mos jetë e kotë dhe për këtë arsye të mos prodhojë një gabim në bash (rezultati i daljes nuk është 0) - së pari, le të kontrollojmë nëse është e nevojshme të angazhohemi dhe të shtyjmë diçka fare. Për ta bërë këtë përdorim komandën git diff-index --quiet --cached HEAD -- e cila do të dalë në terminal 0 nëse nuk ka ndryshime në lidhje me versionin e mëparshëm të faqes, dhe 1 ka ndryshime të tilla. Pastaj ne përpunojmë rezultatin e kësaj komande. Kështu, në informacionin për ekzekutimin e skriptit, ne do të regjistrojmë informacione të dobishme për gjendjen e faqes në këtë fazë, në vend që të prishim automatikisht dhe të na dërgojmë një raport për prishjen e skenarit.

Ne gjithashtu i kryejmë këto veprime në drejtorinë tonë me faqe të gatshme.

   - 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

Result

Si rezultat, një skenar i tillë ju lejon të mos mendoni për krijimin e faqeve statike. Duke shtuar ndryshime direkt në një depo private, qoftë duke punuar me git nga çdo sistem ose duke krijuar një skedar përmes ndërfaqes në internet GitHub, Veprimet do të bëjnë gjithçka vetë. Nëse skripti prishet papritur, një njoftim do të dërgohet në emailin tuaj.

Kodi i plotë

Do të lë versionin tim të punës, në të cilin hapi i fundit shton dërgimin e një njoftimi se një commit është shtyrë në depon kryesore.

Përdoren Sekretet e përshkruara më sipër, ku shtohet token-i i botit dhe ID-ja e përdoruesit të cilit duhet t'i dërgohet mesazhi.

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

Fotografitë

Veprimet e GitHub si CI/CD për një sajt në një gjenerator statik dhe Faqe GitHub
Rezultati i njërit prej ekzekutimeve të shfaqur në skedën Veprimet e depove burimore

Veprimet e GitHub si CI/CD për një sajt në një gjenerator statik dhe Faqe GitHub
Mesazh nga boti për përfundimin e skenarit

Lidhje të dobishme

Kuptimi i Veprimeve
Sintaksa e veprimeve
Lista e nxitësve
Opsione për mjedise virtuale
Faqet Github
Lista e gjeneratorëve statikë

Burimi: www.habr.com

Shto një koment