GitHub-ի գործողությունները որպես CI/CD ստատիկ գեներատորի և GitHub էջերի վրա գտնվող կայքի համար

GitHub-ի գործողությունները որպես CI/CD ստատիկ գեներատորի և GitHub էջերի վրա գտնվող կայքի համար

Մի փոքր ուսումնասիրելով Habr-ը, ես զարմացա, որ շատ քիչ հոդվածներ են հրապարակվել GitHub-ի (բետա) հատկանիշի՝ Գործողությունների թեմայով:

Թվում է, որ նման թերագնահատումը կարելի է բացատրել նրանով, որ ֆունկցիոնալությունը դեռ փորձարկման փուլում է, թեև «բետա»: Բայց դա բետա-ի օգտակար հատկանիշն է, որը թույլ է տալիս այս գործիքն օգտագործել մասնավոր պահոցներում: Խոսքը այս տեխնոլոգիայի հետ աշխատելու մասին է, որի մասին ես կխոսեմ այս հոդվածում:

Նախապատմություն

Եթե ​​սկսենք կարգով, ապա, հավանաբար, հարկ է նշել, որ անձնական «Իմ մասին» կայքէջը պահելու արագ, հարմար, հեշտ և անվճար տարբերակ փնտրելու գործընթացում ես ստիպված էի մի քանի գիշեր անցկացնել և ուսումնասիրել բազմաթիվ հոդվածներ:

Ոմանք ընտրում են հոսթինգը, մյուսները՝ ամպային սերվերը, իսկ նրանք, ովքեր չեն ցանկանում հասկանալ այս ամենի աշխատանքը, փոխազդեցությունն ու վճարումը, օրինակ՝ ստատիկ կայքերը պահոց վերբեռնելը, քանի որ այժմ դա կարելի է անել և՛ GitHub-ում, և՛ GitLab-ում:

Իհարկե, սա յուրաքանչյուրի անձնական ընտրությունն է։

Իմ վերջնական ընտրությունը GitHub Pages-ն էր:

Էջերի մասին

Ով չգիտի gh-pages - սա վեբկայքի տեսքով փաստաթղթերը պահելու տարբերակ է և տրամադրվում է անվճար, իսկ փաստաթղթերից բացի առաջարկվում է նաև անձնական կայքերի պահպանում։ Այս գործառույթը տրամադրվում է GitHub-ի կողմից բոլոր օգտատերերին և հասանելի է պահեստի կարգավորումներում:

Ծրագրի պահեստը օգտագործում է մասնաճյուղ gh-pages, օգտագործողի կայքի համար՝ առանձին շտեմարան անունով username.github.io կայքի աղբյուրների հետ master մասնաճյուղ.

Դուք կարող եք տեսնել ավելի մանրամասն փաստաթղթերում, բայց թույլ տվեք պարզապես նշել, որ GitHub-ը զարմանալիորեն մեծահոգի է թույլ տալիս որևէ մեկին կապել իր սեփական տիրույթը նման կայքի հետ՝ պարզապես ֆայլ ավելացնելով։ CNAME տիրույթի անունով և կարգավորելով ձեր տիրույթի մատակարարի DNS-ը GitHub սերվերների վրա:

Համոզված եմ, որ այստեղ կան բազմաթիվ հոդվածներ, թե ինչպես զարգացնել նման կայք, այնպես որ դրա մասին չեմ խոսելու հետագա:

Խնդրի առաջացում

Խնդիրն այն էր, որ ստատիկ գեներատոր օգտագործելիս անհրաժեշտություն է առաջանում գրել լրացուցիչ սկրիպտներ և օգտագործել գրադարաններ՝ էջերի ստեղծման և պահեստում բեռնելու գործընթացը պարզեցնելու համար։ Պարզապես, եթե աղբյուրները պահում եք առանձին մասնավոր պահոցում, ապա ամեն անգամ, երբ կայքում որևէ փոփոխություն է տեղի ունենում, անհրաժեշտ է եղել տեղակայել տեղական միջավայրը ստատիկ էջերի հետագա գեներացիայի և կայքի հիմնական պահոցում հրապարակման համար:

