GitHub toimib staatilise generaatori saidi ja GitHubi lehtede jaoks CI/CD-na

GitHub toimib staatilise generaatori saidi ja GitHubi lehtede jaoks CI/CD-na

Olles Habrit veidi uurinud, olin üllatunud, et GitHubi (beeta) funktsiooni - toimingud - teemal on avaldatud väga vähe artikleid.

Näib, et sellist alahinnangut saab seletada asjaoluga, et funktsionaalsus on veel testimisel, ehkki "beeta". Kuid see on beetaversiooni kasulik funktsioon, mis võimaldab seda tööriista kasutada privaatsetes hoidlates. Selles artiklis räägin just selle tehnoloogiaga töötamisest.

Eelajalooline

Kui alustada järjekorras, siis tasub ilmselt mainida, et isikliku “Minust” veebisaidi hoiustamise kiire, mugava, lihtsa ja tasuta võimaluse otsimisel tuli mitu ööd veeta ja palju artikleid läbi kammida.

Mõned inimesed valivad hostimise, teised pilveserveri ja need, kes ei taha kõige selle tööst, suhtlusest ja maksmisest aru saada, näiteks staatiliste saitide hoidlasse üleslaadimine, kuna nüüd saab seda teha nii GitHubis kui ka GitLabis.

Loomulikult on see igaühe isiklik valik.

Minu lõplik valik oli GitHub Pages.

Teave Pagesi kohta

Kes ei tea gh-pages - see on võimalus dokumentatsiooni salvestamiseks veebisaidi kujul ja see on tasuta ning lisaks dokumentatsioonile on tehtud ettepanek salvestada ka isiklikke veebisaite. Seda funktsiooni pakub GitHub kõigile kasutajatele ja see on saadaval hoidla seadetes.

Projekti hoidla kasutab haru gh-pages, kasutaja saidi jaoks - eraldi hoidla nimega username.github.io saidi allikatega master haru.

Näete rohkem üksikasju dokumentatsioonis, kuid lubage mul lihtsalt märkida, et GitHub on üllatavalt helde, lubades igaühel linkida oma domeeni sellise saidiga, lisades lihtsalt faili CNAME domeeninimega ja oma domeenipakkuja DNS-i seadistamine GitHubi serverites.

Olen kindel, et siin on palju artikleid selle kohta, kuidas sellist saiti arendada, nii et sellest ma pikemalt ei räägi.

Probleem tekkimas

Probleemiks oli see, et staatilise generaatori kasutamisel on vaja kirjutada täiendavaid skripte ja kasutada teeke, et lihtsustada lehtede genereerimise ja hoidlasse laadimise protsessi. Lihtsalt, kui salvestate allikad eraldi privaatsesse hoidlasse, siis iga kord, kui saidil tehakse muudatusi, tuli staatiliste lehtede järgnevaks genereerimiseks ja saidi põhihoidlas avaldamiseks juurutada kohalik keskkond.

Seal on küllus staatilised generaatorid ja neil kõigil on sama probleem. Need toimingud võtavad liiga palju aega ja vaeva ning aeglustavad lõppkokkuvõttes tööd saidil, eriti pärast mitut üleminekut operatsioonisüsteemist OS-i või juhtumeid, mis on seotud andmete kadumisega kõvaketastel (minu puhul oli see nii).

Just hiljuti märgati kas veebisaidi hüpikteatises või GitHubi uudiskirjas vastvalminud CI/CD, mis võimaldas neid toiminguid teha minimaalse pingutusega.

Staatiliste lehtede generaatorite kohta

Sellele alapunktile ma erilist tähelepanu ei pööra, kuid jagan paari teesi, milleni jõudsin järgmiste valikute ja kasutamise käigus:

1) valige oma programmeerimiskeelele sobiv või võimalikult selge generaator. Jõudsin selle ideeni ajal, mil pidin ise lisama saidi toimimiseks funktsionaalsust, lisama kargud selle suurema stabiilsuse ja automatiseerimise huvides. Lisaks on see hea põhjus ise lisafunktsionaalsust pluginate näol kirjutada;

2) millist generaatorit valida, on isiklik valik, kuid tasub arvestada, et GitHub Pagesi funktsionaalsuse töösse esmaseks süvenemiseks tuleb esmalt installida Jekyll. Õnneks võimaldab see luua veebisaiti otse hoidlas olevatest allikatest (Ma kordan seda oma valikuga).

Minu generaatori valik lähtub esimesest punktist. pelikan mis on Pythonis kirjutatud, asendas kergesti minu jaoks võõra Jekylli (kasutasin peaaegu aasta). Tänu sellele annab isegi artiklite loomine ja toimetamine ning veebilehel töötamine lisakogemust mulle huvitavas keeles.

__

Probleemi avaldus

Peamine ülesanne on kirjutada skript (tegelikult konfiguratsioonifail), mis genereeriks privaatsest hoidlast automaatselt staatilisi lehti. Lahendus hõlmab virtuaalse keskkonna funktsionaalsust. Skript ise lisab valmis lehed avalikku hoidlasse.

Vahendid lahenduseks

Tööriistad, mida probleemi lahendamiseks kasutame:

  • GitHubi toimingud;
  • Python3.7;
  • Pelikan;
  • Git;
  • GitHubi lehed.

Lahendus

Niisiis, pärast veidi dokumentatsiooniga tutvumist ja toimingute skriptide kirjutamise mõistmist, sai selgeks, et see mehhanism lahendab täielikult tekkinud probleemi. Kirjutamise ajal peate selle funktsiooni kasutamiseks tellima. beetatestimiseks!

