Azioni GitHub cum'è CI/CD per u situ di u Generatore Staticu è e Pagine GitHub

Azioni GitHub cum'è CI/CD per u situ di u Generatore Staticu è e Pagine GitHub

Dopu avè scupertu Habr un pocu, eru surprised chì assai pochi articuli sò stati publicati nantu à u tema di a funzione di GitHub (beta) - Azzioni.

Sembra chì una tale understatement pò esse spiegata da u fattu chì a funziunalità hè sempre in prova, anche se "beta". Ma hè una funzione utile di a beta chì permette à questu strumentu per esse usatu in repositori privati. Si tratta di travaglià cù sta tecnulugia chì vi parleraghju in questu articulu.

Preistoria

Sè avemu principiatu in ordine, allora hè prubabilmente degne di mencionà chì in u prucessu di ricerca di una opzione rapida, còmuda, faciule è libera per almacenà un situ web persunale "About Me", aghju avutu à passà parechje notti è pettine assai articuli.

Qualchidunu sceglie l'ospitu, l'altri un servitore in nuvola, è quelli chì ùn volenu micca capisce u travagliu, l'interazzione è u pagamentu per tuttu questu cum'è uploading siti statici à un repository, postu chì avà questu pò esse fattu in GitHub è GitLab .

Di sicuru, questu hè a scelta persunale di tutti.

A mo scelta finale era GitHub Pages.

À propositu di e Pagine

Chi nun sà gh-pages - Questa hè una opzione per almacenà a documentazione in forma di un situ web è hè furnita gratuitamente, è in più di a documentazione, hè ancu prupostu di guardà siti web persunali. Questa funziunalità hè furnita da GitHub à tutti l'utilizatori è hè dispunibule in i paràmetri di repository.

U repositoriu di u prugettu usa una branche gh-pages, per un situ d'utilizatore - un repository separatu cù u nome username.github.io cù fonti di situ in master ramu.

Pudete vede più in documentazione, ma lasciami solu nutà chì GitHub hè sorprendentemente generoso per permette à qualcunu di ligà u so propiu duminiu à un tali situ semplicemente aghjunghjendu un schedariu. CNAME cù u nome di duminiu è cunfigurà u DNS di u vostru fornitore di duminiu nantu à i servitori GitHub.

Sò sicuru chì ci sò parechji articuli quì nantu à cumu sviluppà un tali situ, per quessa ùn hè micca ciò ch'e aghju da parlà più.

Prublemu chì sorge

U prublema era chì quandu si usa un generatore staticu, ci hè bisognu di scrive script supplementari è aduprà biblioteche per simplificà u prucessu di generazione di e pagine è di carica in u repository. Simply, se guardate e fonti in un repository privatu separatu, allora ogni volta chì ci hè un cambiamentu in u situ, era necessariu di implementà l'ambiente lucale per a generazione successiva di pagine statiche è publicazione in u repositoriu di u situ principale.

Ci hè una abbundanza generatori statici è tutti anu u listessu prublema. Queste azzioni piglianu troppu tempu è sforzu, è infine rallentà u travagliu nantu à u situ, soprattuttu dopu à parechje migrazioni da OS à OS o incidenti cù a perdita di dati nantu à i discu duru. (questu era u casu in u mo casu).

Recentemente, o in una notificazione pop-up in u situ web o in un newsletter da GitHub, hè statu nutatu un CI / CD di novu custruitu, chì hà permessu di esse realizatu queste azzioni cù u minimu sforzu.

Circa i generatori di pagine statiche

Ùn aghju micca cuncentratu una attenzione speciale nantu à questu sub-elementu, ma sparteraghju un paru di tesi chì sò ghjuntu durante a selezzione è l'usu di i seguenti:

