GitHub Actions isip CI/CD para sa usa ka site sa static generator ug GitHub Pages

GitHub Actions isip CI/CD para sa usa ka site sa static generator ug GitHub Pages

Sa pag-usisa og gamay sa Habr, natingala ko nga gamay ra ang mga artikulo nga gipatik sa hilisgutan sa GitHub's (beta) nga bahin - Mga Aksyon.

Mopatim-aw nga ang ingon nga pagpaubos mahimong ipasabut sa kamatuoran nga ang pagpaandar naa pa sa pagsulay, bisan pa sa "beta". Apan kini usa ka mapuslanon nga bahin sa beta nga nagtugot niini nga himan nga magamit sa mga pribadong repositoryo. Mahitungod kini sa pagtrabaho sa kini nga teknolohiya nga akong hisgutan sa kini nga artikulo.

Prehistory

Kung magsugod kita sa pagkahan-ay, nan tingali angay nga hisgutan nga sa proseso sa pagpangita alang sa usa ka paspas, kombenyente, dali ug libre nga kapilian alang sa pagtipig sa usa ka personal nga website nga "About Me", kinahanglan kong mogugol og daghang mga gabii ug magsuklay sa daghang mga artikulo.

Ang ubang mga tawo nagpili sa pag-host, ang uban usa ka cloud server, ug kadtong dili gusto nga masabtan ang trabaho, interaksyon ug pagbayad alang sa tanan niini sama sa pag-upload sa mga static nga site sa usa ka repository, tungod kay mahimo na kini sa pareho nga GitHub ug GitLab.

Siyempre, kini ang personal nga pagpili sa tanan.

Ang akong katapusang gipili mao ang GitHub Pages.

Mahitungod sa Mga Panid

Kinsa ang wala mahibalo gh-pages - kini usa ka kapilian alang sa pagtipig sa dokumentasyon sa porma sa usa ka website ug kini gihatag nga wala’y bayad, ug dugang sa dokumentasyon, gisugyot usab nga tipigan ang mga personal nga website. Kini nga gamit gihatag sa GitHub sa tanang tiggamit ug anaa sa mga setting sa repository.

Ang repository sa proyekto naggamit sa usa ka sanga gh-pages, alang sa usa ka user site - usa ka bulag nga repository nga adunay ngalan username.github.io uban sa mga tinubdan sa site sa master sanga.

Makita nimo ang dugang nga mga detalye sa dokumentasyon, pero timan-an lang nako nga ang GitHub katingad-an nga manggihatagon sa pagtugot sa bisan kinsa nga mag-link sa ilang kaugalingon nga domain sa ingon nga site pinaagi lamang sa pagdugang usa ka file CNAME uban sa domain name ug pag-set up sa DNS sa imong domain provider sa GitHub servers.

Sigurado ako nga adunay daghang mga artikulo dinhi kung giunsa ang paghimo sa ingon nga site, mao nga dili kana ang akong hisgutan pa.

Problema nga mitungha

Ang problema mao nga kung mogamit usa ka static generator, kinahanglan nga magsulat dugang nga mga script ug mogamit mga librarya aron mapasimple ang proseso sa paghimo og mga panid ug i-load kini sa repository. Sa yano, kung imong gitipigan ang mga gigikanan sa usa ka bulag nga pribadong repositoryo, nan sa matag higayon nga adunay bisan unsang pagbag-o sa site, kinahanglan nga i-deploy ang lokal nga palibot alang sa sunod nga henerasyon sa mga static nga panid ug publikasyon sa panguna nga repositoryo sa site.

Adunay kaabunda static nga mga generator ug silang tanan adunay parehas nga problema. Kini nga mga aksyon nagkinahanglag daghang oras ug paningkamot, ug sa katapusan nagpahinay sa pagtrabaho sa site, labi na pagkahuman sa daghang mga paglalin gikan sa OS ngadto sa OS o mga insidente nga adunay pagkawala sa data sa mga hard drive. (Kini ang kaso sa akong kaso).

Bag-o lang, bisan sa usa ka pop-up nga pahibalo sa website o sa usa ka newsletter gikan sa GitHub, usa ka bag-ong gitukod nga CI/CD ang namatikdan, nga nagtugot niini nga mga aksyon nga mahimo nga adunay gamay nga paningkamot.

Mahitungod sa static page generators

Dili nako ipunting ang espesyal nga atensyon sa kini nga sub-item, apan akong ipaambit ang usa ka magtiayon nga mga tesis nga akong nahibal-an sa panahon sa pagpili ug paggamit sa mga musunud:

1) pagpili og generator nga haom sa imong programming language, o usa nga klaro kutob sa mahimo. Nakaabot ako niini nga ideya sa usa ka panahon nga ako mismo kinahanglan nga magdugang pipila ka mga gamit aron magtrabaho ang site, magdugang mga crutches alang sa labi ka kalig-on ug automation. Dugang pa, kini usa ka maayong rason sa pagsulat sa dugang nga pagpaandar sa imong kaugalingon sa porma sa mga plugins;

2) kung unsang generator ang pilion usa ka personal nga pagpili, apan angay nga hunahunaon nga alang sa una nga pagpaunlod sa buhat sa pag-andar sa GitHub Pages, kinahanglan nimo nga i-install una Jekyll. Maayo na lang, gitugotan ka niini nga makamugna usa ka website gikan sa mga gigikanan nga direkta sa repositoryo (Akong sublion kini sa akong gipili).

Ang akong pagpili sa generator gibase sa unang punto. Pelikano nga gisulat sa Python dali nga gipulihan si Jekyll, nga langyaw alang kanako (gigamit kini hapit usa ka tuig). Ingon usa ka sangputanan, bisan ang paghimo ug pag-edit sa mga artikulo ug pagtrabaho sa usa ka website naghatag dugang nga kasinatian sa usa ka lengguwahe nga makapaikag kanako.

__

Pagbuot sa problema

Ang panguna nga buluhaton mao ang pagsulat sa usa ka script (sa tinuud usa ka file sa pag-configure) nga awtomatiko nga makahimo og mga static nga panid gikan sa usa ka pribadong repositoryo. Ang solusyon maglakip sa pagpaandar sa usa ka virtual nga palibot. Ang script mismo magdugang ug andam nga mga panid sa publiko nga repositoryo.

Mga himan alang sa solusyon

Mga himan nga among gamiton sa pagsulbad sa problema:

  • Mga Aksyon sa GitHub;
  • Python3.7;
  • Pelican;
  • Git;
  • Mga Panid sa GitHub.

Pag-troubleshoot

Mao nga, pagkahuman nga pamilyar sa dokumentasyon sa gamay ug nahibal-an kung giunsa gisulat ang mga script alang sa Mga Aksyon, nahimo nga tin-aw nga kini nga mekanismo hingpit nga makasulbad sa problema nga mitumaw. Sa panahon sa pagsulat, kinahanglan ka nga mag-subscribe aron magamit kini nga pagpaandar. alang sa beta testing!

GitHub Actions isip CI/CD para sa usa ka site sa static generator ug GitHub Pages
Deskripsyon sa bag-ong gamit sa Github mismo

Ang pagsulat sa script sa Actions magsugod pinaagi sa paghimo og usa ka ginganlan nga file sa usa ka folder .github ug ang subfolder niini workflows. Mahimo kini nga mano-mano o gikan sa editor sa tab nga Mga Aksyon sa panid sa repository.

GitHub Actions isip CI/CD para sa usa ka site sa static generator ug GitHub Pages
Pananglitan sa usa ka blangko nga porma sa script

Ako mukomentaryo sa mubo sa porma

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.

Atong isulat ang atong kaugalingon base sa template:

0) Mahimo usab nimo ibilin ang ngalan nga "CI". Kini usa ka butang sa lami.

1) Sunod, kinahanglan nimo nga pilion ang aksyon / trigger nga maglansad sa script, sa among kaso kini ang naandan nga pagduso sa usa ka bag-ong pasalig sa repository.

on:
  push

2) Ibilin usab namon ang imahe kung diin ang script ilunsad ingon usa ka pananglitan, tungod kay ang Ubuntu natagbaw sa kinahanglan nga gamit. Nagtan-aw sa magamit nga mga himan kini mahimong tin-aw nga kini mahimo nga bisan unsa nga gikinahanglan o yano nga kombenyente nga hulagway (o usa ka Docker nga sudlanan nga gibase niini).

  build:
    runs-on: ubuntu-latest

3) Sa mga lakang, una natong ipahimutang ang palibot aron maandam ang panguna nga buluhaton.

3.1) adto sa branch nga atong gikinahanglan (standard step checkout):

- uses: actions/checkout@v1

3.2) i-install ang Python:

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

3.3) i-install ang mga dependency sa among generator:

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

3.4) paghimo og usa ka direktoryo diin ang mga panid sa site mabuhat:

   - name: Make output folder
      run: mkdir output

