Commit 4ce35d2
Make release workflow trigger on version bump merge, not dispatch (#126)
* Start the release when the version-bump PR merges
Releasing took two deliberate acts from the maintainer that were really the
same decision: merge the version-bump PR, then go dispatch `release` with the
same version the PR just landed. The second one carried no new judgement — it
restated the first — but it was the one step that couldn't be done from a
review page, so a release stalled on someone opening the Actions tab.
`release.yml` now also triggers on a push to `main` that touches
`App/Blurt/project.yml`, and a new Linux `resolve` job decides whether that
push is actually a release: it diffs `CFBundleShortVersionString` against the
push's previous commit and checks no `vX.Y.Z` tag exists yet. A project.yml
edit that adds a source file resolves to `release=false` and skips the build
and publish jobs; only a bump landing on main goes through. Running first, on
ubuntu, means a non-release push costs seconds and never reaches the runner
holding the Developer ID key.
The dispatch path stays, and is what re-runs a failed build, republishes, and
does the non-main dry run — `skip_checks`, `skip_smoke`, and `republish` are
dispatch-only inputs, so the merged-bump path always runs the full checks. Both
jobs still pin `github.sha`, so a release is still exactly one reviewed commit,
and publishing still parks on the `release-publish` approval gate.
The `resolve` job supersedes the build job's version guard as the source of the
version; the guard stays as a re-check on the signing runner itself, so the
artifact name and the built binary can't disagree.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F952B3qz1QeXYv5sPGwPh3
* Start release-bump by pushing a marker branch
The last dispatch in the release flow was the first one. Dispatching a workflow
needs the Actions UI or `actions: write`; a chat or web session typically has
neither, but does have push. So the one step that could kick a release off was
the one step an agent couldn't do, and every release still began with the
maintainer opening the Actions tab.
`release-bump.yml` now also triggers on a push of `release/v[0-9]*`. The branch
name is the request — `release/v0.1.37` asks for 0.1.37, with no default_target
guessing, because a marker that named no version would be asking the workflow to
guess what its own name meant. The job checks out main, verifies the marker is
an ancestor of main, bumps on top of main's tip, and force-pushes the result
onto the same branch with the lease pinned to the sha it vetted.
The ancestor check is the load-bearing one. Without it, pushing a branch would
be a way to get a bot-authored commit sitting on top of arbitrary content, and
the PR that followed would quietly be about more than a version bump. With it,
the marker is a signal and the bump is the only commit that lands on it.
This leans on the GITHUB_TOKEN rule in the opposite direction from the rest of
the release path: the bump commit the job force-pushes does not re-fire the push
trigger that started it, which is what keeps it from looping. Noted in the
workflow, RELEASE.md, and the skill's guardrails, since moving this job to a PAT
would silently turn it into a loop.
Dispatch still works, still guards that it came from main, and remains the only
path that accepts an empty version.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F952B3qz1QeXYv5sPGwPh3
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 816ff52 commit 4ce35d2
5 files changed
Lines changed: 351 additions & 69 deletions
File tree
- .claude/skills/release
- .github/workflows
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
10 | | - | |
11 | | - | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
12 | 13 | | |
13 | 14 | | |
14 | 15 | | |
| |||
23 | 24 | | |
24 | 25 | | |
25 | 26 | | |
26 | | - | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
27 | 37 | | |
28 | | - | |
29 | | - | |
30 | | - | |
31 | | - | |
32 | | - | |
33 | | - | |
34 | | - | |
35 | | - | |
36 | | - | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
37 | 52 | | |
38 | 53 | | |
39 | 54 | | |
| |||
42 | 57 | | |
43 | 58 | | |
44 | 59 | | |
45 | | - | |
| 60 | + | |
46 | 61 | | |
47 | 62 | | |
48 | 63 | | |
49 | | - | |
50 | | - | |
| 64 | + | |
51 | 65 | | |
52 | 66 | | |
53 | 67 | | |
54 | | - | |
55 | | - | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
56 | 76 | | |
57 | 77 | | |
58 | 78 | | |
| |||
68 | 88 | | |
69 | 89 | | |
70 | 90 | | |
71 | | - | |
| 91 | + | |
| 92 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
16 | 37 | | |
17 | 38 | | |
18 | 39 | | |
19 | 40 | | |
20 | 41 | | |
21 | 42 | | |
22 | 43 | | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
23 | 49 | | |
24 | 50 | | |
25 | 51 | | |
| |||
43 | 69 | | |
44 | 70 | | |
45 | 71 | | |
46 | | - | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
47 | 76 | | |
48 | 77 | | |
49 | 78 | | |
| |||
53 | 82 | | |
54 | 83 | | |
55 | 84 | | |
56 | | - | |
| 85 | + | |
57 | 86 | | |
58 | 87 | | |
59 | 88 | | |
60 | 89 | | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
61 | 106 | | |
62 | 107 | | |
63 | 108 | | |
64 | 109 | | |
65 | 110 | | |
66 | 111 | | |
67 | 112 | | |
| 113 | + | |
68 | 114 | | |
| 115 | + | |
69 | 116 | | |
70 | 117 | | |
71 | 118 | | |
72 | 119 | | |
73 | 120 | | |
74 | 121 | | |
75 | 122 | | |
76 | | - | |
77 | | - | |
78 | | - | |
79 | | - | |
80 | | - | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
81 | 136 | | |
82 | 137 | | |
83 | 138 | | |
84 | 139 | | |
85 | 140 | | |
86 | 141 | | |
87 | | - | |
| 142 | + | |
88 | 143 | | |
89 | 144 | | |
90 | 145 | | |
91 | 146 | | |
92 | 147 | | |
93 | 148 | | |
94 | | - | |
| 149 | + | |
95 | 150 | | |
96 | 151 | | |
97 | 152 | | |
| |||
110 | 165 | | |
111 | 166 | | |
112 | 167 | | |
| 168 | + | |
113 | 169 | | |
114 | 170 | | |
115 | 171 | | |
116 | 172 | | |
117 | | - | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
118 | 176 | | |
119 | 177 | | |
120 | 178 | | |
121 | | - | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
122 | 184 | | |
123 | 185 | | |
124 | 186 | | |
125 | | - | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
126 | 197 | | |
127 | 198 | | |
128 | 199 | | |
| |||
132 | 203 | | |
133 | 204 | | |
134 | 205 | | |
135 | | - | |
136 | | - | |
| 206 | + | |
| 207 | + | |
137 | 208 | | |
138 | 209 | | |
139 | 210 | | |
140 | | - | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
141 | 214 | | |
0 commit comments