Առատություն կա ստատիկ գեներատորներ և նրանք բոլորն ունեն նույն խնդիրը: Այս գործողությունները չափազանց շատ ժամանակ և ջանք են պահանջում և, ի վերջո, դանդաղեցնում են աշխատանքը կայքում, հատկապես ՕՀ-ից ՕՀ մի քանի տեղափոխումից կամ կոշտ սկավառակների վրա տվյալների կորստի հետ կապված միջադեպերից հետո: (այսպես էր իմ դեպքում).

Հենց վերջերս, կա՛մ կայքի թռուցիկ ծանուցման մեջ, կա՛մ GitHub-ի տեղեկագրում նկատվեց նոր կառուցված CI/CD, որը հնարավորություն տվեց իրականացնել այդ գործողությունները նվազագույն ջանքերով:

Ստատիկ էջի գեներատորների մասին

Ես առանձնահատուկ ուշադրություն չեմ կենտրոնացնի այս ենթակետի վրա, բայց կկիսվեմ մի քանի թեզերից, որոնց ես եկել եմ հետևյալի ընտրության և օգտագործման ընթացքում.

1) ընտրեք գեներատոր, որը համապատասխանում է ձեր ծրագրավորման լեզվին կամ հնարավորինս պարզ: Ես եկել եմ այս գաղափարին այն ժամանակ, երբ ես ինքս ստիպված էի ավելացնել որոշ ֆունկցիոնալություններ, որպեսզի կայքը աշխատի, ավելացնել հենակները դրա ավելի մեծ կայունության և ավտոմատացման համար: Բացի այդ, սա լավ պատճառ է հավելյալ ֆունկցիոնալություն ինքներդ գրելու համար՝ plugins-ի տեսքով.

2) որ գեներատոր ընտրելը անձնական ընտրություն է, բայց արժե հաշվի առնել, որ GitHub Pages ֆունկցիոնալության աշխատանքում սկզբնական ընկղմվելու համար նախ պետք է տեղադրել Ջեկիլլ. Բարեբախտաբար, այն թույլ է տալիս կայք ստեղծել անմիջապես պահեստում գտնվող աղբյուրներից (Սա կրկնեմ իմ ընտրությամբ).

Գեներատորի իմ ընտրությունը հիմնված է առաջին կետի վրա: հավալուսն որը գրված է Python-ով հեշտությամբ փոխարինեց ինձ համար օտար Jekyll-ին (օգտագործել է մոտ մեկ տարի). Արդյունքում, նույնիսկ հոդվածներ ստեղծելն ու խմբագրելը, վեբկայքում աշխատելը լրացուցիչ փորձ է տալիս ինձ համար հետաքրքիր լեզվով:

__

Խնդրի ձևակերպում

Հիմնական խնդիրն է լինելու գրել սցենար (իրականում կազմաձևման ֆայլ), որը ավտոմատ կերպով ստատիկ էջեր կստեղծի մասնավոր պահոցից: Լուծումը կներառի վիրտուալ միջավայրի ֆունկցիոնալությունը: Սցենարն ինքնին կավելացնի պատրաստի էջեր հանրային շտեմարան։

Գործիքներ լուծման համար

Գործիքներ, որոնք մենք կօգտագործենք խնդիրը լուծելու համար.

  • GitHub գործողություններ;
  • Python3.7;
  • Հավալուսան;
  • Git;
  • GitHub էջեր.

Լուծումը

Այսպիսով, փաստաթղթերին մի փոքր ծանոթանալուց և հասկանալուց հետո, թե ինչպես են գրվում Գործողությունների սցենարները, պարզ դարձավ, որ այս մեխանիզմն ամբողջությամբ կլուծի առաջացած խնդիրը։ Գրելու պահին դուք պետք է բաժանորդագրվեք այս գործառույթն օգտագործելու համար: բետա փորձարկման համար!

