前回の記事で記載した通り、ブログソース(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_repository をblog-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さんいつもありがとうございます。