summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Gan <brgan@google.com>2026-10-27 00:01:58 +0000
committergerrit-scoped@luci-project-accounts.iam.gserviceaccount.com <gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com>2026-10-27 12:29:45 -0700
commitc5340585b8175f91a483d6d0fe30724e6b277c0b (patch)
tree1deaf14c1cc478bb6ca7d027c36c708f80ecc128
parent86a7bec83d5ce714359eb251c191955e9dac2a08 (diff)
downloadgit-repo-main.tar.gz
docs: release: update release process to match current practicemain
The documented process has drifted from how releases are actually done: * Releases are now cut weekly by an automated pipeline, so the manual steps are only a fallback, and for rollbacks. * Releases are tested (both updating an existing checkout and a fresh init) before pushing anything. * The tag is pushed & announced first, and only promoted to stable after a day. * Direct pushes to the stable branch are rejected, so it has to be deleted & recreated via the Gerrit REST API instead. Bug: 575551885 Change-Id: Ib36df07811c225558aba1a925b9703f3b2017e6f Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/649984 Reviewed-by: Gavin Mak <gavinmak@google.com> Tested-by: Brian Gan <brgan@google.com> Commit-Queue: Brian Gan <brgan@google.com>
-rw-r--r--docs/release-process.md98
1 files changed, 54 insertions, 44 deletions
diff --git a/docs/release-process.md b/docs/release-process.md
index 165bf84fc..ae69c98e8 100644
--- a/docs/release-process.md
+++ b/docs/release-process.md
@@ -5,11 +5,19 @@ related topics and flows.
5 5
6[TOC] 6[TOC]
7 7
8## Schedule 8## Schedule {#schedule}
9
10Releases are automated.
11Every Tuesday morning [US PT], a pipeline checks if any new commits have landed
12since last release.
13If so, it tags & tests the latest `main`, pushes & announces the tag, and then
14promotes it to `stable` a day later.
15The release is skipped if there's a holiday or [production freeze](#freeze)
16that week.
17Maintainers can also trigger it by hand.
18The [manual steps](#manual) below are only needed as a fallback, or to roll
19back a release.
9 20
10There is no specific schedule for when releases are made.
11Usually it's more along the lines of "enough minor changes have been merged",
12or "there's a known issue the maintainers know should get fixed".
13If you find a fix has been merged for an issue important to you, but hasn't been 21If you find a fix has been merged for an issue important to you, but hasn't been
14released after a week or so, feel free to [contact] us to request a new release. 22released after a week or so, feel free to [contact] us to request a new release.
15 23
@@ -48,6 +56,11 @@ Whenever major changes are made to the launcher script, you should increment the
48At runtime, repo will check this to see if it needs to be updated (and notify 56At runtime, repo will check this to see if it needs to be updated (and notify
49the user automatically). 57the user automatically).
50 58
59When `VERSION` changes, the release pipeline publishes the new launcher to the
60`git-repo-downloads` Google Cloud Storage bucket.
61To publish it by hand, run `./release/sign-launcher.py`, which signs the
62launcher and prints the commands to upload it.
63
51## Key management 64## Key management
52 65
53Every release has a git tag that is signed with a key that repo recognizes. 66Every release has a git tag that is signed with a key that repo recognizes.
@@ -96,8 +109,8 @@ If that tag is valid, then repo will warn and use that commit instead.
96 109
97If that tag cannot be verified, it gives up and forces the user to resolve. 110If that tag cannot be verified, it gives up and forces the user to resolve.
98 111
99If env variable `REPO_SKIP_SELF_UPDATE` is defined, this will 112If the env variable `REPO_SKIP_SELF_UPDATE` is set to anything other than `0`,
100bypass the self update algorithm. 113`repo sync` will bypass the self update algorithm.
101 114
102### Force an update 115### Force an update
103 116
@@ -110,29 +123,20 @@ All development happens on the `main` branch and should generally be stable.
110 123
111Since the repo launcher defaults to tracking the `stable` branch, it is not 124Since the repo launcher defaults to tracking the `stable` branch, it is not
112normally updated until a new release is available. 125normally updated until a new release is available.
113If something goes wrong with a new release, an older release can be force pushed 126If something goes wrong with a new release, `stable` can be pointed back at an
114and clients will automatically downgrade. 127older release and clients will automatically downgrade.
115
116The `maint` branch is used to track the previous major release of repo.
117It is not normally meant to be used by people as `stable` should be good enough.
118Once a new major release is pushed to the `stable` branch, then the previous
119major release can be pushed to `maint`.
120For example, when `stable` moves from `v1.10.x` to `v1.11.x`, then the `maint`
121branch will be updated from `v1.9.x` to `v1.10.x`.
122 128
123We don't have parallel release branches/series. 129We don't have parallel release branches/series.
124Typically all tags are made against the `main` branch and then pushed to the 130Typically all tags are made against the `main` branch and then promoted to the
125`stable` branch to make it available to the rest of the world. 131`stable` branch to make it available to the rest of the world.
126Since repo doesn't typically see a lot of changes, this tends to be OK. 132Since repo doesn't typically see a lot of changes, this tends to be OK.
127 133
128## Creating a new release 134## Creating a new release {#manual}
129 135
130When you want to create a new release, you'll need to select a good version and 136Releases are normally created automatically (see [Schedule](#schedule)).
137If you need to create one by hand, you'll need to select a good version and
131create a signed tag using a key registered in repo itself. 138create a signed tag using a key registered in repo itself.
132Typically we just tag the latest version of the `main` branch. 139Typically we just tag the latest version of the `main` branch.
133The tag could be pushed now, but it won't be used by clients normally (since the
134default `repo-rev` setting is `stable`).
135This would allow some early testing on systems who explicitly select `main`.
136 140
137### Creating a signed tag 141### Creating a signed tag
138 142
@@ -147,10 +151,10 @@ internal processes for accessing the restricted keys.
147 151
148```sh 152```sh
149# Pick the new version. 153# Pick the new version.
150$ t=v2.30 154$ t=v2.XX
151 155
152# Create a new signed tag with the current HEAD. 156# Create a new signed tag of the latest main branch.
153$ ./release/sign-tag.py $t 157$ ./release/sign-tag.py $t origin/main
154 158
155# Verify the signed tag. 159# Verify the signed tag.
156$ git show $t 160$ git show $t
@@ -158,43 +162,49 @@ $ git show $t
158 162
159### Push the new release 163### Push the new release
160 164
161Once you're ready to make the release available to everyone, push it to the 165First push the tag, [announce](#announce) it, and wait a day to get feedback
162`stable` branch. 166from people testing new releases early.
163
164Make sure you never push the tag itself to the stable branch!
165Only push the commit -- note the use of `^0` below.
166 167
167```sh 168```sh
168$ git push https://gerrit-review.googlesource.com/git-repo $t 169$ git push https://gerrit-review.googlesource.com/git-repo $t
169$ git push https://gerrit-review.googlesource.com/git-repo $t^0:stable
170``` 170```
171 171
172If something goes horribly wrong, you can force push the previous version to the 172Then make the release available to everyone by updating the `stable` branch.
173`stable` branch and people should automatically recover. 173Direct pushes to it are rejected, so it has to be deleted & recreated via the
174Again, make sure you never push the tag itself! 174authenticated [Gerrit REST API] (see [go/repo-release] for maintainers).
175
176Make sure you never point the stable branch at the tag itself!
177Only use the commit -- note the use of `^0` below.
178The commit is resolved before deleting anything so that a bad `$t` can't leave
179`stable` missing.
175 180
176```sh 181```sh
177$ oldrev="whatever-old-commit" 182$ api=https://gerrit-review.googlesource.com/a/projects/git-repo/branches/stable
178$ git push https://gerrit-review.googlesource.com/git-repo $oldrev:stable --force 183$ rev=$(git rev-parse --verify "$t^0") && \
184 curl --fail -X DELETE "$api" && \
185 curl --fail -X PUT -H 'Content-Type: application/json' \
186 -d "{\"revision\":\"$rev\"}" "$api"
179``` 187```
180 188
181### Announce the release 189If something goes horribly wrong, run the same commands with the previous
190release (e.g. `t=$(git describe --abbrev=0 $t^0~)`) and people should
191automatically recover.
192
193### Announce the release {#announce}
182 194
183Once you do push a new release to `stable`, make sure to announce it on the 195Once you push a new release, make sure to announce it on the
184[repo-discuss@googlegroups.com] group. 196[repo-discuss@googlegroups.com] group, and follow up once it's on `stable`.
185Here is an [example announcement]. 197Here is an [example announcement].
186 198
187You can create a short changelog using the command: 199You can create a short changelog since the previous release using the command:
188 200
189```sh 201```sh
190# If you haven't pushed to the stable branch yet, you can use origin/stable. 202$ git log --format="%h (%aN) %s" --no-merges \
191# If you have pushed, change origin/stable to the previous release tag. 203 $(git describe --abbrev=0 $t^0~)..$t
192# This assumes "main" is the current tagged release. If it's newer, change it
193# to the current release tag too.
194$ git log --format="%h (%aN) %s" --no-merges origin/stable..main
195``` 204```
196 205
197[contact]: ../README.md#contact 206[contact]: ../README.md#contact
198[example announcement]: https://groups.google.com/d/topic/repo-discuss/UGBNismWo1M/discussion 207[example announcement]: https://groups.google.com/d/topic/repo-discuss/UGBNismWo1M/discussion
199[repo-discuss@googlegroups.com]: https://groups.google.com/forum/#!forum/repo-discuss 208[repo-discuss@googlegroups.com]: https://groups.google.com/forum/#!forum/repo-discuss
200[go/repo-release]: https://goto.google.com/repo-release 209[go/repo-release]: https://goto.google.com/repo-release
210[Gerrit REST API]: https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#branch-endpoints