GitHubリリースという、GitHubでタグに対してリリースノートを書ける機能があります。

このリリースノート機能は、パーマネントリンクもあるし、Markdownも書けるし、画像もアップロードできるし、絵文字でリアクションもできるし、RSSもあるし、通知機能もあるし、GitHub Discussion連携すればコメントも書けるし、全文検索もついてくるしこれブログとして使えるんじゃないかと思いました。

そういう発想から、GitHubリリースノートをブログとして運用するためのちょっとしたブログシステムを作って使っています。

次のリポジトリが実際に動いてるものです。

リリースの一覧を見ると本の感想の記事が並んでいます。

単純にリリースノート機能を使うのとは若干フローを変えていて、GitHub Issueにドラフトを管理できるようにしていて、 複数のIssueで書いたドラフトをまとめて一つの記事としてリリースノートに公開できるワークフローを実装しています。 (Zennのスクラップ機能や1日に複数の記事を書けるはてなダイアリーとかに近いようなイメージです)

このリポジトリはテンプレートリポジトリになっていて、ワンクリックで同じ仕組みを持ったリポジトリブログを作成できます。

GitHub Releasesブログのセットアップ方法

このブログシステムを使いたい人向けのガイドです。

  1. 次のリンクからリポジトリをテンプレートにして新しいリポジトリを作成: https://github.com/azu/book-review/generate
  2. 作成したリポジトリの https://github.com/{owner}/{repo}/actions/workflows/setup.yml にアクセスし”Run Workflow”を実行する
    • 必要なラベルなどがセットアップされます
  3. [必要なら] リポジトリのSettingsからDiscussionsを有効にする
    • Discussionsをブログへのコメントする場所として利用できます

使い方

azu/book-review: 本を読んだ感想を書くブログです。のような読書ブログを書きたい場合は、次のような使い方ができます。

  1. Issueを作り、タイトルに書籍のタイトルを入れて、本文に感想を入れる
  2. Issueに”Status: Draft”のラベルを付ける
  3. GitHub Actionsが”Status: Draft”のIssueをまとめたDraft Releaseを自動的作成する
  4. 公開したくなったらDraft Releaseを編集して、Publishすると公開され、“Status: Draft”のIssueは閉じられる

複数の書籍を若干並行して読むことがあったり、テーマで読書するときは同時に読むことがあります。 そういう時にそれぞれの本に対応するIssueと作って、そこに感想を書いておけば、まとめて一つの記事として公開できます。 もちろん、一冊ずつ書いても問題ないです(“Status: Draft”がついてるものだけが自動的にまとめられるので、一冊ずつリリースしていけばいけます)

もっと別の使い方として、JSer.infoのような1週間の間にあったニュースをまとめるようなブログサイトも作れます。

次のように、Issueごとに紹介したい記事を書いていきます。 この時にラベルをその記事のタグとして使うこともできます。(テンプレート側を少し変更して対応しています)

Issue

Issueを編集したり、ラベルをつけたりするとGitHub Actionsで自動的にドラフトリリースノートを作成してくれます。

Draft Release Note

あとは、リリースノートにタイトルをつけて公開すればOKです。

Tipsとして、GitHub issueのタイトルとBodyは https://github.com/jser/blog-example/issues/new?title=test&body=body のようにURLから指定もできます。また、Issueテンプレートを使うとフォームなども利用できます。

機能の一覧

