GitHub radnje kao CI/CD za web mjesto na statičkom generatoru i GitHub stranice

GitHub radnje kao CI/CD za web mjesto na statičkom generatoru i GitHub stranice

Nakon što sam malo prošvrljao po Habru, iznenadio sam se da je vrlo malo članaka objavljeno na temu GitHubove (beta) značajke - Akcije.

Čini se da se takvo podcjenjivanje može objasniti činjenicom da je funkcionalnost još uvijek u fazi testiranja, iako "beta". No korisna je značajka beta verzije koja omogućuje korištenje ovog alata u privatnim spremištima. O radu s ovom tehnologijom govorit ću u ovom članku.

Prapovijest

Ako krenemo redom, onda je vjerojatno vrijedno spomenuti da sam u procesu traženja brze, praktične, jednostavne i besplatne opcije za pohranu osobne web stranice "O meni" morao provesti nekoliko noći i pročešljati mnoge članke.

Neki ljudi biraju hosting, drugi server u oblaku, a oni koji ne žele razumjeti rad, interakciju i plaćanje za sve to poput uploada statičnih stranica u repozitorij, budući da se sada to može učiniti i na GitHubu i na GitLabu.

Naravno, ovo je svačiji osobni izbor.

Moj konačni izbor bile su GitHub stranice.

O stranicama

Tko ne zna gh-pages - ovo je mogućnost pohrane dokumentacije u obliku web stranice i daje se besplatno, a osim dokumentacije predlaže se i pohrana osobnih web stranica. Ovu funkcionalnost GitHub pruža svim korisnicima i dostupna je u postavkama repozitorija.

Repozitorij projekta koristi granu gh-pages, za korisničku stranicu - zasebno spremište s nazivom username.github.io s izvorima stranice u master podružnica.

Možete vidjeti više u dokumentaciji, ali dopustite mi samo da primijetim da je GitHub iznenađujuće velikodušan u dopuštanju bilo kome da poveže svoju vlastitu domenu s takvom web lokacijom jednostavnim dodavanjem datoteke CNAME s nazivom domene i postavljanjem DNS-a vašeg davatelja domene na GitHub poslužiteljima.

Siguran sam da ovdje ima mnogo članaka o tome kako razviti takvu stranicu, tako da to nije ono o čemu ću dalje govoriti.

Pojava problema

Problem je bio u tome što kada se koristi statički generator, postoji potreba za pisanjem dodatnih skripti i korištenjem biblioteka kako bi se pojednostavio proces generiranja stranica i njihovog učitavanja u repozitorij. Jednostavno, ako izvore pohranjujete u zasebno privatno spremište, tada je svaki put kad dođe do bilo kakve promjene na web mjestu bilo potrebno implementirati lokalno okruženje za naknadno generiranje statičnih stranica i objavljivanje u glavnom repozitoriju web mjesta.

Postoji obilje statički generatori i svi imaju isti problem. Ove radnje oduzimaju previše vremena i truda, te u konačnici usporavaju rad na stranici, osobito nakon nekoliko migracija s OS-a na OS ili incidenata s gubitkom podataka na tvrdim diskovima (to je bio slučaj u mom slučaju).

Nedavno je, bilo u skočnoj obavijesti na web stranici ili u biltenu GitHuba, primijećen novoizgrađeni CI/CD, koji je omogućio izvođenje ovih radnji uz minimalan napor.

O generatorima statičkih stranica

Neću se posebno osvrtati na ovu podstavku, ali ću iznijeti par teza do kojih sam došao prilikom odabira i korištenja sljedećeg:

1) odaberite generator koji odgovara vašem programskom jeziku ili onaj koji je što jasniji. Na ovu ideju sam došao u trenutku kada sam i sam morao dodati neke funkcionalnosti da stranica radi, dodati štake za veću stabilnost i automatizaciju. Osim toga, ovo je dobar razlog da sami napišete dodatnu funkcionalnost u obliku dodataka;

2) koji generator odabrati osobni je izbor, ali vrijedi uzeti u obzir da za početno uranjanje u rad funkcionalnosti GitHub Pages prvo morate instalirati Jekyll. Srećom, omogućuje vam generiranje web stranice iz izvora izravno u repozitoriju (Ponovit ću ovo sa svojim izborom).

Moj izbor generatora temelji se na prvoj točki. Pelikan koji je napisan u Pythonu lako je zamijenio meni stranog Jekylla (koristio ga skoro godinu dana). Kao rezultat toga, čak i stvaranje i uređivanje članaka i rad na web stranici daje dodatno iskustvo na jeziku koji mi je zanimljiv.

__

Formuliranje problema

Glavni zadatak će biti napisati skriptu (zapravo konfiguracijsku datoteku) koja će automatski generirati statične stranice iz privatnog repozitorija. Rješenje će uključivati ​​funkcionalnost virtualnog okruženja. Sama skripta će dodati gotove stranice u javni repozitorij.

Alati za rješenje

Alati koje ćemo koristiti za rješavanje problema:

  • GitHub radnje;
  • Python 3.7;
  • Pelikan;
  • Git;
  • GitHub stranice.

Rješenje

Dakle, nakon što smo se malo upoznali s dokumentacijom i shvatili kako se pišu skripte za akcije, postalo je jasno da će ovaj mehanizam u potpunosti riješiti problem koji se pojavio. U trenutku pisanja ovog teksta morate se pretplatiti za korištenje ove funkcije. za beta testiranje!

