-
-
Notifications
You must be signed in to change notification settings - Fork 0
112 lines (106 loc) · 5.8 KB
/
Copy pathrelease.yml
File metadata and controls
112 lines (106 loc) · 5.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# リリースの入口。版宣言(`-SNAPSHOT` の除去・版表記の同期・CHANGELOG の節起こし)の PR を出すところまでを担う。
# 手順は「本ワークフローを実行 → 出た PR の CI を Approve and run で起こす → マージ」までで、
# 以降はマージ後の main の CI が green になった時点で、タグ付けから Maven Central・Gradle Plugin Portal
# への公開・GitHub Release・API ドキュメント・次版の PR まで CD が自動で進める。
# アクションはコミットハッシュで固定する(末尾コメントの vX.Y.Z は参照用。更新は Dependabot が追随する)
name: release (manual)
on:
workflow_dispatch:
inputs:
version:
description: "自版(例: 0.1.1)。空なら現在の enumizerVersion から -SNAPSHOT を落とした値"
required: false
type: string
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}
cancel-in-progress: false
jobs:
# 版宣言の PR を出す。既定ブランチは PR 経由の更新を必須とするため、直接 push はしない
declare:
runs-on: ubuntu-latest
timeout-minutes: 30
# ジョブ単位の permissions はワークフロー既定を置き換える。ブランチの push に contents: write・
# PR の作成に pull-requests: write が要る
permissions:
contents: write
pull-requests: write
steps:
# タグではなく既定ブランチを起点にする(リリースは既定ブランチの先端から切る)
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: main
- uses: actions/setup-java@de7274f081f381c8f8158605e0321c36c376e2e6 # v6.0.1
with:
distribution: temurin
java-version: 17
- uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0
# 版の正はビルド(カタログの Kotlin 版 + gradle.properties の enumizerVersion)にあるため、
# フル版は書き換え後のビルドから導出する。入力は shell へ直接展開せず環境変数で受ける
- name: Declare the release version
id: declare
env:
INPUT_VERSION: ${{ inputs.version }}
run: |
set -euo pipefail
current=$(sed -n 's/^enumizerVersion=//p' gradle.properties)
version="${INPUT_VERSION:-${current%-SNAPSHOT}}"
case "$version" in
*-SNAPSHOT)
echo "::error::release version must not be a development version: $version"
exit 1
;;
esac
sed -i "s/^enumizerVersion=.*/enumizerVersion=$version/" gradle.properties
# 配布物を説明する文書の版表記は、リリース版を宣言している間だけ同期対象になる。
# ここで走らせておかないと公開ゲートの checkVersionMentions で落ちる
./gradlew syncVersionMentions
full=$(./gradlew -q properties --property version | sed -n 's/^version: //p')
if git ls-remote --exit-code --tags origin "refs/tags/v$full" >/dev/null 2>&1; then
echo "::error::v$full is already released"
exit 1
fi
# CHANGELOG は Unreleased の見出しの下へ節を起こす(既存の記載はそのまま新しい版の節に入る)
if ! grep -q "^## \[$full\]$" CHANGELOG.md; then
sed -i "0,/^## \[Unreleased\]$/s//## [Unreleased]\n\n## [$full]/" CHANGELOG.md
fi
echo "full=$full" >> "$GITHUB_OUTPUT"
echo "branch=release/v$full" >> "$GITHUB_OUTPUT"
# 公開まで進まなかった版を宣言し直せるよう、やり直しても同じ状態へ収束する形にする。
# 既に開いている PR があればそれが宣言そのものであり、作り直さない
- name: Open release pull request
env:
GH_TOKEN: ${{ github.token }}
FULL: ${{ steps.declare.outputs.full }}
BRANCH: ${{ steps.declare.outputs.branch }}
run: |
set -euo pipefail
open=$(gh pr list --head "$BRANCH" --state open --json number --jq '.[0].number')
if [ -n "$open" ]; then
echo "::notice::pull request #$open is already open for $BRANCH"
exit 0
fi
# 書き換えが空 = 既定ブランチが既にこの版を宣言している(マージ済みで公開待ち)
if git diff --quiet; then
echo "::error::$FULL is already declared on main"
exit 1
fi
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git switch -c "$BRANCH"
git commit -q -am "build: リリース版 $FULL を宣言する"
# 閉じた PR のブランチが残っていることがあるため、内容を置き換える形で押す
git push -q --force origin "$BRANCH"
gh pr create --base main --head "$BRANCH" \
--title "build: リリース版 $FULL を宣言する" \
--body "$(printf '%s\n' \
"リリース $FULL の版宣言。マージ後の main の CI が green になった時点でタグ \`v$FULL\` が付き、公開が始まる。" \
"" \
"残りの手順:" \
"" \
"1. CHANGELOG の \`[$FULL]\` 節を確認する(\`[Unreleased]\` の記載がそのまま入っている)" \
"2. 本 PR のランを Approve and run で起こす(bot が作った PR のランは承認待ちで止まる)" \
"3. 本 PR をマージする" \
"" \
"以降は自動で進む(公開・GitHub Release・API ドキュメント・次版の PR)。")"