1) sceglite un generatore chì cunvene à a vostra lingua di prugrammazione, o quellu chì hè u più chjaru pussibule. Aghju ghjuntu à questa idea in un momentu quandu aghju avutu aghjustà qualchì funziunalità per u situ per travaglià, aghjunghje crutches per a so più grande stabilità è automatizazione. Inoltre, questu hè un bonu mutivu per scrive funziunalità supplementu sè stessu in forma di plugins;

2) quale generatore di sceglie hè una scelta persunale, ma vale a pena cunsiderà chì per l'immersione iniziale in u travagliu di e funziunalità di e Pagine GitHub, avete prima installatu. Jekyll. Fortunatamente, vi permette di generà un situ web da fonti direttamente in u repository (Ripeteraghju questu cù a mo scelta).

A mo scelta di generatore hè basatu annantu à u primu puntu. Pellicanu chì hè scrittu in Python facilmente rimpiazzatu Jekyll, chì hè straneru per mè (usu per quasi un annu). In u risultatu, ancu creà è edità articuli è travaglià in un situ web dà una sperienza supplementaria in una lingua chì hè interessante per mè.

__

Formulazione di u prublema

U compitu principale serà di scrive un script (in realtà un schedariu di cunfigurazione) chì generà automaticamente pagine statiche da un repository privatu. A suluzione implicarà a funziunalità di un ambiente virtuale. U script stessu aghjunghje pagine pronti à u repositoriu publicu.

Strumenti per suluzione

Strumenti chì avemu aduprà per risolve u prublema:

  • Azzioni GitHub;
  • Python3.7;
  • Pelicanu;
  • Git;
  • Pagine GitHub.

Solución di salvezza

Allora, dopu avè familiarizatu cù a ducumentazione un pocu è capiscenu cumu i scripts per l'Azzioni sò scritti, hè diventatu chjaru chì stu miccanisimu risolve cumplettamente u prublema chì hè ghjuntu. À u mumentu di a scrittura, duvete abbonate per aduprà sta funziunalità. per a prova beta!

Azioni GitHub cum'è CI/CD per u situ di u Generatore Staticu è e Pagine GitHub
Descrizzione di a nova funziunalità da Github stessu

A scrittura di un script Actions principia da creà un schedariu chjamatu in un cartulare .github è u so sottucartulariu workflows. Questu pò esse fattu manualmente o da l'editore in a tabulazione Azioni in a pagina di repository.

Azioni GitHub cum'è CI/CD per u situ di u Generatore Staticu è e Pagine GitHub
Esempiu di una forma di scrittura in biancu

Cumentu brevemente nantu à a forma

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.

Scrivemu u nostru propiu basatu annantu à u mudellu:

0) Pudete ancu lascià u nome "CI". Hè una questione di gustu.

1) Dopu, avete bisognu di selezziunà l'azzione / trigger chì lanciarà u script, in u nostru casu, questu hè u solitu push di un novu impegnu à u repository.

on:
  push

2) L'imagine nantu à a basa di a quale serà lanciatu u script serà ancu lasciata da l'esempiu, postu chì Ubuntu Hè abbastanza satisfacente in termini di funzionalità richieste. Fighjendu arnesi dispunibuli diventa chjaru chì questu pò esse qualsiasi imagine necessariu o simplicemente convenientu (o un containeru Docker basatu annantu à questu).

  build:
    runs-on: ubuntu-latest

3) In i passi, avemu prima stallatu l'ambienti per preparà u travagliu principale.

3.1) vai à u ramu chì avemu bisognu (passu standard checkout):

- uses: actions/checkout@v1

3.2) installate Python:

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

3.3) installate e dipendenze di u nostru generatore:

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

3.4) creà un repertoriu in quale e pagine di u situ seranu generate:

   - name: Make output folder
      run: mkdir output

4) Per chì u travagliu nantu à u situ sia coherente, vale à dì, per ùn sguassà i cambiamenti precedenti è per pudè aghjunghje cambiamenti à u repository di u situ senza cunflitti, u prossimu passu serà di clone u repository di u situ ogni volta:

   - 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

