Skip to content

Commit 84b3915

Browse files
committed
doc: document current release procedure
PR-URL: #2099 Author: Jeremiah Senkpiel <[email protected]>
1 parent dd523c7 commit 84b3915

File tree

1 file changed

+58
-44
lines changed

1 file changed

+58
-44
lines changed

doc/releases.md

+58-44
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
io.js Release Process
22
=====================
33

4-
This document describes the technical aspects of the io.js release process. The intended audience is those who have been authorized by the Technical Committee (TC) to create, promote and sign official release builds for io.js, hosted on <https://iojs.org>.
4+
This document describes the technical aspects of the io.js release process. The intended audience is those who have been authorized by the Node.js Foundation Technical Steering Committee (TSC) to create, promote and sign official release builds for io.js, hosted on <https://iojs.org>.
55

66
## Who can make a release?
77

@@ -11,19 +11,19 @@ Release authorization is given by the io.js TC. Once authorized, an individual m
1111

1212
There are three relevant Jenkins jobs that should be used for a release flow:
1313

14-
**a.** **[iojs+any-pr+multi](https://jenkins-iojs.nodesource.com/job/iojs+any-pr+multi/)** is used for a final full-test run to ensure that the current *HEAD* is stable.
14+
**a.** **Test runs:** **[iojs+any-pr+multi](https://jenkins-iojs.nodesource.com/job/iojs+any-pr+multi/)** is used for a final full-test run to ensure that the current *HEAD* is stable.
1515

16-
**b.** (optional) **[iojs+release+nightly](https://jenkins-iojs.nodesource.com/job/iojs+release+nightly/)** can be used to create a nightly release for the current *HEAD* if public test releases are required. Builds triggered with this job are published straight to <http://iojs.org/download/nightly/> and are available for public download.
16+
**b.** **Nightly builds:** (optional) **[iojs+release](https://jenkins-iojs.nodesource.com/job/iojs+release/)** can be used to create a nightly release for the current *HEAD* if public test releases are required. Builds triggered with this job are published straight to <http://iojs.org/download/nightly/> and are available for public download.
1717

18-
**c.** **[iojs+release](https://jenkins-iojs.nodesource.com/job/iojs+release/)** does all of the work to build all required release assets. Promotion of the release files is a manual step once they are ready (see below).
18+
**c.** **Release builds:** **[iojs+release](https://jenkins-iojs.nodesource.com/job/iojs+release/)** does all of the work to build all required release assets. Promotion of the release files is a manual step once they are ready (see below).
1919

2020
The [io.js build team](https://github.com/nodejs/build) is able to provide this access to individuals authorized by the TC.
2121

2222
### 2. <iojs.org> Access
2323

2424
The _dist_ user on iojs.org controls the assets available in <http://iojs.org/download/> (note that <http://iojs.org/dist/> is an alias for <https://iojs.org/download/release/>).
2525

26-
The Jenkins release build slaves upload their artefacts to the web server as the _staging_ user, the _dist_ user has access to move these assets to public access (the _staging_ user does not, for security purposes).
26+
The Jenkins release build slaves upload their artifacts to the web server as the _staging_ user, the _dist_ user has access to move these assets to public access (the _staging_ user does not, for security purposes).
2727

2828
Nightly builds are promoted automatically on the server by a cron task for the _dist_ user.
2929

@@ -39,6 +39,8 @@ The GPG keys should be fetchable from a known third-party keyserver, currently t
3939
gpg --keyserver pool.sks-keyservers.net --recv-keys <FINGERPRINT>
4040
```
4141

42+
The key you use may be a child/subkey of an existing key.
43+
4244
Additionally, full GPG key fingerprints for individuals authorized to release should be listed in the io.js GitHub README.md file.
4345

4446
## How to create a release
@@ -54,25 +56,28 @@ Run a **[iojs+any-pr+multi](https://jenkins-iojs.nodesource.com/job/iojs+any-pr+
5456

5557
### 2. Produce a Nightly Build _(optional)_
5658

57-
If there is reason to produce a test release for the purpose of having others try out installers or specifics of builds, produce a nightly build using **[iojs+release+nightly](https://jenkins-iojs.nodesource.com/job/iojs+release+nightly/)** and wait for it to drop in <http://iojs.org/download/nightly/>.
59+
If there is a reason to produce a test release for the purpose of having others try out installers or specifics of builds, produce a nightly build using **[iojs+release](https://jenkins-iojs.nodesource.com/job/iojs+release/)** and wait for it to drop in <http://iojs.org/download/nightly/>. Follow the directions and enter a proper length commit sha, a date string and select "nightly" for "disttype".
5860

5961
This is particularly recommended if there has been recent work relating to the OS X or Windows installers as they are not tested in any way by CI.
6062

61-
### 4. Update the _CHANGELOG.md_
63+
### 3. Update the _CHANGELOG.md_
6264

63-
Use the following git command to produce a list of commits since the last release:
65+
Collect a formatted list of commits since the last release. Use [changelog-maker](https://github.com/rvagg/changelog-maker) (available from npm: `npm install changelog-maker -g`) to do this.
6466

6567
```
66-
git log --pretty=format:"* [%h] - %s (%aN)" \
67-
--since="$(git show -s --format=%ad `git rev-list --tags --max-count=1`)"
68+
$ changelog-maker --group
6869
```
6970

70-
_(You will probably need to omit the first two commits as they relate to the last release.)_
71+
Note that changelog-maker counts commits since the last tag and if the last tag in the repository was not on the current branch you may have to supply a `--start-ref` argument:
72+
73+
```
74+
$ changelog-maker --group --start-ref v2.3.1
75+
```
7176

7277
The _CHANGELOG.md_ entry should take the following form:
7378

7479
```
75-
## YYYY-MM-DD, Version x.y.z, @user
80+
## YYYY-MM-DD, Version x.y.z, @releaser
7681
7782
### Notable changes
7883
@@ -83,6 +88,8 @@ The _CHANGELOG.md_ entry should take the following form:
8388
8489
### Known issues
8590
91+
See https://github.com/nodejs/io.js/labels/confirmed-bug for complete and current list of known issues.
92+
8693
* Include this section if there are any known problems with this release
8794
* Scan GitHub for unresolved problems that users may need to be aware of
8895
@@ -91,7 +98,7 @@ The _CHANGELOG.md_ entry should take the following form:
9198
* Include the full list of commits since the last release here
9299
```
93100

94-
### 5. Update _src/node_version.h_
101+
### 4. Update _src/node_version.h_
95102

96103
The following macros should already be set for the release since they will have been updated directly following the last release. They shouldn't require changing:
97104

@@ -116,7 +123,9 @@ This macro is used to signal an ABI version for native addons. It currently has
116123

117124
The general rule is to bump this version when there are _breaking ABI_ changes and also if there are non-trivial API changes. The rules are not yet strictly defined, so if in doubt, please confer with someone that will have a more informed perspective, such as a member of the NAN team.
118125

119-
### 6. Create Release Commit
126+
**Note** that it is current TSC policy to bump major version when ABI changes. If you see a need to bump `NODE_MODULE_VERSION` then you should consult the TSC, commits may need to be reverted or a major version bump may need to happen.
127+
128+
### 5. Create Release Commit
120129

121130
The _CHANGELOG.md_ and _src/node_version.h_ changes should be the final commit that will be tagged for the release.
122131

@@ -127,64 +136,67 @@ YYYY-MM-DD io.js vx.y.z Release
127136
128137
Notable changes:
129138
130-
* Copy the notable changes list here
139+
* Copy the notable changes list here, reformatted for plain-text
131140
```
132141

133-
### 7. Tag and Sign the Release Commit
142+
### 6. Push to GitHub
134143

135-
Tag the release as <b><code>vx.y.z</code></b> and sign **using the same GPG key that will be used to sign SHASUMS256.txt**.
144+
Note that it is not essential that the release builds be created from the io.js repository, they may be created from your own fork if you desire. It is preferable, but not essential that the commits remain the same between that used to build and the tagged commit in the io.js repository.
136145

137-
```
138-
git tag -sm 'YYYY-MM-DD io.js vz.y.x Release' vx.y.z
139-
```
146+
### 7. Produce Release Builds
140147

141-
### 8. Set Up For the Next Release
148+
Use **[iojs+release](https://jenkins-iojs.nodesource.com/job/iojs+release/)** to produce release artifacts. Enter the commit that you want to build from and select "release" for "disttype".
142149

143-
Edit _src/node_version.h_ again and:
150+
Artifacts from each slave are uploaded to Jenkins and are available if further testing is required. Use this opportunity particularly to test OS X and Windows installers if there are any concerns. Click through to the individual slaves for a run to find the artifacts.
144151

145-
* Increment `NODE_PATCH_VERSION` by one
146-
* Change `NODE_VERSION_IS_RELEASE` back to `0`
152+
All release slaves should achieve "SUCCESS" (and be green, not red). A release with failures should not be promoted, there are likely problems to be investigated.
147153

148-
Commit this change with:
154+
You can rebuild the release as many times as you need prior to promoting them if you encounter problems.
149155

150-
```
151-
git commit -am 'Working on vx.y.z' # where 'z' is the incremented patch number
152-
```
156+
Note that you do not have to wait for the ARM builds if they are take longer than the others. It is only necessary to have the main Linux (x64 and x86), OS X .pkg and .tar.gz, Windows (x64 and x86) .msi and .exe, source, headers and docs (both produced currently by an OS X slave). i.e. the slaves with "arm" in their name don't need to have finished to progress to the next step. However, **if you promote builds _before_ ARM builds have finished, you must repeat the promotion step for the ARM builds when they are ready**.
153157

154-
This sets up the branch so that nightly builds are produced with the next version number _and_ a pre-release tag.
158+
### 8. Tag and Sign the Release Commit
155159

156-
### 9. Push to GitHub
160+
Tag the release as <b><code>vx.y.z</code></b> and sign **using the same GPG key that will be used to sign SHASUMS256.txt**.
157161

158-
Push the changes along with the tag you created:
162+
```
163+
$ git tag <vx.y.z> <commit-sha> -sm 'YYYY-MM-DD io.js vz.y.x Release'
164+
```
165+
166+
Push the tag to GitHub.
159167

160168
```
161-
git push origin branch vx.y.z
162-
# where "branch" is the working branch and "vx.y.z" the the release version
169+
$ git push origin <vx.y.z>
163170
```
164171

165-
### 9. Produce Release Builds
172+
### 9. Set Up For the Next Release
173+
174+
Edit _src/node_version.h_ again and:
166175

167-
Use **[iojs+release](https://jenkins-iojs.nodesource.com/job/iojs+release/)** to produce release artefacts. Enter the "vx.y.z" version string for this release and it will fetch your tagged commit.
176+
* Increment `NODE_PATCH_VERSION` by one
177+
* Change `NODE_VERSION_IS_RELEASE` back to `0`
168178

169-
Artefacts from each slave are uploaded to Jenkins and are available if further testing is required. Use this opportunity particularly to test OS X and Windows installers if there are any concerns. Click through to the individual slaves for a run to find the artefacts. For example, the Windows 64-bit .msi file for v1.0.4 can be found [here](https://jenkins-iojs.nodesource.com/job/iojs+release/20/nodes=iojs-win2008r2-release-x64/).
179+
Commit this change with:
170180

171-
All release slaves should achieve "SUCCESS" (and be blue, not red). A release with failures should not be promoted, there are likely problems to be investigated.
181+
```
182+
$ git commit -am 'Working on vx.y.z' # where 'z' is the incremented patch number
183+
```
172184

173-
Note that you do not have to wait for the ARM builds if they are take longer than the others. It is only necessary to have the main Linux (x64 and x86), OS X .pkg and .tar.gz, Windows (x64 and x86) .msi and .exe, source and docs (both produced currently by an OS X slave). i.e. the slaves with "arm" in their name don't need to have finished to progress to the next step. However, **if you promote builds _before_ ARM builds have finished, you must repeat the promotion step for the ARM builds when they are ready**.
185+
This sets up the branch so that nightly builds are produced with the next version number _and_ a pre-release tag.
174186

175187
### 10. Promote and Sign the Release Builds
176188

177189
**It is important that the same individual who signed the release tag be the one to promote the builds as the SHASUMS256.txt file needs to be signed with the same GPG key!**
178190

179-
When you are confident that the build slaves have properly produced usable artefacts and uploaded them to the web server you can promote them to release status. This is done by interacting with the web server via the _dist_ user.
191+
When you are confident that the build slaves have properly produced usable artifacts and uploaded them to the web server you can promote them to release status. This is done by interacting with the web server via the _dist_ user.
180192

181-
The _tools/release.sh_ script may be used to promote and sign the build. When run, it will perform the following actions:
193+
The _tools/release.sh_ script should be used to promote and sign the build. When run, it will perform the following actions:
182194

183195
**a.** Select a GPG key from your private keys, it will use a command similar to: `gpg --list-secret-keys` to list your keys. If you don't have any keys, it will bail (why are you releasing? Your tag should be signed!). If you have only one key, it will use that. If you have more than one key it will ask you to select one from the list. Be sure to use the same key that you signed your git tag with.
184196

185-
**b.** Log in to the server via SSH and check for releases that can be promoted, along with the list of artefacts. It will use the `dist-promotable` command on the server to find these. You will be asked, for each promotable release, whether you want to proceed. If there is more than one release to promote (there shouldn't be), be sure to only promote the release you are responsible for.
197+
**b.** Log in to the server via SSH and check for releases that can be promoted, along with the list of artifacts. It will use the `dist-promotable` command on the server to find these. You will be asked, for each promotable release, whether you want to proceed. If there is more than one release to promote (there shouldn't be), be sure to only promote the release you are responsible for.
186198

187-
**c.** Log in to the server via SSH and run the promote script for the given release. The command on the server will be similar to: `dist-promote vx.y.z`. After this step, the release artefacts will be available for download and a SHASUMS256.txt file will be present. The release will still be unsigned, however.
199+
**c.** Log in to the server via SSH and run the promote script for the given release. The command on the server will be similar to: `dist-promote vx.y.z`. After this step, the release artifacts will be available for download and a SHASUMS256.txt file will be present. The release will still be unsigned, however.
188200

189201
**d.** Download SHASUMS256.txt to your computer using SCP into a temporary directory.
190202

@@ -194,15 +206,17 @@ The _tools/release.sh_ script may be used to promote and sign the build. When ru
194206

195207
**g.** Upload the SHASUMS256.txt\* files back to the server into the release directory.
196208

197-
If you didn't wait for ARM builds in the previous step before promoting the release, you should re-run _tools/release.sh_ after the ARM builds have finished and it will move the ARM artefacts into the correct location and you will be prompted to re-sign SHASUMS256.txt.
209+
If you didn't wait for ARM builds in the previous step before promoting the release, you should re-run _tools/release.sh_ after the ARM builds have finished and it will move the ARM artifacts into the correct location and you will be prompted to re-sign SHASUMS256.txt.
198210

199211
### 11. Check the Release
200212

201213
Your release should be available at <https://iojs.org/dist/vx.y.z/> and also <https://iojs.org/dist/latest/>. Check that the appropriate files are in place, you may also want to check that the binaries are working as appropriate and have the right internal version strings. Check that the API docs are available at <https://iojs.org/api/>. Check that the release catalog files are correct at <https://iojs.org/dist/index.tab> and <https://iojs.org/dist/index.json>.
202214

203215
### 12. Announce
204216

205-
_TODO: Update doc with announce procedure when we figure this out._
217+
The iojs.org website will automatically rebuild and include the new version. You simply need to announce the build, preferably via twitter with a message such as:
218+
219+
> v2.3.2 of @official_iojs is out @ https://iojs.org/dist/latest/ changelog @ https://github.com/nodejs/io.js/blob/master/CHANGELOG.md#2015-07-01-version-232-rvagg … something here about notable changes
206220
207221
### 13. Celebrate
208222

0 commit comments

Comments
 (0)