個人のはてなブログ運用にHatenaBlog Workflows Boilerplateを導入する
はじめに
こんにちは、M-Yamashitaです。
今回の記事は、個人のはてなブログ運用にHatenaBlog Workflows Boilerplateを導入する手順についてです。
以前はGitHub Actionsとblogsyncを活用した記事の作成と投稿自動化を自作していましたが、制限事項のため時折不便さを感じていました。この不便さが今回のHatenaBlog Workflows Boilerplateで解消されたため、導入手順について記載します。
前提
- 個人のGitHubアカウントのFreeプランを使用
伝えたいこと
- 以前の投稿自動化の構成、および制限事項
- HatenaBlog Workflows Boilerplateの導入手順
- 投稿の実例
以前の構成
GitHub Actionsとblogsyncを活用した記事の作成と投稿自動化を作っていました。詳しくはこちらを参照してください。
上記記事にあるように投稿はできるものの、GitHub側のコードを編集せずにはてなブログ側のみで編集するとリポジトリにあるブログと整合性が取れない点が気になっていました。また画像については、現在のつくりではGitHub上のプライベートリポジトリにある画像をはてなブログにアップできませんでした。
HatenaBlog Workflows Boilerplateの導入
HatenaBlog Workflows Boilerplateについて
そんななか、昨年はてなブログの公式お知らせにて、GitHub上ではてなブログ運営を可能にするテンプレートリポジトリが公開されました。
さらに今年の春、そのテンプレートリポジトリに画像アップロード機能が追加となっています。
画像アップロードまでできるようになったため、以前の独自構成の制限事項を解消できると考えました。そのため、はてなブログ公式のテンプレートリポジトリ使用への移行を決めました。
導入設定
テンプレートリポジトリには導入手順が丁寧に記載されているため、基本的にその手順通りに進めていけば問題ありません。
ただ、私が個人用のGitHub Freeプランを使ってprivateのリポジトリではてなブログを管理するため、いくつかの制限事項がありました。ここではその制限事項とその対応について記載します。
個人ブログに導入時の制限事項
次に挙げる制限事項は、個人のGitHubアカウントのFreeプランを使用している場合に発生する制限となります。
主に2つの制限事項があります。
- GitHubのbranch protection、allow auto mergeの設定不可
-
create draft
アクションによるPull Requestのdraft版作成不可
制限事項1: GitHubのbranch protection、allow auto mergeの設定不可
1つ目の制限は、branch protectionやallow auto mergeが設定できないことです。まずはbranch protectionの設定についてです。テンプレートリポジトリのREADMEの手順を見てみます。
- GitHub リポジトリの設定 「Branches」 のAdd branch protection ruleボタンから、ルールを作成する
Branch name pattern に main を指定する
手順どおりにルールを作ると、GitHub上に以下のような表示が出力されます。
この表示について、GitHubの公式ドキュメントを読んでみると以下のような記載があります。
Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations. Protected branches are also available in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server.
つまり、個人のGitHub Freeプランではprivateリポジトリでbranch protection ruleを設定することができません。
ここが未設定の場合mainブランチに対する保護がありませんが、個人ブログ運営でありこのリポジトリで関わっているのは私だけなので、ここをスキップしても運用に問題はないと判断しました。そのためここはスキップしました。
また、以下のallow auto merge設定の手順も同様にスキップしました。
- GiHub リポジトリの設定 「General」 の Pull Requests 項の Allow auto merge にチェックを入れる
ここをスキップすると、テンプレートリポジトリで用意されているはてブログの同期GitHubアクション(pull from hatenablog等)により自動生成されるPull Requestが、自動でマージされなくなります。そのため自動生成Pull Requestを手動でマージする必要がありますが、これも個人ブログ運営であるため問題ないと判断しました。
create draft
アクションによるPull Requestのdraft版作成不可
制限事項2: 2つ目の制限は、Pull Requestのdraft版作成ができないことです。この制限が実際に現れるのは、以下にあるような記事作成を行う手順の場合となります。
ブログオーナーのアカウントで投稿する場合
Actions から create draft を選択し、Titleに記事タイトルを設定、Branch: mainに対して実行する
作成した下書きを含むプルリクエストが作成される
実際にこの方法で記事を作成しようとGitHub Actionsを実行すると、以下のようなエラーが出力されました。
Create or update the pull request
Attempting creation of pull request
Error: Draft pull requests are not supported in this repository.
エラーの通り、このリポジトリではdraft版の記事作成ができないという制限があります。
実際にこのエラーが出力されるまでのGitHub Actionsのワークフローをコードリーディングしてみます。まずはcreate draft
アクションのワークフローを見てみます。
jobs:
create-draft:
uses: hatena/hatenablog-workflows/.github/workflows/create-draft.yaml@v1
with:
title: ${{ github.event.inputs.title }}
draft: true
BLOG_DOMAIN: ${{ vars.BLOG_DOMAIN }}
secrets:
OWNER_API_KEY: ${{ secrets.OWNER_API_KEY }}
このワークフローを見ると、draft: true
のパラメータを持ってhatenablog-workflows
リポジトリのcreate-draft.yaml
を実行していることがわかります。そのため、次はそのリポジトリのcreate-draft.yaml
を見てみます。
name: "[Reusable workflows] create draft and pull from hatenablog"
on:
workflow_call:
inputs:
title:
required: true
type: string
draft:
default: true
type: boolean
BLOG_DOMAIN:
required: true
type: string
secrets:
OWNER_API_KEY:
required: true
# 中略
- name: pull draft by title
uses: hatena/hatenablog-workflows/.github/actions/create-draft-pull-request@v1
with:
title: ${{ inputs.title }}
draft: ${{ inputs.draft }}
BLOG_DOMAIN: ${{ steps.set-domain.outputs.BLOG_DOMAIN }}
ENTRY_PATH: ${{ steps.post-draft.outputs.ENTRY_PATH }}
このyamlの最後にpull draft by title
があります。ここでactionsディレクトリにあるcreate-draft-pull-request
を実行していますので、そこを見てみます。
- name: create draft pull request
uses: peter-evans/create-pull-request@v7
env:
OWNER_NAME: ${{ steps.set-owner.outputs.OWNER_NAME }}
ENTRY_ID: ${{ steps.set-entry-variables.outputs.ENTRY_ID }}
PREVIEW_URL: ${{ steps.set-entry-variables.outputs.PREVIEW_URL }}
with:
title: ${{ github.event.inputs.title }}
branch: draft-entry-${{ env.ENTRY_ID }}
body: |
## ${{ github.event.inputs.title }}
- 編集ページのURL: https://blog.hatena.ne.jp/${{ env.OWNER_NAME }}/${{ inputs.BLOG_DOMAIN }}/edit?entry=${{ env.ENTRY_ID }}
- プレビューへのURL: ${{ env.PREVIEW_URL == 'null' && 'なし' || env.PREVIEW_URL }}
delete-branch: true
draft: ${{ inputs.draft == 'true' }}
ここでPull Request作成をするために、peter-evans/create-pull-request
アクションを使用しています。
このアクションのドキュメントを見てみると、draft
のパラメータがあり、これがtrue
の場合draft版のPull Requestを作成するとあります。
よって、個人ブログでcreate draft
アクションを実行する際には、draft版ではなく通常のPull Request作成とするためにdraft: false
を指定する必要があります。そのため、私のリポジトリでは以下のようにその指定を入れることで解決しました。
jobs:
create-draft:
uses: hatena/hatenablog-workflows/.github/workflows/create-draft.yaml@v1
with:
title: ${{ github.event.inputs.title }}
draft: false
BLOG_DOMAIN: ${{ vars.BLOG_DOMAIN }}
secrets:
OWNER_API_KEY: ${{ secrets.OWNER_API_KEY }}
実例
それでは実際に画像を含んだブログを作ってみます。まずはGitHub Actionsにてcreate draft
アクションを実行します。
GitHub Actionsが成功するとブログ用のPull Requestが作成されます。このPull Requestのdescriptionには、ブログの編集ページのURLとプレビューへのURLが記載されています。
このブランチにてテキスト追加と画像アップロードを試します。画像アップロードについては、作成する記事から辿れるパスであればどこに画像を配置しても問題ありません。今回はimagesディレクトリを作成し、そこに画像を置いて参照する形にしました。
なお、画像にはtitle
の指定も可能となっており、シングルクォートもしくはダブルクォートで囲むことでtitle
を指定できます。
この変更をコミットすると、botにより画像がはてなブログにアップされ、ファイル内の画像参照も自動で変更されます。そのため、この時点でGitHubに置いていた画像を削除しても問題ないようです。
最後に、ブログ内のDraft: true
をDraft: false
に変更し、Pull Requestをマージすることではてなブログに記事が投稿されます。
さいごに
この記事では、個人のはてなブログ運用にHatenaBlog Workflows Boilerplateを導入する手順について記載しました。
ちょっとした制限はあったものの、個人ブログ運営であれば問題ない範囲でした。今後はこの自動投稿を使って効率的にブログを投稿していきます。
Discussion