Stu passu chjama variabili di u sistema:

  • variabile GITHUB_ACTOR GitHub s'installa, è questu hè u nome d'utilizatore per a culpa di quale stu script hè statu lanciatu;
  • variabile secrets.ACCESS_TOKEN questu hè generatu token per a gestione di Github, pudemu passà cum'è una variabile di l'ambiente mettendulu in a tabulazione Secrets i nostri paràmetri di repository. Per piacè nutate chì durante a generazione u token ci sarà furnitu una volta, ùn ci sarà più accessu à questu. Cum'è i valori di l'articuli Secrets.

5) Passemu à generà e nostre pagine:

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

I paràmetri passati à u generatore sò rispunsevuli di u cartulare induve i fugliali generati seranu mandati (-o output) è u schedariu di cunfigurazione chì avemu usatu per generà (-s publishconf.py; Pudete leghje nantu à l'approcciu per separà a cunfigurazione lucale è a cunfigurazione per a publicazione in a documentazione Pelican).

Lasciami ricurdà ciò chì hè in u nostru cartulare output U repositoriu di u situ hè digià statu clonatu.

6) Configuremu git è indexemu i nostri schedarii cambiati:

    - 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

À questu puntu, una variabile digià cunnisciuta hè aduprata è u cartulare di travagliu hè indicatu in quale i cumandamenti da questu passu seranu lanciati. U cumandimu per andà in u cartulare di travagliu altrimenti parerebbe - cd output.

7) Generemu un missaghju di cummissione, committemu i cambiamenti è spinghjeli in u repository. Cusì chì l'impegnu ùn hè micca in vanu è per quessa ùn pruduce micca un errore in bash (u risultatu di output ùn hè micca 0) - prima, verificate s'ellu hè necessariu di impegnà è spinghje qualcosa in tuttu. Per fà questu avemu aduprà u cumandamentu git diff-index --quiet --cached HEAD -- chì hà da esse uscita à u terminal 0 s'ellu ùn ci hè micca cambiamenti relative à a versione precedente di u situ, è 1 ci sò tali cambiamenti. Allora processemu u risultatu di stu cumandamentu. Cusì, in l'infurmazioni nantu à l'esekzione di u script, avemu da registrà infurmazioni utili nantu à u statu di u situ in questa fase, invece di crashing automaticamente è di mandà un rapportu nantu à u script crash.

Eseguimu ancu queste azzioni in u nostru annuariu cù pagine pronti.

   - 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

risultatu

In u risultatu, un tali script permette micca di pensà à creà pagine statiche. Aghjunghjendu cambiamenti direttamente à un repositoriu privatu, sia per travaglià cù git da qualsiasi sistema o creendu un schedariu attraversu l'interfaccia web GitHub, Actions farà tuttu. Se u script crashes inaspettatamente, una notificazione serà mandata à u vostru email.

Codice cumpletu

Lascià a mo versione di travagliu, in quale l'ultimu passu aghjusta l'inviu di una notificazione chì un commit hè statu imbuttatu à u repositoriu principale.

I Secrets descritti sopra sò usati, induve u token di bot è l'ID d'utilizatore à quale u messagiu deve esse mandatu sò aghjuntu.

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

Azioni GitHub cum'è CI/CD per u situ di u Generatore Staticu è e Pagine GitHub
U risultatu di una di e corse affissate in a tabulazione Azioni di u repositoriu fonte

Azioni GitHub cum'è CI/CD per u situ di u Generatore Staticu è e Pagine GitHub
Messaghju da u bot nantu à a fine di u script

E ligami utili

Capisce l'Azzioni
Sintassi di l'azzioni
Lista di triggers
Opzioni per ambienti virtuali
Pagine Github
Lista di generatori statici

Source: www.habr.com

Cumprate un hosting affidabile per i siti cù prutezzione DDoS, servitori VPS VDS 🔥 Cumprate un hosting di siti web affidabile cù prutezzione DDoS, servitori VPS VDS | ProHoster