4) Aron ang trabaho sa site mahimong makanunayon, nga mao, dili pagtangtang sa nangaging mga pagbag-o ug aron makadugang sa mga pagbag-o sa site repository nga walay mga panagbangi, ang sunod nga lakang mao ang pag-clone sa site repository matag higayon:

   - 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

Kini nga lakang nagtawag sa mga variable sa sistema:

  • variable GITHUB_ACTOR Gi-install sa GitHub ang iyang kaugalingon, ug kini ang username pinaagi sa kang kinsang sayop kini nga script gilunsad;
  • baryable secrets.ACCESS_TOKEN kini namugna token alang sa pagdumala sa Github, mahimo natong ipasa kini isip variable sa palibot pinaagi sa pagbutang niini sa tab Secrets among mga setting sa repository. Palihug timan-i nga sa panahon sa henerasyon ang token ihatag kanamo sa makausa, wala nay dugang nga pag-access niini. Ingon man usab ang mga kantidad sa mga butang nga Sekreto.

5) Magpadayon kita sa paghimo sa atong mga panid:

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

Ang mga parameter nga gipasa sa generator mao ang responsable sa direktoryo diin ipadala ang mga file nga nabuhat (-o output) ug ang configuration file nga among gigamit sa pagmugna (-s publishconf.py; Mahimo nimong mabasa ang bahin sa pamaagi sa pagbulag sa lokal nga config ug ang config alang sa pagmantala sa dokumentasyon sa Pelican).

Pahinumdum ko nimo kung unsa ang naa sa among folder output Na-clone na ang site repository.

6) Atong i-set up ang git ug i-index ang atong nausab nga mga file:

    - 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

Niini nga punto, usa ka nahibal-an na nga variable ang gigamit ug ang working directory gipakita diin ang mga sugo gikan niini nga lakang ilunsad. Ang sugo sa pag-adto sa nagtrabaho nga direktoryo kon dili tan-awon sama sa - cd output.

7) Maghimo kita og commit nga mensahe, i-commit ang mga kausaban ug iduso kini ngadto sa repository. Aron ang commit dili kawang ug busa dili makahatag usa ka sayup sa bash (ang resulta sa output dili 0) β€” una, atong susihon kung kinahanglan ba nga mopasalig ug magduso sa usa ka butang. Sa pagbuhat niini atong gamiton ang sugo git diff-index --quiet --cached HEAD -- nga magpagawas sa terminal 0 kung walay mga pagbag-o kalabot sa miaging bersyon sa site, ug 1 adunay ingon nga mga pagbag-o. Dayon among giproseso ang resulta niini nga sugo. Sa ingon, sa kasayuran bahin sa pagpatuman sa script, among irekord ang mapuslanon nga kasayuran bahin sa kahimtang sa site sa kini nga yugto, imbis nga awtomatiko nga nahagsa ug nagpadala kanamo usa ka taho bahin sa pag-crash sa script.

Gihimo usab namo kini nga mga aksyon sa among direktoryo nga adunay andam nga mga panid.

   - 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

resulta

Ingon usa ka sangputanan, ang ingon nga script nagtugot kanimo nga dili maghunahuna bahin sa paghimo og mga static nga panid. Pinaagi sa pagdugang sa mga pagbag-o direkta sa usa ka pribado nga repository, bisan pinaagi sa pagtrabaho kauban ang git gikan sa ilawom sa bisan unsang sistema o paghimo usa ka file pinaagi sa GitHub web interface, ang mga aksyon mismo ang mobuhat sa tanan. Kung ang script nahagsa sa wala damha, usa ka pahibalo ipadala sa imong email.

Bug-os nga kodigo

Akong biyaan ang akong nagtrabaho nga bersyon, diin ang katapusan nga lakang nagdugang pagpadala sa usa ka pahibalo nga ang usa ka commit giduso sa main repository.

Ang mga Sekreto nga gihulagway sa ibabaw gigamit, diin ang bot token ug ang user ID nga kinahanglan ipadala ang mensahe idugang.

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

Mga tanghaga

GitHub Actions isip CI/CD para sa usa ka site sa static generator ug GitHub Pages
Ang resulta sa usa sa mga run nga gipakita sa tab nga Mga Aksyon sa tinubdan nga repository

GitHub Actions isip CI/CD para sa usa ka site sa static generator ug GitHub Pages
Mensahe gikan sa bot bahin sa pagkompleto sa script

Mapuslanon nga mga link

Pagsabot sa mga Aksyon
Syntax sa mga aksyon
Listahan sa mga trigger
Mga kapilian alang sa virtual nga palibot
Mga panid sa Github
Lista sa Static Generator

Source: www.habr.com

Idugang sa usa ka comment