GitHub toimib staatilise generaatori saidi ja GitHubi lehtede jaoks CI/CD-na
Githubi enda uue funktsiooni kirjeldus

Toimingute skripti kirjutamine algab kaustas nimega faili loomisega .github ja selle alamkaust workflows. Seda saab teha kas käsitsi või hoidla lehe vahekaardil Toimingud olevas redaktoris.

GitHub toimib staatilise generaatori saidi ja GitHubi lehtede jaoks CI/CD-na
Tühja skriptivormi näide

Ma kommenteerin lühidalt vormi

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.

Kirjutame malli põhjal oma:

0) Võite jätta ka nime "CI". See on maitse asi.

1) Järgmiseks peate valima toimingu/päästiku, mis käivitab skripti, meie puhul on see tavapärane uue kohustuse tõuge hoidlasse.

on:
  push

2) Jätame näitena ka pildi, mille alusel skript käivitatakse, kuna Ubuntu on vajaliku funktsionaalsusega üsna rahul. Vaatan saadaolevad tööriistad saab selgeks, et selleks võib olla ükskõik milline vajalik või lihtsalt mugav pilt (või sellel põhinev Dockeri konteiner).

  build:
    runs-on: ubuntu-latest

3) Sammudes paneme esmalt paika keskkonna põhitööks valmistumiseks.

3.1) minge vajalikku filiaali (standardsamm checkout):

- uses: actions/checkout@v1

3.2) installige Python:

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

3.3) installige meie generaatori sõltuvused:

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

3.4) looge kataloog, kuhu saidi lehed luuakse:

   - name: Make output folder
      run: mkdir output

4) Selleks, et saidil tehtav töö oleks järjepidev, st ei kustutaks varasemaid muudatusi ja saaks saidi hoidlasse konfliktideta muudatusi lisada, on järgmise sammuna saidi hoidla iga kord kloonida:

   - 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

See samm kutsub esile süsteemimuutujad:

  • muutuv GITHUB_ACTOR GitHub installib end ise ja see on kasutajanimi, kelle süül see skript käivitati;
  • muutuv secrets.ACCESS_TOKEN see genereeritakse token Githubi haldamiseks, saame selle edastada keskkonnamuutujana, määrates selle vahekaardil Secrets meie hoidla seaded. Pange tähele, et genereerimise ajal antakse märk meile üks kord, sellele enam juurdepääsu ei ole. Nagu ka saladuste üksuste väärtused.

5) Liigume edasi oma lehtede loomise juurde:

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

Generaatorile edastatud parameetrid vastutavad kataloogi eest, kuhu genereeritud failid saadetakse (-o output) ja konfiguratsioonifaili, mida genereerimiseks kasutame (-s publishconf.py; Kohaliku konfiguratsiooni ja konfiguratsiooni eraldamise kohta avaldamiseks saate lugeda Pelicani dokumentatsioonist).

Lubage mul teile meelde tuletada, mis on meie kaustas output Saidihoidla on juba kloonitud.

6) Seadistame giti ja indekseerime oma muudetud failid:

    - 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

Siinkohal kasutatakse juba teadaolevat muutujat ja näidatakse töökataloog, kus selle sammu käsud käivitatakse. Töökataloogi mineku käsk näeks muidu välja selline - cd output.

7) Loome kinnitusteate, kinnitame muudatused ja lükkame need hoidlasse. Nii et sidumine ei oleks asjatu ega tekitaks seetõttu bashis viga (väljundtulemus ei ole 0) — kõigepealt kontrollime, kas on üldse vaja midagi pühenduda ja peale suruda. Selleks kasutame käsku git diff-index --quiet --cached HEAD -- mis väljub terminali 0 kui saidi eelmise versiooniga võrreldes pole muudatusi tehtud ja 1 selliseid muutusi on. Seejärel töötleme selle käsu tulemust. Seega salvestame skripti täitmise teabes kasulikku teavet saidi oleku kohta selles etapis, selle asemel, et automaatselt kokku jooksta ja meile skripti krahhi kohta aruanne saata.

Samuti teostame neid toiminguid oma kataloogis valmis lehtedega.

   - 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

Tulemus

Selle tulemusena võimaldab selline skript teil mitte mõelda staatiliste lehtede loomisele. Lisades muudatusi otse privaatsesse hoidlasse, töötades gitiga mis tahes süsteemi alt või luues faili GitHubi veebiliidese kaudu, teeb Actions kõik ise. Kui skript jookseb ootamatult kokku, saadetakse teie meilile teatis.

Täielik kood

Jätan oma tööversiooni, mille viimane samm lisab teate saatmise, et kohustus on põhihoidlasse lükatud.

Kasutatakse ülalkirjeldatud Saladused, kuhu lisatakse boti tunnus ja kasutaja ID, kellele sõnum tuleb saata.

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

Screenshots

GitHub toimib staatilise generaatori saidi ja GitHubi lehtede jaoks CI/CD-na
Lähtehoidla vahekaardil Toimingud kuvatud ühe käitamise tulemus

GitHub toimib staatilise generaatori saidi ja GitHubi lehtede jaoks CI/CD-na
Sõnum robotilt skripti valmimise kohta

Kasulikud lingid

Toimingute mõistmine
Toimingute süntaks
Päästikute loend
Virtuaalsete keskkondade valikud
Githubi lehed
Staatilise generaatori loend

Allikas: www.habr.com

Lisa kommentaar