GitHub-ի գործողությունները որպես CI/CD ստատիկ գեներատորի և GitHub էջերի վրա գտնվող կայքի համար
Նոր ֆունկցիոնալության նկարագրությունը հենց Github-ի կողմից

Գործողությունների սցենար գրելը սկսվում է թղթապանակում անունով ֆայլ ստեղծելով .github և դրա ենթաթղթապանակը workflows. Դա կարելի է անել կամ ձեռքով կամ խմբագրի միջոցով պահոցի էջի Գործողություններ ներդիրում:

GitHub-ի գործողությունները որպես CI/CD ստատիկ գեներատորի և GitHub էջերի վրա գտնվող կայքի համար
Դատարկ սցենարի ձևի օրինակ

Ես հակիրճ մեկնաբանեմ ձևը

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.

Եկեք կաղապարի հիման վրա գրենք մերը.

0) Կարող եք նաև թողնել «CI» անունը: Դա ճաշակի հարց է։

1) Հաջորդը, դուք պետք է ընտրեք գործողությունը/գործարկիչը, որը կգործարկի սկրիպտը, մեր դեպքում սա նոր commit-ի սովորական մղումն է դեպի պահեստ:

on:
  push

2) Մենք նաև կթողնենք այն պատկերը, որի հիման վրա սցենարը կգործարկվի որպես օրինակ, քանի որ Ubuntu-ն բավականին գոհ է անհրաժեշտ ֆունկցիոնալությունից: Նայելով հասանելի գործիքներ պարզ է դառնում, որ դա կարող է լինել ցանկացած անհրաժեշտ կամ պարզապես հարմար պատկեր (կամ դրա վրա հիմնված Docker կոնտեյներ):

  build:
    runs-on: ubuntu-latest

3) Քայլերում մենք նախ կստեղծենք միջավայր՝ նախապատրաստվելու հիմնական աշխատանքին:

3.1) գնալ մեզ անհրաժեշտ մասնաճյուղ (ստանդարտ քայլ checkout):

- uses: actions/checkout@v1

3.2) տեղադրել Python.

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

3.3) տեղադրել մեր գեներատորի կախվածությունները.

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

3.4) ստեղծել գրացուցակ, որտեղ կստեղծվեն կայքի էջերը.

   - name: Make output folder
      run: mkdir output

4) Որպեսզի կայքում աշխատանքը լինի հետևողական, այն է՝ չջնջել նախկին փոփոխությունները և հնարավոր լինի փոփոխություններ ավելացնել կայքի պահոցում առանց հակասությունների, հաջորդ քայլը կլինի ամեն անգամ կայքի շտեմարանի կլոնավորումը.

   - 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

Այս քայլը կոչում է համակարգի փոփոխականներ.

  • փոփոխական GITHUB_ACTOR GitHub-ը տեղադրվում է ինքն իրեն, և սա այն օգտվողի անունն է, որի մեղքով գործարկվել է այս սցենարը.
  • փոփոխական secrets.ACCESS_TOKEN սա ստեղծվում է նշան Github-ի կառավարման համար, մենք կարող ենք այն փոխանցել որպես շրջակա միջավայրի փոփոխական՝ տեղադրելով այն ներդիրում Secrets մեր պահեստի կարգավորումները: Խնդրում ենք նկատի ունենալ, որ սերնդի ընթացքում նշանը մեզ կտրամադրվի մեկ անգամ, այն այլևս հասանելի չի լինի: Ինչպես նաև Գաղտնիքների տարրերի արժեքները:

5) Եկեք անցնենք մեր էջերի ստեղծմանը.

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

Գեներատորին փոխանցված պարամետրերը պատասխանատու են այն գրացուցակի համար, որտեղ կուղարկվեն ստեղծված ֆայլերը (-o output) և կազմաձևման ֆայլը, որը մենք օգտագործում ենք ստեղծելու համար (-s publishconf.py; Դուք կարող եք կարդալ «Pelican»-ի փաստաթղթերում տեղական կոնֆիգուրգի և կոնֆիգուրգի հրապարակման համար առանձնացնելու մոտեցման մասին:).

