
Habr ãå°ã調ã¹ãŠã¿ããšãããGitHub (ããŒã¿ç) ã®æ©èœã§ãã Actions ã«é¢ããèšäºãã»ãšãã©å ¬éãããŠããªãããšã«é©ããŸããã
ãã®ãããªçç¥ã¯ãæ©èœããããŒã¿çãã§ã¯ãããã®ã®ããŸã ãã¹ãäžã§ãããšããäºå®ã«ãã£ãŠèª¬æã§ããããã§ãããããããã®ããŒã«ããã©ã€ããŒã ãªããžããªã§äœ¿çšã§ããããã«ããã®ã¯ããŒã¿çã®äŸ¿å©ãªæ©èœã§ãããã®èšäºã§ã¯ããã®ãã¯ãããžãŒã®äœ¿ãæ¹ã«ã€ããŠèª¬æããŸãã
å 岿代
æåããå§ãããšããã°ãå人ãŠã§ããµã€ããAbout meããä¿åããããã®é«éã§äŸ¿å©ãç°¡åãç¡æã®ãªãã·ã§ã³ãæ€çŽ¢ããéçšã§ãç§ã¯æ°æ©ãè²»ãããŠå€ãã®èšäºã粟æ»ããªããã°ãªããªãã£ãããšãèšåãã䟡å€ãããã§ãããã
ãã¹ãã£ã³ã°ãéžæãã人ãããã°ãã¯ã©ãŠã ãµãŒããŒãéžæãã人ãããŸãããŸãããã¹ãŠãã©ã®ããã«æ©èœããçžäºäœçšããæéãæ¯æãããçè§£ããããªã人ãããŸããããšãã°ãGitHub ãš GitLab ã®äž¡æ¹ã§çŸåšå¯èœãªããªããžããªãžã®éçãµã€ãã®ã¢ããããŒããªã©ã§ãã
ãã¡ãããããã¯å人ã®å人çãªéžæã§ãã
æçµçã«éžãã ã®ã¯ GitHub Pages ã§ããã
ããŒãžã«ã€ããŠ
誰ãç¥ããªã gh-pages â ããã¯ãããã¥ã¡ã³ãã Web ãµã€ãã®åœ¢åŒã§ä¿åããããã®ãªãã·ã§ã³ã§ãããç¡æã§æäŸãããŠãããããã¥ã¡ã³ãã«å ããŠãå人㮠Web ãµã€ããä¿åããããšãææ¡ãããŠããŸãããã®æ©èœã¯ GitHub ã«ãã£ãŠãã¹ãŠã®ãŠãŒã¶ãŒã«æäŸãããŠããããªããžããªèšå®ã§å©çšã§ããŸãã
ãããžã§ã¯ããªããžããªã¯ãã©ã³ãã䜿çšããŸã gh-pagesããŠãŒã¶ãŒãµã€ãã®å Žå - ãšããååã®å¥ã®ãªããžã㪠username.github.io ãµã€ãã®ãœãŒã¹ã¯ master ãã©ã³ãã
詳现ã¯ä»¥äžãã芧ãã ãã ããããGitHubã¯é©ãã»ã©å¯å€§ã§ããã¡ã€ã«ã远å ããã ãã§èª°ã§ãèªåã®ãã¡ã€ã³ããã®ãããªãµã€ãã«ãªã³ã¯ã§ããããã«ããŠããŸãã CNAME ãã¡ã€ã³åãå
¥åãããã¡ã€ã³ ãããã€ããŒã® DNS ã GitHub ãµãŒããŒã«èšå®ããŸãã
ãã®ãããªãµã€ããå±éããæ¹æ³ã«ã€ããŠã¯ãããã«ã¯ããããã®èšäºããããšæãã®ã§ããã以äžã¯èª¬æããŸããã
åé¡ã®åºçŸ
åé¡ã¯ãéçãžã§ãã¬ãŒã¿ã䜿çšããå ŽåãããŒãžãçæããŠãªããžããªã«ã¢ããããŒãããããã»ã¹ãç°¡çŽ åããããã«ã远å ã®ã¹ã¯ãªããè£å©ãèšè¿°ããã©ã€ãã©ãªã䜿çšããå¿ èŠãããããšã§ãããç°¡åã«èšãã°ããœãŒã¹ ã³ãŒããå¥ã®ãã©ã€ããŒã ãªããžããªã«ä¿åãããšããµã€ãã«å€æŽããããã³ã«ãéçããŒãžãçæããŠãµã€ãã®ã¡ã€ã³ ãªããžããªã«å ¬éããããã®ããŒã«ã«ç°å¢ãå±éããå¿ èŠããããŸãã
è±å¯ã«ãã ãããŠåœŒãã¯çåãââåé¡ãæ±ããŠããŸãããããã®ã¢ã¯ã·ã§ã³ã¯æéãšåŽåãããããç¹ã«OSããOSãžã®è€æ°ã®ç§»è¡ãããŒããã©ã€ãäžã®ããŒã¿æå€±ã®ã€ã³ã·ãã³ãã®åŸã§ã¯ãæçµçã«ã¯ãµã€ãã®äœæ¥ã忢ããŸãã ïŒç§ã®å Žåãããã§ããïŒ.
ã€ãæè¿ããµã€ãäžã®ãããã¢ããéç¥ãŸã㯠GitHub ããã®ãã¥ãŒã¹ã¬ã¿ãŒã§ãæ°ããçµã¿èŸŒãŸãã CI/CD ãéç¥ããããããã®ã¢ã¯ã·ã§ã³ãæå°éã®åŽåã§å®è¡ã§ããããã«ãªããŸããã
éçããŒãžãžã§ãã¬ãŒã¿ã«ã€ããŠ
ãã®ãµãé ç®ã«ã€ããŠã¯ç¹ã«çŠç¹ãçµãã€ããã¯ãããŸããããéžæãšäœ¿çšäžã«ç§ããã©ãçããããã€ãã®è«æãå ±æããããšæããŸãã
1) ããã°ã©ãã³ã°èšèªã«é©ãããžã§ãã¬ãŒã¿ãŒããŸãã¯æãçè§£ãããããžã§ãã¬ãŒã¿ãŒãéžæããå¿ èŠããããŸãããã®ã¢ã€ãã¢ãæãã€ããã®ã¯ããµã€ããæ©èœãããããã®æ©èœãããã€ãæžãçµããå®å®æ§ãšèªååãé«ããããã®è£å©ææ®µãå°å ¥ããªããã°ãªããªãã£ããšãã§ãããããã«ãããã¯ãã©ã°ã€ã³ã®åœ¢ã§è¿œå æ©èœãèªåã§èšè¿°ããè¯ãçç±ã§ããããŸãã
2) ã©ã®ãžã§ãã¬ãŒã¿ãŒãéžæãããã¯å人ã®éžæã§ãããGitHub Pagesã®æ©èœã«æåã«æµžãããã«ã¯ããŸãã€ã³ã¹ããŒã«ããå¿ èŠãããããšãèæ ®ãã䟡å€ããããŸãã ã幞ããªããšã«ããªããžããªå ã®ãœãŒã¹ããçŽæ¥ãµã€ããçæããããšãã§ããŸãã ïŒç§ã®éžæã§ãããç¹°ãè¿ããŸãïŒ.
ç§ããžã§ãã¬ãŒã¿ãŒãéžãã ã®ã¯ãæåã®ãã€ã³ãã«åºã¥ããŠããŸãã Pythonã§æžããããã®ã¯ç§ã«ãšã£ãŠç°è³ªãªJekyllãç°¡åã«çœ®ãæãã ïŒçŽ1幎é䜿çšïŒããã®çµæãèšäºã®äœæãç·šéããµã€ãäžã§ã®äœæ¥ãéããŠãç§ã«ãšã£ãŠèå³ã®ããèšèªã«é¢ãããããªãçµéšãåŸãããŸãã
__
åé¡ã®å®åŒå
äž»ãªã¿ã¹ã¯ã¯ããã©ã€ããŒã ãªããžããªããéçããŒãžãèªåçã«çæã§ããããã«ããã¹ã¯ãªãã (å®éã«ã¯æ§æãã¡ã€ã«) ãäœæããããšã§ãããã®ãœãªã¥ãŒã·ã§ã³ã«ã¯ä»®æ³ç°å¢ã®æ©èœãçµã¿èŸŒãŸããŸããã¹ã¯ãªããã¯ãæºåå®äºã®ããŒãžããããªã㯠ãªããžããªã«èªåçã«è¿œå ããŸãã
解決ã®ããã®ããŒã«
åé¡ã解決ããããã«äœ¿çšããããŒã«:
- GitHub ã¢ã¯ã·ã§ã³;
- Python3.7;
- ããªã«ã³;
- ã®ãã;
- 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) 次ã«ãã¹ã¯ãªãããèµ·åããã¢ã¯ã·ã§ã³/ããªã¬ãŒãéžæããå¿ èŠããããŸãããã®å Žåãããã¯ãªããžããªãžã®æ°ããã³ãããã®å®æçãªããã·ã¥ã§ãã
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; ããŒã«ã«èšå®ãšå
¬éçšèšå®ãåé¢ããæ¹æ³ã«ã€ããŠã®è©³çްã¯ã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) ã³ãããã¡ãã»ãŒãžãçæãã倿Žãã³ãããããŠãªããžããªã«ããã·ã¥ããŸããã³ããããç¡é§ã«ãªããªãããã«ããŸãããã«å¿ããŠ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 Web ã€ã³ã¿ãŒãã§ãŒã¹ãä»ããŠãã¡ã€ã«ãäœæããå Žåã§ãããã©ã€ããŒã ãªããžããªã«çŽæ¥å€æŽã远å ãããšãã¢ã¯ã·ã§ã³ããã¹ãŠãèªåçã«å®è¡ããŸãã äºæããªãã¹ã¯ãªããã®å€±æãçºçããå Žåã¯ãé»åã¡ãŒã«ã«éç¥ãéä¿¡ãããŸãã
å®å šãªã³ãŒã
ã³ããããã¡ã€ã³ ãªããžããªã«ããã·ã¥ãããããšãéç¥ããæåŸã®ã¹ãããã远å ããããäœæ¥ããŒãžã§ã³ãæ®ããŠãããŸãã
äžèšã® Secrets ã䜿çšãããããã ããŒã¯ã³ãšã¡ãã»ãŒãžãéä¿¡ããå¿ èŠããããŠãŒã¶ãŒ 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ã¹ã¯ãªãŒã³ã·ã§ãã

ããããã®å®è¡ã®çµæããœãŒã¹ ãªããžããªã® [ã¢ã¯ã·ã§ã³] ã¿ãã«è¡šç€ºãããŸãã

ã¹ã¯ãªããã®å®äºã«é¢ãããããããã®ã¡ãã»ãŒãž
䟿å©ãªãªã³ã¯é
åºæïŒ habr.com
