🔥
GitHub Actionによる静的HTMLファイル生成
要件
- GitHub Pages他に設置する静的HTMLファイル生成を自動化する
- 指定したブランチの内容が更新された際に処理をキックする
仕様
- CIはGitHub Actionを使用する
- 楽やねん
- Actionの処理は極力プリミティブな機能の組み合わせで構築する
- GitHub Actionは「gitの個々のコマンドを使用する際もサードパーティ製のactionを使ってね」という思想に見えて、それには反しているのだが、嬉しいのかそれ
- 今回はgitコマンドを直接叩く方式で行っている
処理の流れ
- 指定したブランチのpushをトリガーに処理を開始する(おそらくPRのマージでキックされないのは今後の課題
- 指定したブランチから作業ブランチを生成する
- HTMLファイル生成Pythonスクリプトをキックする
- 3が成功したらGitHub Pagesが参照するブランチへプッシュする
実装
name: Deploy to GitHub Pages
on:
push:
branches: [ main ]
workflow_dispatch:
env:
BASE_BRANCH_NAME: main
HOSTING_BRANCH_NAME: gh-pages
LOCAL_BRANCH_NAME: gh-pages-local
jobs:
Build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: '2.7'
- name: Setup git
run: |
git config user.name "GitHub Actions Bot"
git config user.email "<>"
cd $GITHUB_WORKSPACE
git fetch
- name: Clean up
# The reason why we don't use origin/gh-pages and just merge to it is, to prevent git complains gh-pages and the base branch have unrelated histories and conflicts on merge (it should never happen. idk why this happens)
continue-on-error: true
run: |
git branch -d $LOCAL_BRANCH_NAME
- name: Checkout
run: |
git fetch
git checkout $BASE_BRANCH_NAME
git pull
git checkout -b $LOCAL_BRANCH_NAME
- name: Build
id: build_step
run: |
python -m pip install --upgrade pip
pip install markdown
python makeAllEditions.py
- name: Commit
run: |
git add .
git commit -m 'Generated static html files'
git push -f origin $LOCAL_BRANCH_NAME:$HOSTING_BRANCH_NAME
- name: Teardown when the workflow failed
if: failure() && steps.build_step.outcome == 'failure'
run: |
git stash -u
使用している技術
- GitHub Action内における
- Environmental Variableの使用
- if分岐(特定のactionの失敗時にのみ実行するaction
- Python環境の構築(バージョン指定、pip install
Discussion