講義を DX する(その2)

Dec 1st, 2022 lifehack git github typescript deno

はじめに

前回で新たに判明した課題は次の 3 つであった.

上記の課題を解決するために,下記 2 点を実現する.

今回の DX

【今回】

成果物

最終的に出来上がった仕組みを組み込んだサンプルが以下のリポジトリとなる.readme ファイルに複数クラス用にデプロイした URL が記載されている.

全てのクラスの講義を 1 つのリポジトリで管理できるようになった.これにより,新クラス追加,資料修正,修正の反映,などより容易に実行することができる.

状況はこれまでと同様.

方針

GitHub 上の単一リポジトリで管理するためには以下の状況をクリアする必要がある.

ブランチを用いたソースコード管理

各クラス用のブランチを用意する.例えばクラス 01 と 02 の 2 つが存在する場合,ブランチ全体は以下のような構成となる.

.
├── main
├── develop
├── gh-pages
├── class01-main
├── class01-develop
├── class01-deploy
├── class02-main
├── class02-develop
└── class02-deploy

役割は以下のとおりである.

ブランチ 役割
main マスタデータの最新状態を管理する.
develop マスタデータの編集を行う.main にプルリクエストを送信する.
gh-pages ビルド内容確認用.
class0n-main 各クラス講義資料の最新状態を管理する.
class0n-develop 内容を編集して main にプルリクエストを送信する.
class0n-deploy main ブランチの内容をビルドし,デプロイ用のファイルが push される.

ブランチが増えていくため,ブランチの命名規則を定めておくことが大切だ.

GitHub Actions を用いてビルド → zip 圧縮

これまでと同様であるが,ブランチ毎に多少 yml ファイルを変更する必要がある.

具体的には以下のような内容となる.処理自体は変更ないため,ブランチ名を適切に設定しておけば問題ない.

name: github pages

on:
  push:
    branches:
      # 🔽 発火タイミングを各クラスのmainブランチを指定
      - class01-main
  pull_request:

jobs:
  deploy:
    runs-on: ubuntu-18.04
    steps:
      - uses: actions/checkout@v2

      - name: Setup mdBook
        uses: peaceiris/actions-mdbook@v1
        with:
          mdbook-version: "0.4.8"
          # mdbook-version: 'latest'

      # mdファイルのビルド
      - run: mdbook build

      # サンプルファイルをzip圧縮してビルドしたファイル群に追加
      - run: |
          mkdir ./book/samples
          cd samples
          find . \! -name '*.zip' -type d -exec zip -r {}.zip {} \;
          mv *.zip ../book/samples

      # ビルドされたファイル群をgh-pagesブランチにデプロイ
      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3
        # 🔽 ソースを各クラスのmainブランチを指定
        if: github.ref == 'refs/heads/class01-main'
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir:
            ./book
            # 🔽 デプロイ先を各クラスのdeployブランチを指定
          publish_branch: class01-deploy

デプロイ方法の変更

現状でデプロイに使用している GitHub Pages では 1 つのブランチしかデプロイすることができない.そのため,クラスをブランチで管理してもそれぞれデプロイすることができない.

そこで,デプロイ環境を「GitHub Pages」から「Vercel」に変更した.両者の特徴は以下のとおりである.

GitHub Pages

↓ 前回構築した,GitHub Pages を使用したフローの図.

GitHub Pagesのデプロイフロー

Vercel

今回のケースでは,「単一リポジトリに複数のデプロイ用ブランチが存在し」「ブランチ毎に 1 つのデプロイ先が存在する」ため,GitHub Pages では対応しきれない.

Vercel を用いれば,「単一リポジトリの任意のブランチに対してプロジェクトを作成」することができるため,ブランチごとのデプロイが可能となる.

↓ このように,ブランチ(各クラス)ごとのプロジェクトが作られて,別々の URL にデプロイされることとなる.

Vercelのデプロイフロー

また,Vercel のほうが GitHub Pages よりも URL がスッキリした(個人の感想).

GitHub Pages の URL

https://hogeuser.github.io/dx-the-lecture-01-class01/

Vercel の URL

https://dx-the-lecture-02-class01.vercel.app/

結果

これらにより,講義のフローは以下のようになった.

  1. マスタデータを作成しておく.
  2. 講師は,クラスが開講するタイミングで main ブランチからクラス用のブランチ(class0n-main,class0n-develop)を作成する.
  3. 各クラス用ブランチの yml ファイルを編集し,GitHub Actions でビルドできるよう設定して実行する.
  4. Vercel でクラス用のプロジェクトを作成し,各クラスのデプロイ用ブランチ(class0n-deploy)を参照するよう設定する.

また,講義資料の修正もプルリクエストで対応できるようになり,全てを一人の講師が行う必要もなくすことができた.

  1. 各クラスで修正が発生した場合は,develop ブランチに対してプルリクエストを送信する.
  2. 管理者はプルリクエストを確認し,問題なければ main ブランチにマージしてマスタデータを更新する.
  3. 修正の度にマスタデータが最新となるため,以降開講するクラスにも間違いなく修正点が反映される.

まとめ

今回 mdbook,GitHub,Vercel の 3 種類を用いることで,抱えていた問題を一掃することができた.

【前回】

【今回】

定型的な業務を効率化することにより,より創造的な仕事にリソースを注げるようになるだろう.

コードを書いた箇所は GitHub Actions のシェルコマンドのみだが,各技術を活用することで自動化を実現することができた.

今後も積極的に自動化できる部分は自動化していく所存である.怠惰であることは講師の美徳だ.

今回は以上だ(`・ω・)b

...と思ったがそうではなかった(まさかの次回).