GitHub-aksies as CI/CD vir Static Generator Site en GitHub-bladsye

GitHub-aksies as CI/CD vir Static Generator Site en GitHub-bladsye

Nadat hy 'n bietjie deurgegaan het, was Habr verbaas dat baie min artikels gepubliseer is oor die onderwerp van GitHub se (beta-) kenmerke - Aksies.

Dit wil voorkom asof so 'n onderbeklemtoning verklaar kan word deur die feit dat die funksionaliteit nog in die toets is, alhoewel "beta". Maar dit is 'n nuttige kenmerk van die beta waarmee u hierdie instrument in privaat bewaarplekke kan gebruik. Dit gaan oor die werk met hierdie tegnologie wat ek in hierdie artikel sal vertel.

Voorgeskiedenis

As jy in orde begin, is dit waarskynlik die moeite werd om die oomblik te noem dat ek in die proses van soek na 'n vinnige, gerieflike, maklike en gratis opsie om 'n persoonlike webwerf "Oor my" aan te bied, 'n paar nagte moes spandeer en deur baie artikels moes gaan. .

Iemand kies gasheer, iemand kies 'n wolkbediener, en diegene wat nie die werk, interaksie en betaling vir dit alles wil verstaan ​​nie, soos om statiese werwe na die bewaarplek op te laai, aangesien dit nou op GitHub en GitLab gedoen kan word.

Dit is natuurlik elkeen se persoonlike keuse.

My finale keuse was GitHub Pages.

Oor Bladsye

Wie is nie bewus nie gh-pages - dit is so 'n opsie om dokumentasie in die vorm van 'n webwerf te stoor en dit word gratis verskaf, en benewens dokumentasie word daar ook voorgestel om persoonlike webwerwe te stoor. Hierdie funksionaliteit word deur GitHub aan alle gebruikers verskaf en is beskikbaar in die bewaarplekinstellings.

'n Vertakking word vir die projekbewaarplek gebruik gh-pages, vir 'n pasgemaakte webwerf - 'n aparte bewaarplek met die naam username.github.io met werfbronne master tak.

Jy kan meer sien in dokumentasie, maar ek sal net daarop let dat GitHub, met ongelooflike vrygewigheid, almal toelaat om hul eie domein aan so 'n webwerf te koppel, bloot deur 'n lêer by te voeg CNAME met die domeinnaam en stel die DNS van u domeinverskaffer op die GitHub-bedieners.

Ek is seker dat daar baie artikels is oor hoe om so 'n webwerf hier te ontplooi, so dit gaan nie verder daaroor nie.

Probleem wat ontstaan

Die probleem was dat wanneer 'n statiese kragopwekker gebruik word, daar 'n behoefte is om bykomende skrifte te skryf en biblioteke te gebruik om die proses om bladsye te genereer en in die bewaarplek te laai, te vereenvoudig. Eenvoudig, as jy die bronne in 'n aparte private bewaarplek stoor, dan was dit elke keer as jy enige verandering op die webwerf maak nodig om die plaaslike omgewing te ontplooi vir die daaropvolgende generasie van statiese bladsye en publikasie in die hoofbewaarplek van die webwerf.

Daar is 'n oorvloed statiese kragopwekkers en hulle het almal dieselfde probleem. Hierdie aksies neem te veel tyd en moeite, en as gevolg daarvan hou hulle op om op die webwerf te werk, veral na verskeie migrasies van OS na OS of insidente met dataverlies op hardeskywe (dit was die geval in my geval).

Onlangs, hetsy in 'n opspringkennisgewing op die webwerf, of in die nuusbrief van GitHub, is 'n nuut ingeboude CI / CD opgemerk, wat toegelaat het dat hierdie aksies met minimale moeite uitgevoer kon word.

Oor statiese bladsyopwekkers

Ek sal nie op hierdie subparagraaf fokus nie, maar ek sal 'n paar tesisse deel waartoe ek gekom het tydens die keuse en gebruik hiervan:

1) kies 'n generator vir jou programmeertaal, of een wat so duidelik as moontlik was. Ek het met hierdie idee vorendag gekom op 'n tyd toe ek self 'n bietjie funksionaliteit moes byvoeg sodat die webwerf werk, krukke moes neersit vir sy groter stabiliteit en outomatisering. Daarbenewens is dit 'n goeie rede om self bykomende funksionaliteit in die vorm van plugins te skryf;

2) op watter spesifieke kragopwekker om te stop is 'n persoonlike keuse, maar dit moet in gedagte gehou word dat vir 'n aanvanklike onderdompeling in die werk van die GitHub Pages-funksionaliteit, jy eers jouself moet stel Jekyll. Gelukkig laat dit jou toe om 'n werf vanaf die bron direk in die bewaarplek te genereer (Ek sal dit herhaal met my keuse).

My keuse van kragopwekker is gebaseer op die eerste punt. Pelican wat in Python geskryf is, het Jekyll maklik vervang, wat vir my vreemd is (gebruik vir amper 'n jaar). As gevolg hiervan, selfs die skepping en redigering van artikels, gee die robot op die webwerf bykomende ervaring in 'n taal wat vir my interessant is.

__

Probleemstelling

Die hooftaak sal wees om so 'n skrif (eintlik 'n konfigurasielêer) te skryf wat outomaties statiese bladsye vanaf 'n private bewaarplek sal genereer. Die oplossing sal die funksionaliteit van die virtuele omgewing behels. Die skrif self sal klaargemaakte bladsye by die publieke bewaarplek voeg.

Oplossingsgereedskap

Gereedskap wat ons sal gebruik om die probleem op te los:

  • GitHub Aksies;
  • Python3.7;
  • pelikaan;
  • git
  • GitHub-bladsye.

Die oplossing

In totaal, nadat ek 'n bietjie met die dokumentasie kennis gemaak het en uitgevind het hoe skrifte vir aksies geskryf word, het dit duidelik geword dat hierdie meganisme die probleem wat ontstaan ​​het, heeltemal sal oplos. Ten tyde van die skryf, om hierdie funksionaliteit te gebruik, moet jy inteken vir beta-toetsing!

GitHub-aksies as CI/CD vir Static Generator Site en GitHub-bladsye
Beskrywing van die nuwe funksionaliteit deur Github self

Die skryf van die Actions-skrip begin met die skep van 'n benoemde lêer in die gids .github en sy subgids workflows. U kan dit beide met die hand en vanaf die redigeerder in die Aksies-oortjie op die bewaarplek-bladsy doen.

GitHub-aksies as CI/CD vir Static Generator Site en GitHub-bladsye
'n Voorbeeld van 'n leë skrifvorm

Lewer kortliks kommentaar op die vorm

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.

Kom ons skryf ons eie gebaseer op die sjabloon:

0) Jy kan die naam en "CI" los. Dit is 'n kwessie van smaak hier.

1) Vervolgens moet u die aksie / sneller kies wat sal lei tot die bekendstelling van die skrip, in ons geval is dit die gewone druk van 'n nuwe commit na die repository.

on:
  push

2) Die beeld op grond waarvan die skrip geloods gaan word, sal ook as voorbeeld gelaat word, aangesien Ubuntu redelik tevrede is met die nodige funksionaliteit. Kyk na beskikbare gereedskap dit word duidelik dat dit enige nodige of net 'n gerieflike beeld kan wees (of 'n dokhouer wat daarop gebaseer is).

  build:
    runs-on: ubuntu-latest

3) In die stappe sal ons eers die omgewing opstel om vir die hoofwerk voor te berei.

3.1) gaan na die tak wat ons benodig (standaard stap checkout):

- uses: actions/checkout@v1

3.2) installeer Python:

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

3.3) installeer die afhanklikhede van ons kragopwekker:

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

3.4) skep 'n gids waarin die werfbladsye gegenereer sal word:

   - name: Make output folder
      run: mkdir output

4) Om die werk op die werf konsekwent te maak, naamlik om nie vorige veranderinge uit te vee nie en om veranderinge aan die werfbewaarplek sonder konflikte te kan byvoeg, is die volgende stap om die werfbewaarplek elke keer te kloon:

   - 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

Hierdie stap noem die stelselveranderlikes:

  • veranderlike GITHUB_ACTOR GitHub installeer homself, en dit is die gebruikersnaam wat hierdie skrip laat loop het;
  • veranderlik secrets.ACCESS_TOKEN dit word gegenereer Github-beheertoken, kan ons dit as 'n omgewingsveranderlike deurgee deur dit in die oortjie te stel Secrets ons bewaarplekinstellings. Neem asseblief kennis dat gedurende die generasie die teken een keer aan ons verskaf sal word, daar sal nie meer toegang daartoe wees nie. Sowel as die waardes van die Secrets-items.

5) Kom ons gaan aan om ons bladsye te genereer:

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

Die parameters wat na die kragopwekker deurgegee word, is verantwoordelik vir die gids waarheen die gegenereerde lêers gestuur sal word (-o output) en die konfigurasielêer wat ons gebruik om (-s publishconf.py; jy kan lees oor die benadering om die plaaslike konfigurasie en die konfigurasie vir publikasie te skei in die Pelican-dokumentasie).

Laat ek jou herinner dat ons in die gids het output werfbewaarplek reeds gekloon.

6) Stel git op en indekseer ons veranderde lêers:

    - 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

In hierdie paragraaf word 'n reeds bekende veranderlike gebruik, en die werkgids word aangedui waarin die opdragte van hierdie stap geloods sal word. Die opdrag om na die werkgids te verander sou andersins soos − lyk cd output.

7) Genereer 'n commit-boodskap, pleeg die veranderinge en stoot dit na die bewaarplek. Sodat die commit nie vermors word nie, en dienooreenkomstig nie 'n fout in bash gee nie (die uitsetresultaat is nie 0) — eers sal ons kyk of dit enigsins nodig is om iets te pleeg en te stoot. Hiervoor gebruik ons ​​die opdrag git diff-index --quiet --cached HEAD -- wat by die uitgang na die terminale sal gee 0 as daar geen veranderinge van die vorige weergawe van die webwerf is nie, en 1 daar is sulke veranderinge. Dan verwerk ons ​​die resultaat van hierdie opdrag. Dus, in die inligting oor die uitvoering van die skrif, sal ons nuttige inligting oor die toestand van die werf op hierdie stadium neerskryf, in plaas daarvan om outomaties te crash en vir ons 'n verslag oor die ongeluk van die script te stuur.

Ons voer ook hierdie aksies uit in ons gids met klaargemaakte bladsye.

   - 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

Gevolg

Gevolglik laat so 'n skrif jou toe om nie daaraan te dink om statiese bladsye te skep nie. Deur veranderinge direk by 'n private bewaarplek by te voeg, of dit nou met git vanaf enige stelsel werk of 'n lêer deur GitHub se webkoppelvlak skep, doen Actions dit alles. In die geval van 'n onverwagse val van die skrif, sal 'n kennisgewing na die pos gestuur word.

Volle kode

Ek sal my werkende weergawe daarin laat, in die laaste stap, die stuur van 'n kennisgewing dat 'n commit na die hoofbewaarplek geloods is, word bygevoeg.

Die geheime hierbo beskryf word gebruik waar die bot-token en die gebruiker-ID waarna die boodskap gestuur moet word bygevoeg word.

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

Kiekies

GitHub-aksies as CI/CD vir Static Generator Site en GitHub-bladsye
Die resultaat van een van die bekendstellings wat in die Aksies-oortjie van die bronbewaarplek vertoon word

GitHub-aksies as CI/CD vir Static Generator Site en GitHub-bladsye
Boodskap van die bot oor die voltooiing van die skrif

nuttige skakels

Verstaan ​​aksies
Sintaksis
Lys van snellers
Virtuele omgewing opsies
Github-bladsye
Statiese Generator lys

Bron: will.com

Voeg 'n opmerking