GitHub radnje kao CI/CD za web mjesto na statičkom generatoru i GitHub stranice
Opis nove funkcionalnosti samog Githuba

Pisanje radnje skripte počinje stvaranjem imenovane datoteke u mapi .github i njegovu podmapu workflows. To se može učiniti ili ručno ili iz uređivača na kartici Radnje na stranici spremišta.

GitHub radnje kao CI/CD za web mjesto na statičkom generatoru i GitHub stranice
Primjer prazne skripte

Ukratko ću komentirati obrazac

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.

Napišimo svoje na temelju predloška:

0) Također možete ostaviti naziv "CI". To je stvar ukusa.

1) Zatim morate odabrati radnju/okidač koji će pokrenuti skriptu, u našem slučaju ovo je uobičajeno guranje novog predavanja u repozitorij.

on:
  push

2) Ostavit ćemo i sliku na temelju koje će se pokrenuti skripta kao primjer, budući da je Ubuntu sasvim zadovoljan potrebnom funkcionalnošću. Gledati u dostupnie instrumenty postaje jasno da to može biti bilo koja potrebna ili jednostavno prikladna slika (ili Docker spremnik temeljen na njoj).

  build:
    runs-on: ubuntu-latest

3) U koracima ćemo prvo postaviti okruženje za pripremu za glavni posao.

3.1) idite u granu koja nam je potrebna (standardni korak checkout):

- uses: actions/checkout@v1

3.2) instalirajte Python:

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

3.3) instalirajte ovisnosti našeg generatora:

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

3.4) kreirajte direktorij u kojem će se generirati stranice stranice:

   - name: Make output folder
      run: mkdir output

4) Kako bi rad na stranici bio dosljedan, odnosno da se ne brišu prethodne promjene i da se promjene mogu dodati u repozitorij web stranice bez sukoba, sljedeći korak bit će kloniranje repozitorija stranice svaki put:

   - 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

Ovaj korak poziva sistemske varijable:

  • varijabla GITHUB_ACTOR GitHub se sam instalira, a ovo je korisničko ime čijom je krivnjom ova skripta pokrenuta;
  • varijabla secrets.ACCESS_TOKEN ovo se generira token za upravljanje Githubom, možemo ga proslijediti kao varijablu okruženja postavljanjem na kartici Secrets naše postavke repozitorija. Imajte na umu da će nam token biti dostavljen jednom tijekom generiranja i više mu neće biti pristupa. Kao i vrijednosti predmeta Secrets.

5) Prijeđimo na generiranje naših stranica:

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

Parametri proslijeđeni generatoru odgovorni su za direktorij u koji će se poslati generirane datoteke (-o output) i konfiguracijsku datoteku koju koristimo za generiranje (-s publishconf.py; O pristupu odvajanju lokalne konfiguracije i konfiguracije za objavljivanje možete pročitati u Pelican dokumentaciji).

Da vas podsjetim što je u našoj mapi output Repozitorij stranice je već kloniran.

6) Postavite git i indeksirajte naše promijenjene datoteke:

    - 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

U ovom trenutku se koristi već poznata varijabla i naznačen je radni direktorij u kojem će se pokrenuti naredbe iz ovog koraka. Naredba za odlazak u radni direktorij inače bi izgledala ovako - cd output.

7) Generirajmo poruku predaje, izvršimo promjene i gurnimo ih u spremište. Tako da commit nije uzaludan i stoga ne proizvodi pogrešku u bashu (izlazni rezultat nije 0) — prvo provjerimo je li uopće potrebno nešto obvezati i gurati. Za to koristimo naredbu git diff-index --quiet --cached HEAD -- koji će izlaziti na terminal 0 ako nema promjena u odnosu na prethodnu verziju stranice, i 1 postoje takve promjene. Zatim obrađujemo rezultat ove naredbe. Tako ćemo u informacijama o izvršavanju skripte bilježiti korisne informacije o stanju stranice u ovoj fazi, umjesto da se automatski ruši i šalje nam izvješće o padu skripte.

Ove akcije također provodimo u našem imeniku s gotovim stranicama.

   - 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

Rezultirati

Kao rezultat toga, takva skripta omogućuje vam da ne razmišljate o stvaranju statičnih stranica. Dodavanjem promjena izravno u privatni repozitorij, bilo radom s git-om iz bilo kojeg sustava ili stvaranjem datoteke putem GitHub web sučelja, Actions će učiniti sve same. Ako se skripta neočekivano sruši, obavijest će biti poslana na vašu e-poštu.

Puni kod

Ostavit ću svoju radnu verziju, u kojoj posljednji korak dodaje slanje obavijesti da je obveza gurnuta u glavno spremište.

Koriste se gore opisane tajne gdje se dodaje bot token i ID korisnika kojem je potrebno poslati poruku.

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

Slike

GitHub radnje kao CI/CD za web mjesto na statičkom generatoru i GitHub stranice
Rezultat jednog od pokretanja prikazan na kartici Radnje izvornog repozitorija

GitHub radnje kao CI/CD za web mjesto na statičkom generatoru i GitHub stranice
Poruka bota o završetku skripte

korisni linkovi

Razumijevanje radnji
Sintaksa radnji
Popis okidača
Mogućnosti virtualnog okruženja
Github stranice
Popis statičkih generatora

Izvor: www.habr.com

Dodajte komentar