前回の記事で記載した通り、ブログソース(mdたち)の private リポジトリ化について紹介します。

以下の仕様で実装します。

  • privateリポジトリに記事をpushする
  • github actions で public リポジトリに docs のみdeployする

前提

  • blog -> privateリポジトリ。md形式のブログソースデータを管理します。
  • blog-public -> publicリポジトリ。こちらでgithub pages を公開します。

準備

sshキーペアの作成

まずは、privateからpublic側へactions で push できるよう、キーペアを作成します。

ssh-keygen -t rsa -b 4096 -C "$(git config user.email)" -f gh-pages -N ""
  • gh-pages.pub
  • gh-pages

の2ファイルが生成されていると思います。-fで指定するキーファイル名は何でもいいです。

blog-private側へ公開鍵を登録

blog-privateリポジトリへ移動します。 Setting -> Deploy keys から Add deploy key を選択して、公開鍵をペーストします。 鍵の名前はなんでもいいです。

blog側へ秘密鍵を登録

blog側のリポジトリへ移動します。 Setting -> Actions から New repository secret を選択して、秘密鍵をペーストします。 鍵の名前はなんでもいいですが、後述の Github Actions 上で指定する必要あるので、特に要件がなければACTIONS_DEPLOY_KEYでいいでしょう。

github に登録後、ローカル上のキーペアは破棄してOKです。

github actions を登録

こちらのテンプレートほぼそのままですが、exclude_assets がポイントで、ここで指定されたファイル・ディレクトリは除外されます。僕の設定では、docsディレクトリへ build 済み Hugo データを配置して公開しているので、docs以外を列挙します。ディレクトリはファイル名と同じように名前だけで指定すれば認識してくれます。

exclude_assets: '.github,themes,static,resources,content,layouts,archetypes,config.yml,.gitmodules,.hugo_build.lock,README.md'

また、Deployが走る度にcnameの設定が初期化されるため、actionsの中で設定しておきます。

cname: a2ito.ml

あとはexternal_repositoryblog-publicに指定して、blogへ push します。

actions全量を載せておきます。

vi .github/workflows/gh_pages.yml
name: GitHub Pages

on:
  push:
    branches:
      - main  # Set a branch name to trigger deployment
  pull_request:

jobs:
  deploy:
    runs-on: ubuntu-20.04
    concurrency:
      group: ${{ github.workflow }}-${{ github.ref }}
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: true  # Fetch Hugo themes (true OR recursive)
          fetch-depth: 0    # Fetch all history for .GitInfo and .Lastmod

      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v2
        with:
          hugo-version: '0.96.0'

      - name: Build
        run: hugo --minify

      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3
        if: ${{ github.ref == 'refs/heads/main' }}
        with:
          deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
          external_repository: a2-ito/blog-public
          publish_branch: main
          publish_dir: .
          exclude_assets: '.github,themes,static,resources,content,layouts,archetypes,config.yml,.gitmodules,.hugo_build.lock,README.md'
          cname: a2ito.ml

2022/4/6 追記

cname がうまく効いていない状況を確認しました。blog-publicに対してcnameを設定してほしいのですが、設定されていません。今時点では custom domain について都度手動での初期化が必要のようです。もしかしたらexternal_repsitoryとの組み合わせでは利用できない可能性があるので、回避策を考えます。

2022/4/7 追記

回避策の対応が完了しました。基本的な考え方は、actions-gh-pagesを使わずに、公開対象のディレクトリだけ普通に push する、という愚直な方法にしています。他の良いやり方があるかどうかはわかりません。。。

actions における Deploy の箇所を以下に置き換えました。

      - name: Setup ssh key
        env:
          GITHUB_IO_REPO_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }}
        run: |
          echo "$GITHUB_IO_REPO_DEPLOY_KEY" > ~/deploy_key.pem
          chmod 600 ~/deploy_key.pem
          ls -ltr ~/deploy_key.pem

      - name: Deploy pages
        env:
          GIT_SSH_COMMAND: ssh -i ~/deploy_key.pem -o StrictHostKeyChecking=no -F /dev/null
        run: |
          #origin=https://a2-ito:${ACTIONS_DEPLOY_KEY}@github.com/a2-ito/blog-public.git
          git clone https://github.com/a2-ito/blog-public.git
          ls -ltr
          cd blog-public
          cp -pr ../docs .
          git config --global user.email "[email protected]"
          git config --global user.name "a2-ito"
          git config remote.origin.url "[email protected]:a2-ito/blog-public.git"
          git add ./docs
          git commit -m "Deploy $GITHUB_SHA by GitHub Actions"
          git push origin main

2022/4/10 追記

template 化して公開しました。ご利用ください。

privateリポジトリ(actionsあり、templateではpublicにしてます)

https://github.com/a2-ito/blog-template

publicリポジトリ

https://github.com/a2-ito/blog-template-public

github pages

https://a2-ito.github.io/blog-template-public/

終わりに

なんか得した気分。githubさんいつもありがとうございます。

参考にさせて頂いたサイト

https://3nan3.github.io/post/2019122201_github_actions/