🔥

GitHub Actionによる静的HTMLファイル生成

2022/07/01に公開

要件

  • GitHub Pages他に設置する静的HTMLファイル生成を自動化する
  • 指定したブランチの内容が更新された際に処理をキックする

仕様

  • CIはGitHub Actionを使用する
    • 楽やねん
  • Actionの処理は極力プリミティブな機能の組み合わせで構築する
    • GitHub Actionは「gitの個々のコマンドを使用する際もサードパーティ製のactionを使ってね」という思想に見えて、それには反しているのだが、嬉しいのかそれ
    • 今回はgitコマンドを直接叩く方式で行っている

処理の流れ

  1. 指定したブランチのpushをトリガーに処理を開始する(おそらくPRのマージでキックされないのは今後の課題
  2. 指定したブランチから作業ブランチを生成する
  3. HTMLファイル生成Pythonスクリプトをキックする
  4. 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