GitHub toimii CI/CD-muodossa sivustolle staattisella generaattorilla ja GitHub-sivuilla

GitHub toimii CI/CD-muodossa sivustolle staattisella generaattorilla ja GitHub-sivuilla

Tutkittuani Habria hieman yllätyin, että GitHubin (beta)-ominaisuudesta - Actions - on julkaistu hyvin vähän artikkeleita.

Vaikuttaa siltä, ​​että tällainen aliarviointi voidaan selittää sillä, että toiminnallisuus on vielä testauksessa, vaikkakin "beta". Mutta se on beta-version hyödyllinen ominaisuus, jonka avulla tätä työkalua voidaan käyttää yksityisissä arkistoissa. Puhun tässä artikkelissa työskentelystä tämän tekniikan kanssa.

esihistoria

Jos aloitamme järjestyksessä, on varmaan syytä mainita, että etsiessäni nopeaa, kätevää, helppoa ja ilmaista vaihtoehtoa henkilökohtaisen "About Me" -sivuston tallentamiseen jouduin viettämään useita öitä ja kampaamaan läpi monia artikkeleita.

Jotkut ihmiset valitsevat isännöinnin, toiset pilvipalvelimen, ja ne, jotka eivät halua ymmärtää kaiken tämän työtä, vuorovaikutusta ja maksamista, kuten staattisten sivustojen lataaminen arkistoon, koska nyt tämä voidaan tehdä sekä GitHubissa että GitLabissa.

Tämä on tietysti jokaisen oma valinta.

Lopullinen valintani oli GitHub Pages.

Tietoja sivuista

Kuka ei ole tietoinen gh-pages - tämä on mahdollisuus tallentaa dokumentaatiota verkkosivuston muodossa ja se toimitetaan ilmaiseksi, ja dokumentaation lisäksi ehdotetaan myös henkilökohtaisten verkkosivustojen tallentamista. GitHub tarjoaa tämän toiminnon kaikille käyttäjille, ja se on käytettävissä arkiston asetuksissa.

Projektivarasto käyttää haaraa gh-pages, käyttäjäsivustolle - erillinen arkisto, jossa on nimi username.github.io sivuston lähteiden kanssa master haara.

Voit nähdä lisätietoja dokumentaatiossa, mutta haluan vain huomauttaa, että GitHub on yllättävän antelias salliessaan kenen tahansa linkittää oman verkkotunnuksensa tällaiseen sivustoon yksinkertaisesti lisäämällä tiedoston CNAME verkkotunnuksen nimen kanssa ja määritä verkkotunnuksen tarjoajan DNS GitHub-palvelimille.

Olen varma, että täällä on monia artikkeleita tällaisen sivuston kehittämisestä, joten en aio puhua siitä enempää.

Kun ongelma ilmenee

Ongelmana oli, että staattista generaattoria käytettäessä jouduttiin kirjoittamaan ylimääräisiä komentosarjoja ja käyttämään kirjastoja sivujen luomisen ja arkistoon lataamisen yksinkertaistamiseksi. Yksinkertaisesti, jos tallennat lähteet erilliseen yksityiseen arkistoon, aina kun sivustolla tapahtuu muutoksia, oli tarpeen ottaa käyttöön paikallinen ympäristö myöhempää staattisten sivujen luomista ja julkaisua varten pääsivuston arkistossa.

Siellä on runsaasti staattiset generaattorit ja kaikilla on sama ongelma. Nämä toimet vievät liikaa aikaa ja vaivaa ja hidastavat lopulta työtä sivustolla, varsinkin useiden siirtojen jälkeen käyttöjärjestelmästä käyttöjärjestelmään tai kiintolevyjen tietojen menettämisen jälkeen. (tämä oli minun tapauksessani).

Juuri äskettäin joko verkkosivuston ponnahdusikkunassa tai GitHubin uutiskirjeessä havaittiin uusi CI/CD, joka mahdollisti näiden toimien suorittamisen vähällä vaivalla.

Tietoja staattisista sivugeneraattoreista

En kiinnitä erityistä huomiota tähän alakohtaan, mutta kerron pari opinnäytetyötä, joihin tulin seuraavien valinnassa ja käytössä:

