ProHoster > Օրագիր > Վարչակազմը > 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-ի կողմից
Գործողությունների սցենար գրելը սկսվում է թղթապանակում անունով ֆայլ ստեղծելով .github և դրա ենթաթղթապանակը workflows. Դա կարելի է անել կամ ձեռքով կամ խմբագրի միջոցով պահոցի էջի Գործողություններ ներդիրում:
Դատարկ սցենարի ձևի օրինակ
Ես հակիրճ մեկնաբանեմ ձևը
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.4) ստեղծել գրացուցակ, որտեղ կստեղծվեն կայքի էջերը.
- name: Make output folder
run: mkdir output
4) Որպեսզի կայքում աշխատանքը լինի հետևողական, այն է՝ չջնջել նախկին փոփոխությունները և հնարավոր լինի փոփոխություններ ավելացնել կայքի պահոցում առանց հակասությունների, հաջորդ քայլը կլինի ամեն անգամ կայքի շտեմարանի կլոնավորումը.
փոփոխական GITHUB_ACTOR GitHub-ը տեղադրվում է ինքն իրեն, և սա այն օգտվողի անունն է, որի մեղքով գործարկվել է այս սցենարը.
փոփոխական secrets.ACCESS_TOKEN սա ստեղծվում է նշան Github-ի կառավարման համար, մենք կարող ենք այն փոխանցել որպես շրջակա միջավայրի փոփոխական՝ տեղադրելով այն ներդիրում Secrets մեր պահեստի կարգավորումները: Խնդրում ենք նկատի ունենալ, որ սերնդի ընթացքում նշանը մեզ կտրամադրվի մեկ անգամ, այն այլևս հասանելի չի լինի: Ինչպես նաև Գաղտնիքների տարրերի արժեքները:
Գեներատորին փոխանցված պարամետրերը պատասխանատու են այն գրացուցակի համար, որտեղ կուղարկվեն ստեղծված ֆայլերը (-o output) և կազմաձևման ֆայլը, որը մենք օգտագործում ենք ստեղծելու համար (-s publishconf.py; Դուք կարող եք կարդալ «Pelican»-ի փաստաթղթերում տեղական կոնֆիգուրգի և կոնֆիգուրգի հրապարակման համար առանձնացնելու մոտեցման մասին:).
Հիշեցնեմ, թե ինչ կա մեր թղթապանակում output Կայքի պահոցն արդեն կլոնավորվել է:
6) Եկեք կարգավորենք git-ը և ինդեքսավորենք մեր փոխված ֆայլերը.
Այս պահին օգտագործվում է արդեն հայտնի փոփոխական, և նշվում է աշխատանքային գրացուցակը, որտեղ կգործարկվեն այս քայլի հրամանները: Աշխատանքային գրացուցակ գնալու հրամանն այլապես նման կլինի. 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-ն, որին պետք է ուղարկվի հաղորդագրությունը: