summaryrefslogtreecommitdiffstats
path: root/Documentation/dev-release.txt
blob: 41013493eabce0b6bd8df5a65ace78b5d7e9dd63 (plain)
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
= Making a Gerrit Release

[NOTE]
This document is meant primarily for Gerrit maintainers
who have been given approval and submit status to the Gerrit
projects.  Additionally, maintainers should be given owner
status to the Gerrit web site.

To make a Gerrit release involves a great deal of complex
tasks and it is easy to miss a step so this document should
hopefully serve as both a how to for those new to the process
and as a checklist for those already familiar with these
tasks.


== Gerrit Release Type

Here are some guidelines on release approaches depending on the
type of release you want to make (`stable-fix`, `stable`, `rc0`,
`rc1`...).

[[stable]]
=== Stable

A `stable` release is generally built from the `master` branch and may
need to undergo some stabilization before releasing the final release.

* Propose the release with any plans/objectives to the mailing list

* Create a Gerrit `rc0`

* If needed create a Gerrit `rc1`

[NOTE]
You may let in a few features to this release

* If needed create a Gerrit `rc2`

[NOTE]
There should be no new features in this release, only bug fixes

* Finally create the `stable` release (no `rc`)


=== Stable-Fix

`stable-fix` releases should likely only contain bug fixes and doc
updates.

* Propose the release with any plans/objectives to the mailing list

* This type of release does not need any RCs, release when the
objectives are met


[[security]]
=== Security-Fix

`security-fix` releases should only contain bug fixes for security
issues.

For security issues it is important that they are only announced
*after* fixed versions for all relevant releases have been published.
Because of this, `security-fix` releases can't be prepared in the public
`gerrit` project.

`security-fix` releases are prepared in the `gerrit-security-fixes`
project which is only readable by the Gerrit Maintainers. Only after
a `security-fix` release has been published will the commits/tags made in
the `gerrit-security-fixes` project be taken over into the public
`gerrit` project.


== Create the Actual Release

To create a Gerrit release the following steps have to be done:

. link:#build-gerrit[Build the Gerrit Release]
. link:#publish-gerrit[Publish the Gerrit Release]
.. link:#publish-to-maven-central[Publish the Gerrit artifacts to Maven Central]
.. link:#publish-to-google-storage[Publish the Gerrit WAR to Google Storage]
.. link:#push-stable[Push the Stable Branch]
.. link:#push-tag[Push the Release Tag]
.. link:#upload-documentation[Upload the Documentation]
.. link:#finalize-release-notes[Finalize Release Notes]
.. link:#update-issues[Update the Issues]
.. link:#announce[Announce on Mailing List]
. link:#increase-version[Increase Gerrit Version for Current Development]
. link:#merge-stable[Merge `stable` into `master`]


[[update-versions]]
=== Update Versions and Create Release Tag

Before doing the release build, the `GERRIT_VERSION` in the `version.bzl`
file must be updated, e.g. change it from `2.5-SNAPSHOT` to `2.5`.

In addition the version must be updated in a number of pom.xml files.

To do this run the `./tools/version.py` script and provide the new
version as parameter, e.g.:

----
  ./tools/version.py 2.5
----

Commit the changes and create a signed release tag on the new commit:

----
  git tag -s -m "v2.5" v2.5
----

Tag the plugins:

----
  git submodule foreach git tag -s -m "v2.5" v2.5
----

[[build-gerrit]]
=== Build Gerrit

* Build the Gerrit WAR, API JARs and documentation
+
----
  bazel build release Documentation:searchfree
  ./tools/maven/api.sh install
----

* Sanity check WAR
* Test the new Gerrit version

* Verify plugin versions
+
Verify the versions:
+
----
  java -jar bazel-bin/release.war init --list-plugins
----

[[publish-gerrit]]
=== Publish the Gerrit Release

[[publish-to-maven-central]]
==== Publish the Gerrit artifacts to Maven Central

* Make sure you have done the
link:dev-release-deploy-config.html#deploy-configuration-setting-maven-central[
configuration] for deploying to Maven Central

* Make sure that the version is updated in the `version.bzl` file and in
the `pom.xml` files as described in the link:#update-versions[Update
Versions and Create Release Tag] section.

* Push the WAR to Maven Central:
+
----
  ./tools/maven/api.sh war_deploy
----

* Push the plugin artifacts to Maven Central:
+
----
  ./tools/maven/api.sh deploy
----

* To where the artifacts are uploaded depends on the `GERRIT_VERSION` in
the `version.bzl` file:

** SNAPSHOT versions are directly uploaded into the Sonatype snapshots
repository and no further action is needed:
+
https://oss.sonatype.org/content/repositories/snapshots/com/google/gerrit/

** Release versions are uploaded into a staging repository in the
link:https://oss.sonatype.org/[Sonatype Nexus Server].

* Verify the staging repository

** Go to the link:https://oss.sonatype.org/[Sonatype Nexus Server] and
sign in with your Sonatype credentials.

** Click on 'Build Promotion' in the left navigation bar under
'Staging Repositories' and find the `comgooglegerrit-XXXX` staging
repository.

** Verify its content
+
While the staging repository is open you can upload further content and
also replace uploaded artifacts. If something is wrong with the staging
repository you can drop it by selecting it and clicking on `Drop`.