1) valitse generaattori, joka sopii ohjelmointikielellesi tai joka on mahdollisimman selkeä. Tulin tähän ajatukseen aikana, jolloin minun piti itse lisätä joitakin toimintoja, jotta sivusto toimisi, lisättävä kainalosauvoja sen vakauden ja automatisoinnin lisäämiseksi. Lisäksi tämä on hyvä syy kirjoittaa lisätoimintoja itse lisäosien muodossa;

2) mikä generaattori valita, on henkilökohtainen valinta, mutta kannattaa ottaa huomioon, että GitHub Pages -toimintojen työhön uppoamista varten sinun on ensin asennettava Jekyll. Onneksi sen avulla voit luoda verkkosivuston lähteistä suoraan arkistossa (Toistan tämän valinnallani).

Generaattorin valintani perustuu ensimmäiseen kohtaan. Pelikaani joka on kirjoitettu Pythonilla, korvasi helposti minulle vieraan Jekyllin (käytetty melkein vuoden). Tästä johtuen jopa artikkeleiden luominen ja muokkaaminen sekä verkkosivuilla työskentely antaa lisäkokemusta minua kiinnostavalla kielellä.

__

Ongelma

Päätehtävänä on kirjoittaa komentosarja (itse asiassa asetustiedosto), joka luo automaattisesti staattisia sivuja yksityisestä arkistosta. Ratkaisu sisältää virtuaaliympäristön toiminnallisuuden. Skripti itse lisää valmiita sivuja julkiseen arkistoon.

Työkaluja ratkaisuun

Työkaluja, joita käytämme ongelman ratkaisemiseen:

  • GitHub Actions;
  • Python3.7;
  • Pelikaani;
  • Git;
  • GitHub-sivut.

Liuos

Joten tutustuttuaan hieman dokumentaatioon ja ymmärtäessään, kuinka toimintojen komentosarjat kirjoitetaan, kävi selväksi, että tämä mekanismi ratkaisee täysin ilmenneen ongelman. Tätä toimintoa kirjoittaessasi sinun on tilattava. beta-testausta varten!

GitHub toimii CI/CD-muodossa sivustolle staattisella generaattorilla ja GitHub-sivuilla
Githubin itsensä kuvaus uudesta toiminnallisuudesta

Toimintokomentosarjan kirjoittaminen alkaa luomalla nimetty tiedosto kansioon .github ja sen alikansio workflows. Tämä voidaan tehdä joko manuaalisesti tai arkistosivun Toiminnot-välilehden editorista.

GitHub toimii CI/CD-muodossa sivustolle staattisella generaattorilla ja GitHub-sivuilla
Esimerkki tyhjästä kirjoituslomakkeesta

Kommentoin lomaketta lyhyesti

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.

Kirjoitetaan omamme mallin perusteella:

0) Voit myös jättää nimen "CI". Se on makuasia.

1) Seuraavaksi sinun on valittava toiminto/triggeri, joka käynnistää skriptin, meidän tapauksessamme tämä on tavallinen uuden sitoumuksen työntö arkistoon.

on:
  push

2) Jätetään myös esimerkkinä kuva, jonka perusteella skripti käynnistetään, koska Ubuntu on varsin tyytyväinen tarvittaviin toimivuuteen. katsomassa käytettävissä olevat työkalut käy selväksi, että tämä voi olla mikä tahansa tarpeellinen tai yksinkertaisesti kätevä kuva (tai siihen perustuva Docker-kontti).

  build:
    runs-on: ubuntu-latest

3) Vaiheissa luomme ensin ympäristön päätyöhön valmistautumiseksi.

3.1) mene tarvitsemamme haaraan (vakiovaihe checkout):

- uses: actions/checkout@v1

3.2) asenna Python:

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

3.3) asenna generaattorimme riippuvuudet:

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

3.4) luo hakemisto, johon sivuston sivut luodaan:

   - name: Make output folder
      run: mkdir output

