Çalakiyên GitHub wekî CI/CD ji bo malperek li ser hilberînerek statîk û Rûpelên GitHub

Çalakiyên GitHub wekî CI/CD ji bo malperek li ser hilberînerek statîk û Rûpelên GitHub

Piştî ku Habr hinekî geriyam, ez şaş bûm ku pir hindik gotar li ser mijara taybetmendiya GitHub (beta) - Çalakî hatine weşandin.

Wusa dixuye ku kêmkirina weha dikare bi vê yekê were rave kirin ku fonksiyon hîn jî di ceribandinê de ye, her çend "beta" be. Lê ew taybetmendiyek kêrhatî ya betayê ye ku dihêle ku ev amûr di depoyên taybet de were bikar anîn. Ew li ser xebata bi vê teknolojiyê re ye ku ez ê di vê gotarê de biaxivim.

Prehistory

Ger em bi rêz dest pê bikin, wê hingê belkî hêjayî gotinê ye ku di pêvajoya lêgerîna vebijarkek bilez, hêsan, hêsan û belaş de ji bo hilanîna malperek kesane ya "About Me" de, min neçar ma ku çend şevan derbas bikim û gelek gotaran bişopînim.

Hin kes mêvandariyê hildibijêrin, yên din serverek ewr, û yên ku naxwazin kar, têkilî û dravdana ji bo van hemîyan fam bikin mîna barkirina malperên statîk li depoyek, ji ber ku naha ev dikare hem li ser GitHub û hem jî li GitLab were kirin.

Bê guman, ev bijartina kesane ya her kesî ye.

Hilbijartina min a paşîn Rûpelên GitHub bû.

Der barê Rûpelên

Kî nizane gh-pages - ev vebijarkek e ji bo tomarkirina belgeyan di forma malperê de û belaş tê pêşkêş kirin, û ji bilî belgekirinê, ji bo hilanîna malperên kesane jî tê pêşniyar kirin. Vê fonksiyonê ji hêla GitHub ve ji hemî bikarhêneran re tê peyda kirin û di mîhengên depoyê de peyda dibe.

Depoya projeyê şaxek bikar tîne gh-pages, ji bo malperek bikarhêner - depoyek cihê bi navê username.github.io bi çavkaniyên malperê di nav de master gûlî.

Hûn dikarin hûrguliyên bêtir bibînin di belgeyê de, lê bihêle ez tenê bibêjim ku GitHub bi awakî ecêb bi comerdî ye ku destûrê dide her kesê ku bi tenê pelek lê zêde bike domaina xwe bi malperek weha ve girêde. CNAME bi navê domainê û sazkirina DNS-ya pêşkêşvanê domaina xwe li ser pêşkêşkerên GitHub.

Ez pê bawer im ku li vir gelek gotar hene ku meriv çawa malperek wusa pêşdixe, ji ber vê yekê ne ya ku ez ê bêtir li ser biaxivim ev e.

Pirsgirêk derdikeve

Pirsgirêk ev bû ku dema ku jeneratorek statîk bikar tîne, pêdivî bi nivîsandina nivîsarên zêde û karanîna pirtûkxaneyan heye ku pêvajoya hilberîna rûpelan û barkirina wan di depoyê de hêsan bike. Bi tenê, heke hûn çavkaniyan di depoyek taybet a cihêreng de hilînin, wê hingê her carê ku li ser malperê guherînek çêbibe, pêdivî bû ku hawîrdora herêmî ji bo nifşa paşîn a rûpelên statîk û weşandina di depoya malpera sereke de were bicîh kirin.

Gelekî heye jeneratorên statîk û ew hemî heman pirsgirêk hene. Van kiryaran pir dem û hewldan digirin, û di dawiyê de xebata li ser malperê hêdî dikin, nemaze piştî çend koçên ji OS-ê berbi OS-ê an bûyerên windabûna daneyê li ser dîskên hişk. (ev di doza min de bû).

Di van demên dawî de, an di agahdariyek pop-up-ê de li ser malperê an jî di nûçenameyek ji GitHub de, CI/CD-ya nû hatî çêkirin hate dîtin, ku ev gengaz kir ku meriv van çalakiyan bi hewildanek hindiktirîn pêk bîne.

Di derbarê jeneratorên rûpelê statîk de

Ez ê bi taybetî bala xwe nekim ser vê jêr-maddeyê, lê ez ê çend tezên ku ez di dema hilbijartî û karanîna jêrîn de gihîştim parve bikim:

1) jeneratorek ku li gorî zimanê bernameya we ye, an yek ku bi qasî ku gengaz zelal e hilbijêrin. Ez gihîştim vê ramanê di demekê de ku min bi xwe neçar ma ku ji bo ku malper bixebite hin fonksiyonan lê zêde bikim, ji bo aramî û otomasyona wê ya mezintir kelûpelan lê zêde bikim. Wekî din, ev sedemek baş e ku hûn bi xwe di forma pêvekan de fonksiyonên zêde binivîsin;

2) kîjan jeneratorê hilbijêrin bijarek kesane ye, lê hêja ye ku meriv bifikire ku ji bo ketina destpêkê di xebata fonksiyona Rûpelên GitHub de, divê hûn pêşî saz bikin Jekyll. Xwezî, ew dihêle hûn malperek ji çavkaniyên rasterast di depoyê de çêbikin (Ez ê bi hilbijartina xwe vê yekê dubare bikim).

Hilbijartina min a jeneratorê li ser xala yekem e. Teyrê pelîkan ku di Python de hatî nivîsandin bi hêsanî şûna Jekyll girt, ku ji min re xerîb e (Nêzîkî salekê ew bikar anî). Di encamê de, tewra afirandin û sererastkirina gotaran û xebata li ser malperek bi zimanekî ku ji bo min balkêş e, ezmûnek zêde dide.

__

Formulkirina pirsgirêkê

Karê sereke dê nivîsandina skrîptekê be (bi rastî pelek vesazkirinê) ku bixweber rûpelên statîk ji depoyek taybet çêbike. Çareserî dê fonksiyona jîngehek virtual pêk bîne. Skrîpta bixwe dê rûpelên amadekirî li depoya giştî zêde bike.

Amûrên çareseriyê

Amûrên ku em ê ji bo çareserkirina pirsgirêkê bikar bînin:

  • Çalakiyên GitHub;
  • Python3.7;
  • Teyrê pelîkan;
  • Git;
  • Rûpelên GitHub.

Troubleshooting

Ji ber vê yekê, piştî ku piçekî bi belgeyê re nas kirin û fêm kirin ka nivîsên ji bo Çalakiyan çawa têne nivîsandin, eşkere bû ku ev mekanîzma dê bi tevahî pirsgirêka ku derketiye çareser bike. Di dema nivîsandinê de, divê hûn bibin abone da ku vê fonksiyonê bikar bînin. ji bo ceribandina beta!

Çalakiyên GitHub wekî CI/CD ji bo malperek li ser hilberînerek statîk û Rûpelên GitHub
Danasîna fonksiyona nû ji hêla Github bixwe ve

Nivîsandina skrîpta Çalakiyan bi afirandina peldankek binavkirî di peldankekê de dest pê dike .github û binpeldanka wê workflows. Ev dikare bi destan an ji edîtorê di tabloya Çalakiyên li ser rûpela depoyê de were kirin.

Çalakiyên GitHub wekî CI/CD ji bo malperek li ser hilberînerek statîk û Rûpelên GitHub
Mînaka forma skrîptê ya vala

Ez ê bi kurtasî li ser formê şîrove bikim

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.

Ka em li ser şablonê xweya xwe binivîsin:

0) Hûn dikarin navê "CI" jî bihêlin. Mesele çêjekê ye.

1) Dûv re, hûn hewce ne ku çalakiyek/teşkîlata ku dê skrîptê bide destpêkirin hilbijêrin, di rewşa me de ev guheztina asayî ya peywirdariyek nû ye li depoyê.

on:
  push

2) Di heman demê de em ê wêneya ku li ser bingeha wê skrîptê were destpêkirin jî wekî mînak bihêlin, ji ber ku Ubuntu ji fonksiyona pêwîst têr e. Dinêre amûrên bikêrhatî eşkere dibe ku ev dikare wêneyek pêdivî an hêsan hêsan be (an jî konteynirek Docker ku li ser bingeha wê ye).

  build:
    runs-on: ubuntu-latest

3) Di gavan de, em ê pêşî jîngehê saz bikin ku ji bo xebata sereke amade bikin.

3.1) biçin şaxê ku em hewce ne (gava standard checkout):

- uses: actions/checkout@v1

3.2) Python saz bikin:

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

3.3) girêdanên jeneratorê me saz bikin:

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

3.4) pelrêçek çêbikin ku tê de rûpelên malperê têne çêkirin:

   - name: Make output folder
      run: mkdir output

4) Ji bo ku xebata li ser malperê domdar be, ango, guheztinên berê jê nebin û bikarin guhertinan li depoya malperê bêyî nakokî zêde bikin, gava din dê her carê klonkirina depoya malperê be:

   - 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

