GitHub Agoj kiel CI/KD por retejo sur senmova generatoro kaj GitHub Paĝoj

GitHub Agoj kiel CI/KD por retejo sur senmova generatoro kaj GitHub Paĝoj

Iom traserĉinte Habr, mi surpriziĝis, ke tre malmultaj artikoloj estis publikigitaj pri la temo de la (beta) funkcio de GitHub - Agoj.

Ŝajnus, ke tia subkompreniĝo povas esti klarigita per la fakto, ke la funkcieco ankoraŭ estas en testado, kvankam "beta". Sed ĝi estas utila trajto de la betao, kiu permesas ĉi tiun ilon esti uzata en privataj deponejoj. Temas pri laboro kun ĉi tiu teknologio, pri kiu mi parolos en ĉi tiu artikolo.

Antaŭhistorio

Se ni komencas en ordo, tiam verŝajne indas mencii, ke en la procezo de serĉado de rapida, oportuna, facila kaj senpaga opcio por konservi personan retejon "Pri Mi", mi devis pasigi plurajn noktojn kaj kombi multajn artikolojn.

Iuj homoj elektas gastigadon, aliaj nuba servilo, kaj tiuj, kiuj ne volas kompreni la laboron, interagadon kaj pagon por ĉio ĉi, kiel alŝuti statikajn retejojn al deponejo, ĉar nun tio povas esti farita ambaŭ en GitHub kaj GitLab.

Kompreneble, ĉi tio estas la persona elekto de ĉiuj.

Mia fina elekto estis GitHub Pages.

Pri Paĝoj

Kiu ne scias gh-pages - ĉi tio estas eblo por konservi dokumentadon en la formo de retejo kaj ĝi estas liverata senpage, kaj krom dokumentado estas ankaŭ proponita stoki personajn retejojn. Ĉi tiu funkcio estas provizita de GitHub al ĉiuj uzantoj kaj disponeblas en la deponejo-agordoj.

La projekta deponejo uzas branĉon gh-pages, por uzantretejo - aparta deponejo kun la nomo username.github.io kun retejfontoj en master branĉo.

Vi povas vidi pli da detaloj en dokumentado, sed mi nur rimarku, ke GitHub estas surprize malavara permesante al iu ajn ligi sian propran domajnon al tia retejo simple aldonante dosieron. CNAME kun la domajna nomo kaj agordante la DNS de via domajna provizanto sur la GitHub-serviloj.

Mi certas, ke estas multaj artikoloj ĉi tie pri kiel disvolvi tian retejon, do pri tio mi ne plu parolos.

Problemo estiĝanta

La problemo estis, ke kiam oni uzas statikan generatoron, necesas skribi pliajn skriptojn kaj uzi bibliotekojn por simpligi la procezon de generado de paĝoj kaj ŝarĝo de ili en la deponejon. Simple, se vi stokas la fontojn en aparta privata deponejo, tiam ĉiufoje kiam estas ajna ŝanĝo en la retejo, estis necese disfaldi la lokan medion por la posta generacio de statikaj paĝoj kaj publikigo en la ĉefa retejo deponejo.

Estas abundo senmovaj generatoroj kaj ili ĉiuj havas la saman problemon. Ĉi tiuj agoj postulas tro da tempo kaj penado, kaj finfine malrapidigas laboron en la retejo, precipe post pluraj migradoj de OS al OS aŭ okazaĵoj kun perdo de datumoj sur malmolaj diskoj. (tio estis en mia kazo).

Ĵus, aŭ en ŝprucfenestra sciigo en la retejo aŭ en bulteno de GitHub, nove konstruita CI/KD estis rimarkita, kio permesis al ĉi tiuj agoj esti efektivigitaj kun minimuma peno.

Pri senmovaj paĝgeneriloj

Mi ne enfokusigos specialan atenton al ĉi tiu subitemo, sed mi dividos kelkajn tezojn, kiujn mi venis dum la elekto kaj uzo de la jenaj:

1) elektu generatoron kiu konvenas al via programlingvo, aŭ unu kiu estas kiel eble plej klara. Mi venis al ĉi tiu ideo en tempo, kiam mi mem devis aldoni iun funkciojn por ke la retejo funkciu, aldoni lambastonojn por ĝia pli granda stabileco kaj aŭtomatigo. Krome, ĉi tio estas bona kialo por skribi aldonan funkcion mem en formo de kromaĵoj;

2) kiu generatoro elekti estas persona elekto, sed indas konsideri, ke por la komenca mergo en la laboro de la GitHub Paĝoj-funkcio, vi unue devas instali Jekyll. Feliĉe, ĝi permesas vin generi retejon el fontoj rekte en la deponejo (Mi ripetos ĉi tion kun mia elekto).

Mia elekto de generatoro baziĝas sur la unua punkto. Pelikano kiu estas skribita en Python facile anstataŭigis Jekyll, kiu estas fremda al mi (uzis ĝin dum preskaŭ jaro). Rezulte, eĉ krei kaj redakti artikolojn kaj labori en retejo donas plian sperton en lingvo, kiu estas interesa por mi.

__

Formulado de la problemo

La ĉefa tasko estos verki skripton (fakte agordan dosieron), kiu aŭtomate generus senmovajn paĝojn el privata deponejo. La solvo implikos la funkciecon de virtuala medio. La skripto mem aldonos pretajn paĝojn al la publika deponejo.

Iloj por solvo

Iloj, kiujn ni uzos por solvi la problemon:

  • GitHub Agoj;
  • Python3.7;
  • Pelikano;
  • Git;
  • GitHub-paĝoj.

Problemo

Do, post iom konatiĝi kun la dokumentado kaj kompreni kiel skriptoj por Agoj estas skribitaj, evidentiĝis, ke ĉi tiu mekanismo tute solvos la aperantan problemon. Dum la skribado, vi devas aboni por uzi ĉi tiun funkcion. por beta-testado!

GitHub Agoj kiel CI/KD por retejo sur senmova generatoro kaj GitHub Paĝoj
Priskribo de la nova funkcio fare de Github mem

Skribi Actions-skripton komenciĝas per kreado de nomita dosiero en dosierujo .github kaj ĝia subdosierujo workflows. Ĉi tio povas esti farita aŭ permane aŭ de la redaktilo en la langeto Agoj sur la deponejo-paĝo.

GitHub Agoj kiel CI/KD por retejo sur senmova generatoro kaj GitHub Paĝoj
Ekzemplo de malplena skribformularo

Mi mallonge komentos la formularon

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.

Ni skribu nian propran surbaze de la ŝablono:

0) Vi ankaŭ povas lasi la nomon "CI". Estas demando de gusto.

1) Poste, vi devas elekti la agon/ellasilon, kiu lanĉos la skripton, en nia kazo ĉi tio estas la kutima puŝo de nova transdono al la deponejo.

on:
  push

2) Ni ankaŭ lasos la bildon surbaze de kiu la skripto estos lanĉita kiel ekzemplo, ĉar Ubuntu estas sufiĉe kontenta pri la necesa funkcio. Rigardante disponeblaj iloj evidentiĝas, ke tio povas esti ajna necesa aŭ simple oportuna bildo (aŭ Docker-ujo bazita sur ĝi).

  build:
    runs-on: ubuntu-latest

3) En la paŝoj, ni unue starigos la medion por prepari la ĉefan laboron.

3.1) iru al la branĉo, kiun ni bezonas (norma paŝo checkout):

- uses: actions/checkout@v1

3.2) instali Python:

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

3.3) instali la dependecojn de nia generatoro:

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

3.4) kreu dosierujon en kiu la paĝoj de la retejo estos generitaj:

   - name: Make output folder
      run: mkdir output

4) Por ke la laboro en la retejo estu konsekvenca, nome por ne forigi antaŭajn ŝanĝojn kaj povi aldoni ŝanĝojn al la retejo-deponejo sen konfliktoj, la sekva paŝo estos ĉiufoje kloni la retejo-deponejon:

   - 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