** Run Sonatype validations on the staging repository
+
Select the staging repository and click on `Close`. This runs the
Sonatype validations on the staging repository. The repository will
only be closed if everything is OK. A closed repository cannot be
modified anymore, but you may still drop it if you find any issues.

** Test closed staging repository
+
Once a repository is closed you can find the URL to it in the `Summary`
section, e.g. https://oss.sonatype.org/content/repositories/comgooglegerrit-1029
+
Use this URL for further testing of the artifacts in this repository,
e.g. to try building a plugin against the plugin API in this repository
update the version in the `pom.xml` and configure the repository:
+
----
  <repositories>
    <repository>
      <id>gerrit-staging-repository</id>
      <url>https://oss.sonatype.org/content/repositories/comgooglegerrit-1029</url>
    </repository>
  </repositories>
----

* Release the staging repository
+
How to release a staging repository is described in the
link:https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide#SonatypeOSSMavenRepositoryUsageGuide-8.a.2.ReleasingaStagingRepository[
Sonatype OSS Maven Repository Usage Guide].
+
[WARNING]
Releasing artifacts to Maven Central cannot be undone!

** Find the closed staging repository in the
link:https://oss.sonatype.org/[Sonatype Nexus Server], select it and
click on `Release`.

** The released artifacts are available in
https://oss.sonatype.org/content/repositories/releases/com/google/gerrit/

** It may take up to 2 hours until the artifacts appear on Maven
Central:
+
http://central.maven.org/maven2/com/google/gerrit/

* [optional]: View download statistics

** Sign in to the
link:https://oss.sonatype.org/[Sonatype Nexus Server].

** Click on 'Views/Repositories' in the left navigation bar under
'Central Statistics'.

** Select `com.google.gerrit` as `Project`.


[[publish-to-google-storage]]
==== Publish the Gerrit WAR to the Google Cloud Storage

* go to the link:https://console.cloud.google.com/storage/browser/gerrit-releases/?project=api-project-164060093628[
gerrit-releases bucket in the Google cloud storage console]
* make sure you are signed in with your Gmail account
* manually upload the Gerrit WAR file by using the `Upload` button

[[push-stable]]
==== Push the Stable Branch

* Create the stable branch `stable-2.5` in the `gerrit` project via the
link:https://gerrit-review.googlesource.com/admin/repos/gerrit,branches[
Gerrit Web UI] or by push.

* Push the commits done on `stable-2.5` to `refs/for/stable-2.5` and
get them merged


[[push-tag]]
==== Push the Release Tag

Push the new Release Tag:

----
  git push gerrit-review tag v2.5
----

Push the new Release Tag on the plugins:

----
  git submodule foreach git push gerrit-review tag v2.5
----


[[upload-documentation]]
==== Upload the Documentation

* Extract the documentation files from the zip file generated from
`bazel build searchfree`: `bazel-bin/Documentation/searchfree.zip`.

* Upload the files manually via web browser to the appropriate folder
in the
link:https://console.cloud.google.com/storage/browser/gerrit-documentation/?project=api-project-164060093628[
gerrit-documentation] storage bucket.

[[finalize-release-notes]]
=== Finalize the Release Notes

Upload a change on the homepage project to:

* Remove 'In Development' caveat from the relevant section.

* Add links to the released documentation and the .war file, and make the
latest version bold.

[[update-links]]
==== Update homepage links

Upload a change on the link:https://gerrit-review.googlesource.com/admin/repos/homepage[
homepage project] to change the version numbers to the new version.

[[update-issues]]
==== Update the Issues

Update the issues by hand. There is no script for this.

Our current process is an issue should be updated to say `Status =
Submitted, FixedIn-2.5` once the change is submitted, but before the
release.

After the release is actually made, you can search in Google Code for
`Status=Submitted FixedIn=2.5` and then batch update these changes
to say `Status=Released`. Make sure the pulldown says `All Issues`
because `Status=Submitted` is considered a closed issue.


[[announce]]
==== Announce on Mailing List

Send an email to the mailing list to announce the release. The content of the
announcement email is generated with the `release-announcement.py` which
automatically includes all the necessary links, hash values, and wraps the
text in a PGP signature.

For details refer to the documentation in the script's header, and/or the
help text:

----
 ./tools/release-announcement.py --help
----

[[increase-version]]
=== Increase Gerrit Version for Current Development

All new development that is done in the `master` branch will be included in the
next Gerrit release. The Gerrit version should be set to the snapshot version
for the next release.

Use the `version` tool to set the version in the `version.bzl` file:

----
 ./tools/version.py 2.6-SNAPSHOT
----

Verify that the changes made by the tool are sane, then commit them, push
the change for review on the master branch, and get it merged.

[[merge-stable]]
=== Merge `stable` into `master`

After every release, stable should be merged to master to ensure that
none of the changes/fixes ever get lost.

----
  git config merge.summary true
  git checkout master
  git reset --hard origin/master
  git branch -f stable origin/stable
  git merge stable
----

[[update-api-version-in-bazlets-repository]]

Bazlets is used by gerrit plugins to simplify build process. To allow the
new released version to be used by gerrit plugins,
link:https://gerrit.googlesource.com/bazlets/+/master/gerrit_api.bzl#8[gerrit_api.bzl]
must reference the new version. Upload a change to bazlets repository with
api version upgrade.

GERRIT
------
Part of link:index.html[Gerrit Code Review]

SEARCHBOX
---------