Vê gavê guhêrbarên pergalê vedibêje:

  • têgûherr GITHUB_ACTOR GitHub xwe saz dike, û ev navê bikarhêner e ku bi xeletiya wî ev nivîsar hatiye destpêkirin;
  • têgûherr secrets.ACCESS_TOKEN ev tê çêkirin nîşanek ji bo birêvebirina Github, em dikarin wê wekî guhêrbarek jîngehê bi danîna wê di tabê de derbas bikin Secrets mîhengên depoya me. Ji kerema xwe not bikin ku di dema nifşê de nîşanek dê carekê ji me re were peyda kirin, dê çu gihîştina wê tune be. Her weha nirxên tiştên Veşartî.

5) Werin em li ser hilberîna rûpelên xwe biçin:

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

Parametreyên ku ji jeneratorê re derbas dibin ji pelrêça ku pelên hatî çêkirin dê werin şandin berpirsiyar in (-o output) û pelê veavakirinê ya ku em ji bo hilberînê bikar tînin (-s publishconf.py; Hûn dikarin li ser nêzîkbûna veqetandina konfigurasyona herêmî û mîhengê ji bo weşandinê di belgeya Pelican de bixwînin.).

Di peldanka me de çi heye, bihêle ez bi bîr bînim output Depoya malperê jixwe hatiye klon kirin.

6) Werin em git saz bikin û pelên xwe yên guherî îndeks bikin:

    - 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

Di vê nuqteyê de, guhêrbarek jixwe naskirî tê bikar anîn û pelrêça xebatê tê destnîşan kirin ku tê de emrên ji vê gavê têne destpêkirin. Fermana ku diçe pelrêça xebatê dê wekî din xuya bike - cd output.

7) Ka em peyamek commit çêkin, guheztinan bikin û wan bixin nav depoyê. Ji ber vê yekê ku commit ne betal be û ji ber vê yekê di bash de xeletiyek çênebe (encama derketinê ne 0) - Pêşîn, em binihêrin ka gelo pêdivî ye ku meriv bi tevahî tiştek bike û bikişîne. Ji bo vê yekê em fermanê bikar tînin git diff-index --quiet --cached HEAD -- ku dê derkeve termînalê 0 eger tu guhertin bi guhertoya berê ya malperê tune ne, û 1 guhertinên wiha hene. Dûv re em encama vê fermanê pêvajoyê dikin. Ji ber vê yekê, di agahdariya li ser pêkanîna skrîptê de, em ê di vê qonaxê de agahdariya kêrhatî di derbarê rewşa malperê de tomar bikin, li şûna ku em bixweber têk bibin û ji me re raporek li ser têkçûna senaryoyê bişînin.

Em van çalakiyan jî di pelrêça xwe de bi rûpelên hazir pêk tînin.

   - 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

Di encama

Wekî encamek, skrîptek wusa dihêle hûn li ser afirandina rûpelên statîk nefikirin. Bi lê zêdekirina guhertinan rasterast li depoyek taybet, çi bi xebata bi git-ê re ji binê her pergalê an jî çêkirina pelek bi navbeynkariya tevna GitHub-ê ve, Actions dê her tiştî bixwe bikin. Ger skrîpt ji nişka ve têk bibe, dê agahdariyek ji e-nameya we re were şandin.

Koda tevahî

Ez ê guhertoya xweya xebatê bihêlim, ku tê de gava paşîn şandina agahdariyek zêde dike ku peywirek li depoya sereke hatî kişandin.

Veşartiyên ku li jor hatine destnîşan kirin têne bikar anîn, li wir nîşana botê û nasnameya bikarhênerê ku pêdivî ye ku peyam jê re were şandin têne zêdekirin.

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

Çalakiyên GitHub wekî CI/CD ji bo malperek li ser hilberînerek statîk û Rûpelên GitHub
Encama yek ji rêvekirinê ku di tabloya Çalakiyên depoya çavkaniyê de tê xuyang kirin

Çalakiyên GitHub wekî CI/CD ji bo malperek li ser hilberînerek statîk û Rûpelên GitHub
Peyama ji botê di derbarê temamkirina senaryoyê de

Girêdanên bikarhêner

Têgihîştina Çalakiyan
Hevoksaziya çalakiyan
Lîsteya tetikan
Vebijarkên ji bo jîngehên virtual
Rûpelên Github
Lîsteya Generatorê Statîk

Source: www.habr.com

Add a comment