Gweithredoedd GitHub fel CI/CD ar gyfer Safle Generadur Statig a Tudalennau GitHub

Gweithredoedd GitHub fel CI/CD ar gyfer Safle Generadur Statig a Tudalennau GitHub

Ar ôl sgwrio Habr ychydig, cefais fy synnu mai ychydig iawn o erthyglau sydd wedi'u cyhoeddi ar bwnc nodwedd GitHub (beta) - Actions.

Mae'n ymddangos y gellir esbonio tanddatganiad o'r fath gan y ffaith bod y swyddogaeth yn dal i gael ei phrofi, er yn “beta”. Ond mae'n nodwedd ddefnyddiol o'r beta sy'n caniatáu i'r offeryn hwn gael ei ddefnyddio mewn storfeydd preifat. Mae'n ymwneud â gweithio gyda'r dechnoleg hon y byddaf yn siarad amdano yn yr erthygl hon.

Cynhanes

Os byddwn yn dechrau mewn trefn, yna mae'n debyg ei bod yn werth nodi, yn y broses o chwilio am opsiwn cyflym, cyfleus, hawdd a rhad ac am ddim ar gyfer storio gwefan bersonol "Amdanaf i", bu'n rhaid i mi dreulio sawl noson a chribo trwy lawer o erthyglau.

Mae rhai pobl yn dewis cynnal, eraill yn weinydd cwmwl, a'r rhai nad ydyn nhw eisiau deall y gwaith, y rhyngweithio a'r taliad am hyn i gyd fel uwchlwytho gwefannau sefydlog i ystorfa, ers nawr gellir gwneud hyn ar GitHub a GitLab.

Wrth gwrs, mae hyn yn ddewis personol pawb.

Fy newis olaf oedd GitHub Pages.

Am Dudalennau

Pwy sydd ddim yn gwybod gh-pages - mae hwn yn opsiwn ar gyfer storio dogfennaeth ar ffurf gwefan ac fe'i darperir yn rhad ac am ddim, ac yn ogystal â dogfennaeth, bwriedir storio gwefannau personol hefyd. Darperir y swyddogaeth hon gan GitHub i bob defnyddiwr ac mae ar gael yng ngosodiadau'r ystorfa.

Mae ystorfa'r prosiect yn defnyddio cangen gh-pages, ar gyfer safle defnyddiwr - ystorfa ar wahân gyda'r enw username.github.io gyda ffynonellau safle yn master cangen.

Gallwch weld mwy o fanylion mewn dogfennaeth, ond gadewch i mi nodi bod GitHub yn rhyfeddol o hael wrth ganiatáu i unrhyw un gysylltu eu parth eu hunain â gwefan o'r fath trwy ychwanegu ffeil yn unig CNAME gyda'r enw parth a sefydlu DNS eich darparwr parth ar y gweinyddwyr GitHub.

Rwy’n siŵr bod llawer o erthyglau yma ar sut i ddatblygu gwefan o’r fath, felly nid dyna beth rydw i’n mynd i siarad amdano ymhellach.

Problem yn codi

Y broblem oedd, wrth ddefnyddio generadur statig, bod angen ysgrifennu sgriptiau ychwanegol a defnyddio llyfrgelloedd i symleiddio'r broses o gynhyrchu tudalennau a'u llwytho i'r gadwrfa. Yn syml, os ydych chi'n storio'r ffynonellau mewn ystorfa breifat ar wahân, yna bob tro y byddai unrhyw newid ar y wefan, roedd angen defnyddio'r amgylchedd lleol ar gyfer y genhedlaeth ddilynol o dudalennau sefydlog a chyhoeddi ym mhrif gadwrfa'r safle.

Mae digonedd generaduron sefydlog ac mae ganddyn nhw i gyd yr un broblem. Mae'r camau hyn yn cymryd gormod o amser ac ymdrech, ac yn y pen draw yn arafu gwaith ar y wefan, yn enwedig ar ôl sawl mudo o OS i OS neu ddigwyddiadau gyda cholli data ar yriannau caled (dyma oedd yr achos yn fy achos i).

Yn ddiweddar, naill ai mewn hysbysiad naid ar y wefan neu mewn cylchlythyr gan GitHub, sylwyd ar CI/CD newydd ei adeiladu, a oedd yn caniatáu i'r camau hyn gael eu cyflawni heb fawr o ymdrech.

Ynglŷn â generaduron tudalennau sefydlog

Ni fyddaf yn canolbwyntio sylw arbennig ar yr is-eitem hwn, ond byddaf yn rhannu cwpl o draethodau ymchwil y deuthum atynt wrth ddewis a defnyddio'r canlynol:

1) dewis generadur sy'n addas i'ch iaith raglennu, neu un sydd mor glir â phosib. Deuthum i'r syniad hwn ar adeg pan oedd yn rhaid i mi fy hun ychwanegu rhywfaint o ymarferoldeb i'r wefan weithio, ychwanegu baglau ar gyfer ei sefydlogrwydd a'i awtomeiddio mwy. Yn ogystal, mae hwn yn rheswm da i ysgrifennu swyddogaethau ychwanegol eich hun ar ffurf ategion;

2) pa generadur i'w ddewis sy'n ddewis personol, ond mae'n werth ystyried, ar gyfer y trochi cychwynnol yng ngwaith swyddogaeth GitHub Pages, bod yn rhaid i chi osod yn gyntaf Jekyll. Yn ffodus, mae'n caniatáu ichi gynhyrchu gwefan o ffynonellau yn uniongyrchol yn y gadwrfa (Byddaf yn ailadrodd hyn gyda fy newis).

Mae fy newis o generadur yn seiliedig ar y pwynt cyntaf. Pelican sydd wedi'i ysgrifennu yn Python yn hawdd disodli Jekyll, sy'n estron i mi (wedi ei ddefnyddio am bron i flwyddyn). O ganlyniad, mae hyd yn oed creu a golygu erthyglau a gweithio ar wefan yn rhoi profiad ychwanegol mewn iaith sy’n ddiddorol i mi.

__

Datganiad o'r broblem

Y brif dasg fydd ysgrifennu sgript (ffeil ffurfweddu mewn gwirionedd) a fyddai'n cynhyrchu tudalennau sefydlog yn awtomatig o gadwrfa breifat. Bydd yr ateb yn cynnwys ymarferoldeb amgylchedd rhithwir. Bydd y sgript ei hun yn ychwanegu tudalennau parod i'r gadwrfa gyhoeddus.

Offer ar gyfer datrysiad

Offer y byddwn yn eu defnyddio i ddatrys y broblem:

  • Camau Gweithredu GitHub;
  • Python3.7;
  • Pelican;
  • Git;
  • Tudalennau GitHub.

Yr ateb

Felly, ar ôl dod yn gyfarwydd â'r ddogfennaeth ychydig a deall sut mae sgriptiau ar gyfer Camau Gweithredu yn cael eu hysgrifennu, daeth yn amlwg y bydd y mecanwaith hwn yn datrys y broblem sydd wedi codi yn llwyr. Ar adeg ysgrifennu, rhaid i chi danysgrifio i ddefnyddio'r swyddogaeth hon. ar gyfer profion beta!

Gweithredoedd GitHub fel CI/CD ar gyfer Safle Generadur Statig a Tudalennau GitHub
Disgrifiad o'r swyddogaeth newydd gan Github ei hun

Mae ysgrifennu sgript Camau Gweithredu yn dechrau trwy greu ffeil a enwir mewn ffolder .github a'i is-ffolder workflows. Gellir gwneud hyn naill ai â llaw neu gan y golygydd yn y tab Camau Gweithredu ar dudalen y gadwrfa.

Gweithredoedd GitHub fel CI/CD ar gyfer Safle Generadur Statig a Tudalennau GitHub
Enghraifft o ffurflen sgript wag

Gwnaf sylwadau byr ar y ffurflen

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.

Gadewch i ni ysgrifennu ein rhai ein hunain yn seiliedig ar y templed:

0) Gallwch hefyd adael yr enw “CI”. Mater o flas ydyw.

1) Nesaf, mae angen i chi ddewis y weithred / sbardun a fydd yn lansio'r sgript, yn ein hachos ni dyma'r gwthiad arferol o ymrwymiad newydd i'r ystorfa.

on:
  push

2) Byddwn hefyd yn gadael y ddelwedd ar y sail y bydd y sgript yn cael ei lansio fel enghraifft, gan fod Ubuntu yn eithaf bodlon â'r swyddogaeth angenrheidiol. Edrych ar offer sydd ar gael daw'n amlwg y gall hon fod yn unrhyw ddelwedd angenrheidiol neu gyfleus (neu gynhwysydd Docker yn seiliedig arno).

  build:
    runs-on: ubuntu-latest

3) Yn y camau, byddwn yn sefydlu'r amgylchedd yn gyntaf i baratoi ar gyfer y prif waith.

3.1) mynd i'r gangen sydd ei angen arnom (cam safonol checkout):

- uses: actions/checkout@v1

3.2) gosod Python:

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

3.3) gosod dibyniaethau ein generadur:

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

3.4) creu cyfeiriadur lle bydd tudalennau'r wefan yn cael eu cynhyrchu:

   - name: Make output folder
      run: mkdir output

4) Er mwyn i’r gwaith ar y safle fod yn gyson, sef peidio â dileu newidiadau blaenorol ac i allu ychwanegu newidiadau i ystorfa’r safle heb wrthdaro, y cam nesaf fydd clonio’r ystorfa safle bob tro:

   - 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