Հիշեցնեմ, թե ինչ կա մեր թղթապանակում output Կայքի պահոցն արդեն կլոնավորվել է:

6) Եկեք կարգավորենք git-ը և ինդեքսավորենք մեր փոխված ֆայլերը.

    - 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

Այս պահին օգտագործվում է արդեն հայտնի փոփոխական, և նշվում է աշխատանքային գրացուցակը, որտեղ կգործարկվեն այս քայլի հրամանները: Աշխատանքային գրացուցակ գնալու հրամանն այլապես նման կլինի. cd output.

7) Եկեք ստեղծենք commit հաղորդագրություն, կատարենք փոփոխությունները և մղենք դրանք պահեստ: Որպեսզի կատարումն ապարդյուն չլինի և, հետևաբար, սխալ չառաջացնի bash-ում (ելքի արդյունքը չէ 0) — նախ ստուգենք, թե արդյոք անհրաժեշտ է ընդհանրապես ինչ-որ բան ձեռնարկել և մղել: Դա անելու համար մենք օգտագործում ենք հրամանը git diff-index --quiet --cached HEAD -- որը դուրս կգա տերմինալ 0 եթե կայքի նախորդ տարբերակի համեմատ փոփոխություններ չկան, և 1 կան նման փոփոխություններ. Այնուհետև մենք մշակում ենք այս հրամանի արդյունքը: Այսպիսով, սցենարի կատարման մասին տեղեկատվության մեջ մենք կգրանցենք օգտակար տեղեկատվություն այս փուլում կայքի վիճակի մասին՝ ավտոմատ խափանման և սցենարի խափանման մասին մեզ զեկույց ուղարկելու փոխարեն։

Այս գործողությունները մենք իրականացնում ենք նաև մեր գրացուցակում՝ պատրաստի էջերով։

   - 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

Արդյունք

Արդյունքում, նման սցենարը թույլ է տալիս չմտածել ստատիկ էջեր ստեղծելու մասին։ Անմիջապես մասնավոր պահոցում փոփոխություններ ավելացնելով, լինի դա git-ի հետ աշխատելով որևէ համակարգի տակ, թե ֆայլ ստեղծելով GitHub վեբ ինտերֆեյսի միջոցով, Actions-ն ամեն ինչ կանի ինքնուրույն: Եթե ​​սցենարը անսպասելիորեն խափանում է, ծանուցում կուղարկվի ձեր էլ.

Ամբողջական կոդը

Ես կթողնեմ իմ աշխատանքային տարբերակը, որտեղ վերջին քայլն ավելացնում է ծանուցում ուղարկելը, որ պարտավորությունը մղվել է հիմնական պահոց:

Օգտագործվում են վերը նկարագրված Գաղտնիքները, որտեղ ավելացվում են բոտի նշանը և օգտվողի ID-ն, որին պետք է ուղարկվի հաղորդագրությունը:

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

GitHub-ի գործողությունները որպես CI/CD ստատիկ գեներատորի և GitHub էջերի վրա գտնվող կայքի համար
Աղբյուրի պահեստի Գործողություններ ներդիրում ցուցադրված գործարկումներից մեկի արդյունքը

GitHub-ի գործողությունները որպես CI/CD ստատիկ գեներատորի և GitHub էջերի վրա գտնվող կայքի համար
Հաղորդագրություն բոտից՝ սցենարի ավարտի մասին

Օգտակար հղումներ

Գործողությունների ըմբռնում
Գործողությունների շարահյուսություն
Գործարկիչների ցանկ
Ընտրանքներ վիրտուալ միջավայրերի համար
Github էջեր
Ստատիկ գեներատորների ցուցակ

Source: www.habr.com

Добавить комментарий