Ĉi tiu paŝo nomas sistemajn variablojn:

  • variablo GITHUB_ACTOR GitHub instalas sin, kaj ĉi tiu estas la uzantnomo pro kies kulpo ĉi tiu skripto estis lanĉita;
  • variablo secrets.ACCESS_TOKEN ĉi tio estas generita ĵetono por administri Github, ni povas pasi ĝin kiel mediovariablo fiksante ĝin en la langeto Secrets niajn deponejajn agordojn. Bonvolu noti, ke dum generacio la ĵetono estos provizita al ni unufoje, ne estos plu aliro al ĝi. Same kiel la valoroj de la Sekretaj eroj.

5) Ni daŭrigu generi niajn paĝojn:

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

La parametroj pasitaj al la generatoro respondecas pri la dosierujo kie la generitaj dosieroj estos senditaj (-o output) kaj la agorda dosiero, kiun ni uzas por generi (-s publishconf.py; Vi povas legi pri la aliro al apartigo de la loka agordo kaj la agordo por publikigo en la dokumentado de Pelican).

Lasu min memorigi al vi kio estas en nia dosierujo output La retejo-deponejo jam estis klonita.

6) Ni agordu git kaj indeksu niajn ŝanĝitajn dosierojn:

    - 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

Je ĉi tiu punkto, jam konata variablo estas uzata kaj la labordosierujo estas indikita en kiu la komandoj de ĉi tiu paŝo estos lanĉitaj. La komando por iri al la labordosierujo aspektus alie kiel - cd output.

7) Ni generu mesaĝon pri kompromiso, faru la ŝanĝojn kaj puŝu ilin en la deponejon. Por ke la kommit ne estas vana kaj tial ne produktas eraron en bash (la eligorezulto ne estas 0) — unue, ni kontrolu, ĉu necesas entute fari kaj puŝi ion. Por fari tion ni uzas la komandon git diff-index --quiet --cached HEAD -- kiu eligos al la terminalo 0 se ne estas ŝanĝoj rilate al la antaŭa versio de la retejo, kaj 1 estas tiaj ŝanĝoj. Tiam ni procesas la rezulton de ĉi tiu komando. Tiel, en la informoj pri la ekzekuto de la skripto, ni registros utilajn informojn pri la stato de la retejo en ĉi tiu etapo, anstataŭ aŭtomate kraŝi kaj sendi al ni raporton pri la skripto-kraŝo.

Ni ankaŭ faras ĉi tiujn agojn en nia adresaro kun pretaj paĝoj.

   - 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

rezulto

Kiel rezulto, tia skripto permesas al vi ne pensi pri kreado de senmovaj paĝoj. Aldonante ŝanĝojn rekte al privata deponejo, ĉu laborante kun git de sub iu ajn sistemo aŭ kreante dosieron per la interfaco de GitHub, Agoj faros ĉion mem. Se la skripto kraŝas neatendite, sciigo estos sendita al via retpoŝto.

Plena kodo

Mi lasos mian funkciantan version, en kiu la lasta paŝo aldonas sendon de sciigo, ke transdono estis puŝita al la ĉefa deponejo.

La supre priskribitaj Sekretoj estas uzataj, kie la bot-ĵetono kaj la uzantidentigilo al kiu la mesaĝo devas esti sendita estas aldonitaj.

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

Ekrankopioj

GitHub Agoj kiel CI/KD por retejo sur senmova generatoro kaj GitHub Paĝoj
La rezulto de unu el la kuroj montritaj en la langeto Agoj de la fonta deponejo

GitHub Agoj kiel CI/KD por retejo sur senmova generatoro kaj GitHub Paĝoj
Mesaĝo de la bot pri la kompletigo de la skripto

utilaj ligoj

Komprenante Agojn
Agoj sintakso
Listo de ellasiloj
Opcioj por virtualaj medioj
Github Paĝoj
Listo de Statika Generatoro

fonto: www.habr.com

Aldoni komenton