Mae'r cam hwn yn galw newidynnau system:

  • amrywiol GITHUB_ACTOR Mae GitHub yn gosod ei hun, a dyma'r enw defnyddiwr y lansiwyd y sgript hon drwyddo;
  • newidiol secrets.ACCESS_TOKEN mae hyn yn cael ei gynhyrchu tocyn ar gyfer rheoli Github, gallwn ei basio fel newidyn amgylchedd trwy ei osod yn y tab Secrets gosodiadau ein cadwrfa. Sylwch, yn ystod y cyfnod cynhyrchu, bydd y tocyn yn cael ei ddarparu i ni unwaith, ni fydd mynediad pellach iddo. Yn ogystal â gwerthoedd yr eitemau Cyfrinachau.

5) Gadewch i ni symud ymlaen i gynhyrchu ein tudalennau:

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

Mae'r paramedrau a drosglwyddir i'r generadur yn gyfrifol am y cyfeiriadur lle bydd y ffeiliau a gynhyrchir yn cael eu hanfon (-o output) a'r ffeil ffurfweddu a ddefnyddiwn i gynhyrchu (-s publishconf.py; Gallwch ddarllen am y dull o wahanu'r ffurfwedd leol a'r ffurfwedd i'w gyhoeddi yn nogfennaeth Pelican).

Gadewch imi eich atgoffa beth sydd yn ein ffolder output Mae ystorfa'r safle eisoes wedi'i chlonio.

6) Gadewch i ni sefydlu git a mynegeio ein ffeiliau newydd:

    - 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

Ar y pwynt hwn, defnyddir newidyn sydd eisoes yn hysbys a nodir y cyfeiriadur gweithio lle bydd y gorchmynion o'r cam hwn yn cael eu lansio. Byddai'r gorchymyn i fynd i'r cyfeiriadur gweithio fel arall yn edrych fel - cd output.

7) Gadewch i ni gynhyrchu neges ymrwymo, ymrwymo'r newidiadau a'u gwthio i'r gadwrfa. Fel nad yw'r ymrwymiad yn ofer ac felly nid yw'n cynhyrchu gwall mewn bash (nid yw'r canlyniad allbwn 0) - yn gyntaf, gadewch i ni wirio a oes angen ymrwymo a gwthio rhywbeth o gwbl. I wneud hyn rydym yn defnyddio'r gorchymyn git diff-index --quiet --cached HEAD -- a fydd yn allbwn i'r derfynell 0 os nad oes unrhyw newidiadau mewn perthynas â fersiwn flaenorol y wefan, ac 1 mae newidiadau o'r fath. Yna rydym yn prosesu canlyniad y gorchymyn hwn. Felly, yn y wybodaeth am gyflawni'r sgript, byddwn yn cofnodi gwybodaeth ddefnyddiol am gyflwr y wefan ar hyn o bryd, yn lle chwalu'n awtomatig ac anfon adroddiad am ddamwain y sgript atom.

Rydym hefyd yn cyflawni'r camau hyn yn ein cyfeiriadur gyda thudalennau parod.

   - 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

Canlyniad

O ganlyniad, mae sgript o'r fath yn caniatáu ichi beidio â meddwl am greu tudalennau sefydlog. Trwy ychwanegu newidiadau yn uniongyrchol i ystorfa breifat, boed trwy weithio gyda git o dan unrhyw system neu greu ffeil trwy ryngwyneb gwe GitHub, bydd Actions yn gwneud popeth eu hunain. Os bydd y sgript yn chwalu'n annisgwyl, bydd hysbysiad yn cael ei anfon i'ch e-bost.

Cod llawn

Gadawaf fy fersiwn waith, lle mae'r cam olaf yn ychwanegu anfon hysbysiad bod ymrwymiad wedi'i wthio i'r brif gadwrfa.

Defnyddir y Cyfrinachau a ddisgrifir uchod, lle mae'r tocyn bot a'r ID defnyddiwr y mae angen anfon y neges ato yn cael eu hychwanegu.

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

Gweithredoedd GitHub fel CI/CD ar gyfer Safle Generadur Statig a Tudalennau GitHub
Canlyniad un o'r rhediadau a ddangosir yn y tab Camau Gweithredu yn y storfa ffynhonnell

Gweithredoedd GitHub fel CI/CD ar gyfer Safle Generadur Statig a Tudalennau GitHub
Neges gan y bot am gwblhau'r sgript

Dolenni defnyddiol

Deall Gweithredoedd
Cystrawen gweithredoedd
Rhestr o sbardunau
Opsiynau ar gyfer amgylcheddau rhithwir
Tudalennau Github
Rhestr Generaduron Statig

Ffynhonnell: hab.com

Ychwanegu sylw