
Откако малку го прегледав Хабр, бев изненаден што се објавени многу малку написи на темата (бета) функцијата на GitHub - Дејства.
Се чини дека таквото потценување може да се објасни со фактот дека функционалноста е сè уште во фаза на тестирање, иако „бета“. Но, тоа е корисна карактеристика на бета верзијата што овозможува оваа алатка да се користи во приватни складишта. Станува збор за работа со оваа технологија за која ќе зборувам во оваа статија.
Праисторија
Ако почнеме по ред, тогаш веројатно вреди да се спомене дека во процесот на пребарување на брза, удобна, лесна и бесплатна опција за складирање на лична веб-локација „За мене“, морав да поминам неколку ноќи и да прочешлам многу статии.
Некои луѓе избираат хостинг, други облак сервер, а оние кои не сакаат да ја разберат работата, интеракцијата и плаќањето за сето ова, како да поставуваат статични сајтови во складиште, бидејќи сега тоа може да се направи и на GitHub и на GitLab.
Се разбира, ова е личен избор на секого.
Мојот последен избор беа GitHub Pages.
За страници
Кој не знае gh-pages - ова е опција за складирање на документација во форма на веб-страница и се обезбедува бесплатно, а покрај документацијата се предлага и складирање на лични веб-страници. Оваа функционалност е обезбедена од GitHub за сите корисници и е достапна во поставките на складиштето.
Проектното складиште користи гранка gh-pages, за корисничка локација - посебно складиште со името username.github.io со извори на сајтот во master гранка.
Можете да видите повеќе детали , но само дозволете ми да забележам дека GitHub е изненадувачки дарежлив што дозволува секој да го поврзе својот домен со таква локација со едноставно додавање датотека CNAME со името на доменот и поставување на DNS на вашиот домен провајдер на серверите на GitHub.
Сигурен сум дека има многу написи овде за тоа како да се развие таква страница, така што нема да зборувам за тоа понатаму.
Појава на проблем
Проблемот беше што при користење на статички генератор, има потреба да се пишуваат дополнителни скрипти и да се користат библиотеки за да се поедностави процесот на генерирање страници и нивно вчитување во складиштето. Едноставно, ако ги складирате изворите во посебно приватно складиште, тогаш секогаш кога ќе има каква било промена на страницата, неопходно беше да се распореди локалната средина за последователно генерирање статични страници и објавување во главното складиште на страницата.
Има изобилство и сите го имаат истиот проблем. Овие дејства одземаат премногу време и напор и на крајот ја забавуваат работата на страницата, особено по неколку миграции од ОС на ОС или инциденти со губење податоци на хард дисковите (ова беше случај во мојот случај).
Неодамна, или во скокачко известување на веб-локацијата или во билтен од GitHub, беше забележано новоизградено CI/CD, што овозможи овие дејства да се извршат со минимален напор.
За генераторите на статични страници
Нема да фокусирам посебно внимание на оваа потточка, но ќе споделам неколку тези до кои дојдов при изборот и употребата на следново:
1) изберете генератор кој одговара на вашиот програмски јазик или кој е што е можно појасен. Дојдов до оваа идеја во време кога самиот морав да додадам некоја функционалност за да работи страницата, да додадам патерици за поголема стабилност и автоматизација. Покрај тоа, ова е добра причина сами да напишете дополнителна функционалност во форма на приклучоци;
2) кој генератор да се избере е личен избор, но вреди да се земе предвид дека за првично потопување во работата на функционалноста на GitHub Pages, прво мора да инсталирате . За среќа, ви овозможува да генерирате веб-страница од извори директно во складиштето (Ќе го повторам ова со мојот избор).
Мојот избор на генератор се базира на првата точка. што е напишано во Python лесно го замени Џекил, што ми е туѓо (го користев скоро една година). Како резултат на тоа, дури и креирањето и уредувањето на статии и работата на веб-локација дава дополнително искуство на јазик што ми е интересен.
__
Проблем изјава
Главната задача ќе биде да се напише скрипта (всушност конфигурациска датотека) која автоматски ќе генерира статични страници од приватно складиште. Решението ќе вклучува функционалност на виртуелна средина. Самата скрипта ќе додаде готови страници во јавното складиште.
Алатки за решение
Алатки што ќе ги користиме за да го решиме проблемот:
- GitHub Actions;
- Python3.7;
- Пеликан;
- Git;
- Страници на GitHub.
Решението
Така, откако малку се запознавме со документацијата и разбравме како се пишуваат скриптите за Акции, стана јасно дека овој механизам целосно ќе го реши проблемот што се појави. Во моментот на пишување, мора да се претплатите за да ја користите оваа функционалност. !

Опис на новата функционалност од самиот Github
Пишувањето скрипта Actions започнува со создавање именувана датотека во папка .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:
push2) Сликата врз основа на која ќе се лансира скриптата, исто така, ќе остане од примерот, бидејќи Ubuntu Тоа е доста задоволително во однос на потребната функционалност. Гледајќи го станува јасно дека ова може да биде која било неопходна или едноставно удобна слика (или контејнер на Docker врз основа на тоа).
build:
runs-on: ubuntu-latest3) Во чекорите, прво ќе ја поставиме околината за да се подготвиме за главната работа.
3.1) одете до гранката што ни треба (стандарден чекор checkout):
- uses: actions/checkout@v13.2) инсталирај Python:
- name: Set up Python
uses: actions/setup-python@v1
with:
python-version: 3.73.3) инсталирајте ги зависностите на нашиот генератор:
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt3.4) креирајте директориум во кој ќе се генерираат страниците на страницата:
- name: Make output folder
run: mkdir output4) За да може работата на страницата да биде конзистентна, имено, да не се бришат претходните промени и да може да се додаваат промени во складиштето на страницата без конфликти, следниот чекор ќе биде секој пат да се клонира складиштето на страницата:
- 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_ACTORGitHub се инсталира сам, и ова е корисничкото име по чија вина е лансирана оваа скрипта; - променлива
secrets.ACCESS_TOKENова се генерира , можеме да ја пренесеме како променлива на околината со поставување во таботSecretsнашите поставки за складиште. Имајте предвид дека за време на генерирањето токенот ќе ни биде доставен еднаш, нема да има понатамошен пристап до него. Како и вредностите на предметите Тајни.
5) Ајде да продолжиме со генерирање на нашите страници:
- name: Generate static pages
run: pelican content -o output -s publishconf.pyПараметрите предадени на генераторот се одговорни за директориумот каде што ќе се испраќаат генерираните датотеки (-o output) и конфигурациската датотека што ја користиме за да генерираме (-s publishconf.py; Можете да прочитате за пристапот за одвојување на локалната конфигурација и конфигурацијата за објавување во документацијата Пеликан).
Дозволете ми да ве потсетам што има во нашата папка 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) Ајде да генерираме порака за обврзување, да ги извршиме промените и да ги турнеме во складиштето. Така што извршувањето не е залудно и затоа не произведува грешка во 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: ./outputScreenshot-

Резултатот од едно од извршувањето прикажано во табулаторот Акции на изворното складиште

Порака од ботот за комплетирање на сценариото
Корисни линкови
Извор: www.habr.com