4) Jotta sivustolla tehtävä työ olisi johdonmukaista, eli aiempia muutoksia ei poistettaisi ja sivuston arkistoon voidaan lisätä muutoksia ilman ristiriitoja, seuraava vaihe on kloonata sivustotietovarasto joka kerta:

   - 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

Tämä vaihe kutsuu järjestelmämuuttujia:

  • muuttuja GITHUB_ACTOR GitHub asentaa itsensä, ja tämä on käyttäjänimi, jonka takia tämä komentosarja käynnistettiin;
  • muuttuja secrets.ACCESS_TOKEN tämä syntyy tunnus Githubin hallintaan, voimme välittää sen ympäristömuuttujana asettamalla sen välilehdelle Secrets arkiston asetukset. Huomaa, että sukupolven aikana tunnus toimitetaan meille kerran, eikä siihen ole enää pääsyä. Sekä Secrets-esineiden arvot.

5) Siirrytään sivujemme luomiseen:

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

Generaattorille välitetyt parametrit vastaavat hakemistosta, johon luodut tiedostot lähetetään (-o output) ja määritystiedosto, jota käytämme luomiseen (-s publishconf.py; Voit lukea lähestymistavasta paikallisen konfiguraation ja konfiguroinnin erottamiseen julkaistavaksi Pelicanin dokumentaatiosta).

Haluan muistuttaa, mitä kansiossamme on output Sivuston arkisto on jo kloonattu.

6) Asetetaan git ja indeksoidaan muutetut tiedostomme:

    - 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

Tässä vaiheessa käytetään jo tunnettua muuttujaa ja ilmoitetaan työhakemisto, jossa tämän vaiheen komennot käynnistetään. Komento siirtyä työhakemistoon näyttäisi muuten tältä - cd output.

7) Luodaan toimitusviesti, sitoudutaan muutokset ja työnnetään ne arkistoon. Jotta sitoutuminen ei ole turhaa eikä siksi aiheuta virhettä bashissa (tulostustulos ei ole 0) — ensin tarkistetaan, onko ylipäänsä tarpeen sitoutua ja työntää jotain. Tätä varten käytämme komentoa git diff-index --quiet --cached HEAD -- joka lähettää terminaaliin 0 jos sivuston edelliseen versioon ei ole tehty muutoksia, ja 1 sellaisia ​​muutoksia on. Sitten käsittelemme tämän komennon tuloksen. Siten skriptin suorittamista koskevissa tiedoissa tallennetaan hyödyllistä tietoa sivuston tilasta tässä vaiheessa sen sijaan, että kaatuisimme automaattisesti ja lähettäisimme meille raportin komentosarjan kaatumisesta.

Teemme nämä toimet myös hakemistossamme valmiilla sivuilla.

   - 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

Tulos

Tämän seurauksena tällainen kirjoitus antaa sinun olla ajattelematta staattisten sivujen luomista. Lisäämällä muutoksia suoraan yksityiseen arkistoon, joko työskentelemällä gitin kanssa mistä tahansa järjestelmästä tai luomalla tiedoston GitHub-verkkoliittymän kautta, Actions tekee kaiken itse. Jos komentosarja kaatuu odottamatta, sähköpostiisi lähetetään ilmoitus.

Täysi koodi

Jätän työversioni, jossa viimeinen vaihe lisää ilmoituksen lähettämisen, että sitoumus on työnnetty päävarastoon.

Käytetään yllä kuvattuja salaisuuksia, joihin lisätään bot-tunnus ja käyttäjätunnus, jolle viesti tulee lähettää.

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

kuvakaappauksia

GitHub toimii CI/CD-muodossa sivustolle staattisella generaattorilla ja GitHub-sivuilla
Yhden ajon tulos, joka näkyy lähdetietovaraston Toiminnot-välilehdessä

GitHub toimii CI/CD-muodossa sivustolle staattisella generaattorilla ja GitHub-sivuilla
Viesti robotilta käsikirjoituksen valmistumisesta

Hyödyllisiä linkkejä

Toimien ymmärtäminen
Toimien syntaksi
Luettelo laukaisimista
Vaihtoehdot virtuaalisille ympäristöille
Github-sivut
Staattisten generaattorien luettelo

Lähde: will.com

Lisää kommentti