記事部分をプライベートリポジトリに移した

2025-04-16

#Diary

これまでは執筆中の記事もGitHub上では公開されている状態だったのですが、万が一ここが大炎上した時のためにいつでも非公開にできるようにしておきます。

以下の2つのレポジトリに分割し、ras0q/blogのposts/にras0q/blog-postsをGit Submoduleとして配置しました。
昨日書いた GitHub IssueをCMSにした も、現在はras0q/blog-postsの方で動くようになっています。

  • ras0q/blog (public): ページの構造やLumeの設定
  • ras0q/blog-posts (private): 記事がフラットに置かれる

また、記事が更新されたら自動でSubmoduleの参照を更新して本番環境に反映できるようにしました。
以下の記事を参考に、自分しかアクセスできないGitHub Appを設定して認証を行いました。
子が変更されると親のworkflow_dispatchイベントを発火させる設定になっています。

Cloudflare Pages (じきにWorkersに移したい) でデプロイしている関係でSubmoduleのRemove URLをSSHにする必要があり、素直にPATを使うことができず鍵生成の必要があったのですが、GitHub Appを使うことでここら辺がクリアに運用出来て良い体験でした。

環境変数やシークレットの設定が面倒ですが、これはどの方法でも少なからず起こるので受け入れました。

追記: BOTのCommitでは以下のWorkflowは発火しないため、(例えばras0q/blogの場合では)記事作成のWorkflowの完了をトリガーにするなどの工夫が必要です。

# [ras0q/blog-posts] .github/workflows/update-parent.yaml
# 子 (ras0q/blog-posts) から親 (ras0q/blog) のWorkflowを発火させる

name: Trigger parent workflow to update submodules

on:
  push:
    branches:
      - main
  # 追記: BOTのCommitでは発火してくれないので、記事作成Workflowから発火するようにする
  workflow_run:
    workflows:
      - "Generate post"
    types:
      - completed

jobs:
  update-parent:
    if: ${{ github.event_name != 'workflow_run' || github.event.workflow_run.conclusion == 'success' }}
    runs-on: ubuntu-latest
    steps:
      - uses: actions/create-github-app-token@v1
        id: app-token
        with:
          app-id: ${{ vars.GH_APP_ID }}
          private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}
          owner: ${{ github.repository_owner }}
      - name: Dispatch parent workflow
        run: gh workflow run --repo ras0q/blog update-submodules.yaml
        env:
          GH_TOKEN: "${{ steps.app-token.outputs.token }}"
# [ras0q/blog] .github/workflows/update-submodules.yaml
# 手動で発火させることができ、Submodulesを更新する

name: Update submodules

on:
  workflow_dispatch:

jobs:
  update-submodules:
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - uses: actions/create-github-app-token@v1
        id: app-token
        with:
          app-id: ${{ vars.GH_APP_ID }}
          private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}
          owner: ${{ github.repository_owner }}
      - uses: actions/checkout@v4
        with:
          token: "${{ steps.app-token.outputs.token }}"
          submodules: true
      - name: Update submodules
        run: |
          git submodule update --remote --recursive
          git config --global user.name "GitHub Actions"
          git config --global user.email "[email protected]"
          git add .
          git commit -m "Update submodules"
          git push origin HEAD