このGitHub Releases as a blogの機能を書き出してみると、GitHubリリースノート自体の機能が色々あるのでかなり高機能です。

  • スクラップ機能
    • Issueごとにスクラップを書いて、Releasesでまとめて1つの記事として公開できます
  • ドラフト と 公開済みのライフサイクル
    • Issueが個別のドラフトになります
    • Status: Draft ラベルをつけたIssueをドフラトとして扱います
      • ラベルがついてないIssueは対象外となるので、ドラフトではないIssueも混在できます
    • Issueが編集されるたびにGitHub Actionsで、GitHub Releasesにドラフトリリースノートを作成します
      • このドラフトリリースノートには、その時点でStatus: Draft ラベルがついたIssueが全てまとめられています
    • ドラフトリリースノートをPublishすると、Status: Draft ラベルがついたIssueが全て自動でクローズされ、Status: Releasedラベルを付与します
    • このライフサイクルは.github/workflows/create-draft.ymlが処理しています
  • プロジェクト管理
    • GitHub Projectsを使うことで、ドラフトや公開済みのIssueを管理できます
    • Status: Draftラベル: ドラフト
    • Status: Releasedラベル: 公開済み
    • ラベルは setup.yml のworkflowを実行すると追加できます
  • テンプレート
  • タグ = ラベル
  • 画像/動画サポート
    • Issueにそれぞれアップロードできます
  • RSS
    • GitHub ReleasesのリリースノートはRSSで購読できる
  • GitHubと連携したWatchの仕組み
    • GitHubアカウントを持っているならWatchで購読できる
  • コメントシステム = Discussion
    • リリース時に”Create a discussion for this release”を選択することでコメント欄として使えるDiscussion連携ができる
    • また、リリースごとにリアクションボタンが表示される
  • 共同編集
    • リポジトリに書き込めるユーザーを制限することで、執筆者を管理できます
    • Issueを編集すれば、共同編集ができます
    • Issueを立てた人が、そのIssueの執筆者となります
  • 著者表記
    • 記事中で @azu のようにMentionを入れると、自動的にContributorsとして記事の下部に表示されます。
  • 検索
  • Markdown
  • アクセス解析
    • Insight > TrafficからPV数を確認できます
  • OGPイメージ
    • GitHubが自動的に生成してくれます
  • ワークフロー
    • GitHub Actionsで on: release のWorkflowで公開時にWorkflowを実行できます
    • リポジトリのWebhook設定で Releases のWebhookを設定できます
    • e.g. 記事を公開するときにSNSにポストするなど

URLはドメインを使えないことやUIが変更できないとかの問題はありますが、GitHubアカウントだけで簡単に始められます。

読者側が開発者ならGitHubアカウントを持ってるので、通知方法もあり結構スマートです。 GitHubアカウントを持ってなくてもRSSやWebhookなどの連携を使えば、色々できると思います。

  • リポジトリの Watch → Custom → Releases を購読するとリリースだけを購読できます
    • GitHubアカウントが必要です
    • GitHub Notificationに基づいた通知方法で更新を通知します
    • デフォルトではNotificationsとGitHubに登録してるメールに通知が来ます
  • RSSで読みたい場合は https://github.com/azu/book-review/releases.atom を購読できます
    • こちらはGitHubアカウントは不要です
    • 任意のRSSリーダやSlack(/feed subscribe https://github.com/azu/book-review/releases.atom)などで購読できます

また、GitHubリリースノートにはリアクションボタンやDiscussions連携もできるので、ホスティングのブログサービスとそこまで機能差はないのかなという感じもします。 著者のGitHubアカウントをフォローできたり、GitHub Sponsorsの機能で著者を支援することもできます。

おわりに

GitHubリリースをブログとして使う方法について紹介しました。 結構冗談みたいな使い方ですが、意外と実用的でGitHub Actionsと組み合わせると色々な遊び方ができる気がします。

元々はJSer.infoみたいなサイトをどうやったら簡単に作れるだろうかという思考からスタートしていて、去年HubMemoを作ったのは同じ理由です。

この仕組みは、去年あたりからこの辺の情報サイトをどうやったら簡単に作れるかを考えていましたが、 この方法ならGitHubだけで完結するので、結構手軽だと思います。

ニュースサイトみたいなやつはワンクリックで使えるようなフレームワークがあった方がやる人がもっと増えるし、続けやすいと思います。 JSer.infoを10年以上やっていて、大きな記事を一発で書くのは失敗した時に停滞のリスクが高いので、 小さな記事を小さなイテレーションで回すことが大切だと思っています。

一度停止すると1週間、2週間、1ヶ月と長くなって、最終的には完全に止まります。 そのため、小さく進めて仮に止まっても小さく止まるようにするのが、続けるコツな気がします。

この辺の話は次の記事でも書いています。

このブログシステムは、1 issue単位で小さく進めて、それが溜まったら記事(リリースノート)としてまとめて公開するという、JSer.infoでやってる仕組みが実現できてるんじゃないかなという感じがします。 あと、Issueで進めることで複数人が同時に参加しやすくオープンな感じなのが、結構面白い特徴になる気がしています。 (普通のホスティング系のブログとかはこういうのがかなり難しい気がします)

この仕組みはけっこう気に入ってますが、あとは実際どうやったらもっとやる人が増えるのかなーというアイデアを募集しています。