Skip to content

GitHubでImmutable Releasesを有効にした運用

オプションを有効にする手順はGitHub ReleasesのImmutable Releasesに書いた。

ソースコードを配布するだけのリポジトリ

Section titled “ソースコードを配布するだけのリポジトリ”

単純にソースコードを配布するだけのリポジトリであれば、オプションを有効にするだけで問題なく動作する。

追加のアセットが必要なリポジトリ

Section titled “追加のアセットが必要なリポジトリ”

例えば check-journal などではビルドしたバイナリもリリースで公開するようにしているが、このとき以下の手順でリリースを行っていた。

  1. GitHubのUIでバージョンを付けてリリースを作成する(手作業)
  2. published イベントでワークフローを起動してバイナリをビルドする
  3. 完成したらリリースにアップロードする

ワークフローは以下のような内容だった。

on:
release:
types:
- published
jobs:
build:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v5
- run: make zip
- uses: actions/upload-artifact@v4
with:
name: artifacts
path: "*.zip"
deploy:
needs: build
permissions:
contents: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/download-artifact@v5
with:
path: artifacts
merge-multiple: true
- name: release
run: |
gh release upload "$TAG" artifacts/*.zip
env:
TAG: ${{ github.ref_name }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

このとき、Immutable Releasesが有効になっていると gh release upload によるアップロードが行えなくなる。状態はGitHub Releasesにおけるリリースの状態に書いたが、ドラフトであれば成果物の追加が行えるけれども、どうやら自動で保存する機能と競合するためなのか、ドラフトリリースを作ったイベントでワークフローをトリガーできない。

公式ドキュメントにUsing immutable releases and tags to manage your action’s releasesがあって、このドキュメントではGitのタグとして作る方法が紹介されていた。このとき、誤って先にGitHub上でリリースとして作ってしまった場合に新しくタグを作るしかなくなってしまうので、本当はGitHubのUIからリリースを作れてしまう機能を止めたいが、仮に間違えたとしてもImmutable Releasesを使わないよりはメリットが大きいだろうから諦める。

diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index ef97f43..c1db329 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -1,9 +1,9 @@
name: Release
on:
- release:
- types:
- - published
+ push:
+ tags:
+ - v[0-9]+.[0-9]+**
jobs:
build:
@@ -47,7 +46,10 @@ jobs:
merge-multiple: true
- name: release
run: |
- gh release upload "$TAG" artifacts/*.zip
+ gh release create "$TAG" \
+ --title="$TAG" \
+ --generate-notes \
+ --draft artifacts/*.zip
env:
TAG: ${{ github.ref_name }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

一気にリリースノート生成と成果物のアップロードまで行っているが、リリースノートの内容は後から変更できるし、リリースと関連付けられていないタグなら削除できるのでタグ付けを間違えた場合はドラフトリリースとタグそのものを削除すればいい。

タグを打ったとき無作為にリリースが作られても困るのでGitHub Actionsのタグやブランチ名で使えるパターン記法を使って正式リリースだけに制限している。また gh release upload から gh release create に変更したが、パーミッションはGitHub Actionsのトークンに与えられるパーミッションを見る限りは特別なものは不要だった。