Improve release process.
[tails/vicves.git] / wiki / src / contribute / release_process.mdwn
blob5083604e9087cfcfaa3eb7e28f11f419d87c2436
1 [[!meta title="Release process"]]
3 [[!toc levels=2]]
5 See the [[release_schedule]].
7 Environment
8 ===========
10 Export the following environment variables to be able to copy'n'paste
11 the scripts snippets found on this page:
13 * `VERSION`: the version number of the release being prepared.
14 * `export TAG=$(echo "$VERSION" | sed -e 's,~,-,')`
15 * `PREVIOUS_VERSION`: the version number of the previous release.
16 * `ISOS`: the directory where one stores `tails-i386-*`
17   sub-directories like the ones downloaded with BitTorrent.
18 * `MASTER_CHECKOUT`: a checkout of the `master` branch of the main
19   Tails Git repository.
21 Pre-freeze
22 ==========
24 upgrade i2p
25 -----------
27 See [[contribute/design/I2P]].
29 Going through the usual [[review and merge
30 process|contribute/merge_policy]] is welcome.
32 Upgrade Torbutton
33 -----------------
35 Since Torbutton is not maintained in Debian anymore,
36 upgrade our Debian package to the latest release if needed.
38 Going through the usual [[review and merge
39 process|contribute/merge_policy]] is welcome.
41 Update iceweasel preferences
42 ----------------------------
44 * Torbutton does not handle `general.*` and
45   `browser.startup.homepage_override.*` anymore, so we have to keep in
46   sync manually, in our `/etc/iceweasel/pref/iceweasel.js`, with TBB's
47   `pound_tor.js`
48 * update `extensions.adblockplus.currentVersion`
50 Coordinate with Debian security updates
51 ---------------------------------------
53 See [[release_process/Debian_security_updates]].
55 Select the right branch
56 =======================
58 For a major release, the `devel` branch should be merged into the `testing`
59 branch and changes should be made from there.
61 From minor releases, work should happen in `stable`.
63 Update included files
64 =====================
66 AdBlock patterns
67 ----------------
69 Patterns are stored in
70 `config/chroot_local-includes/etc/iceweasel/profile/adblockplus/`.
72 1. Boot Tails
73 2. Open *Tools* → *Addons*
74 3. Select *Adblock Plus* in extensions
75 4. Open *Preferences* → *Filter preferences…*
76 5. For each filters, click *Actions* → *Update filters*
77 6. Close Iceweasel
78 7. Copy the `.mozilla/firefox/default/adblockplus/patterns.ini` from
79    this Iceweasel instance to the
80    `config/chroot_local-includes/etc/iceweasel/profile/adblockplus`
81    directory in the Tails Git checkout.
82 8. Commit:
83        git commit -m 'Update AdBlock Plus patterns.' \
84           config/chroot_local-includes/etc/iceweasel/profile/adblockplus/patterns.ini`
86 Upgrade bundled binary Debian packages
87 --------------------------------------
89 That is: make sure the bundled binary Debian packages contain
90 up-to-date localization files.
92 For each bundled Debian package, get updated PO files from the
93 Transifex branches of `git://git.torproject.org/translation.git` (e.g.
94 `whisperback_completed`). Verify and commit.
96 Then check the PO files [[using i18nspector|contribute/l10n_tricks]].
97 Correct all the errors that are not in the ignored list of
98 [[`check_po.sh`|contribute/l10n_tricks]]. Commit the changes if any.
100 Then see the relevant release processes:
102 * [[iceweasel]]
103 * [[liveusb-creator]]
104 * [[tails-greeter]]
105 * [[persistence-setup]]
106 * [[tails-iuk]]
107 * whisperback:
108   * see release process on
109     <https://git-tails.immerda.ch/whisperback/plain/HACKING>
110   * build a debian package
111   * upload it to [[APT repository]]
113 Update PO files
114 ---------------
116 Copy `*.po` from the `tails-misc_completed` branch in
117 `https://git.torproject.org/translation.git` into `po/`, **but** skip
118 [[languages that are maintained in
119 Git|contribute/how/translate#translate]].
121 Refresh the code PO files, commit the result:
123         ./refresh-translations && git commit po -m 'Update PO files.'
125 Freeze
126 ------
128 If we are at freeze time for a major release:
130 * Merge the `master` Git branch into `devel`.
131 * Merge the `devel` Git branch into `testing`.
132 * Reset the `testing` APT suite to the state of the `devel` one, as
133   documented on [[contribute/APT_repository#workflow-freeze]].
135 Else, if we are at freeze time for a point-release:
137 * Merge the `master` Git branch into `stable`.
139 Changelog
140 ---------
142 Remove the placeholder entry for next release in `debian/changelog`,
143 and then:
145         ./release $VERSION $PREVIOUS_VERSION
147 This populates the Changelog with the Git log entries.
149 Then, launch an editor for the needed cleanup of the result:
151         dch -e
153 Then, gather other useful information from every custom bundled
154 package's own Changelog (Greeter, Persistent Volume Assistant, etc.).
156 Finally, commit:
158         git commit debian/changelog -m "Update changelog for $VERSION."
160 Included website
161 ----------------
163 ### Merge master
165 Merge `master` into the branch used for the release:
167         git fetch origin && git merge origin/master
169 ### version number
171 If preparing a RC, skip this part.
173 In the branch used to build the release, update the `inc/*` files to
174 match the *version number* and *date* of the new release. Set the date
175 at least 24 hours in the future! Between tests and mirror synchronization,
176 the build will not be released on the same day. Try to make sure it
177 matches the date of the future signature.
179         RELEASE_DATE='June 26, 2013'
181         echo "$VERSION"      > wiki/src/inc/stable_i386_version.html
182         echo "$RELEASE_DATE" > wiki/src/inc/stable_i386_date.html
183         $EDITOR wiki/src/inc/*.html
184         ./build-wiki
185         git commit wiki/src/inc/ -m "Update version and date for $VERSION."
187 ### features and design documentation
189 Read the Changelog carefully, and update [[doc/about/features]]
190 pages accordingly.
192 Also:
194         git grep PENDING wiki/src/contribute/design*
196 ... and remove the `PENDING-FOR-N.M` warnings.
198 Website translations
199 --------------------
201 Refresh the website PO files and commit the ones corresponding to
202 pages that were added or changed accordingly to changes coming with
203 the new release. This e.g. ensures that the RC call for translation
204 points translators to up-to-date PO files:
206         ./build-wiki && git add wiki/src && git commit -m 'Update website PO files.'
208 If at freeze time, ask on tails-l10n that someone checks the PO files
209 of `po/` and of the website [[using
210 `check_po.sh`|contribute/l10n_tricks]], and corrects all the errors.
212 Tag the release in Git
213 ======================
215         git tag -u 1202821CBE2CD9C1 -m "tagging version ${VERSION}" "${TAG}"
216         git push --tags
218 (Pushing the tag is needed so that the APT repository is updated, and
219 the Tails APT configuration works at build and boot time. It might be
220 premature, as testing might reveal critical issues, but this is
221 a signed tag, so it can be overridden later. Yes, there is room for
222 improvement here.)
224 Prepare the versioned APT suite
225 ===============================
227 Follow the [[post-tag|contribute/APT_repository#workflow-post-tag]] APT
228 repository documentation.
230 Build images
231 ============
233 Build the almost-final image
234 ----------------------------
236 [[Build images|contribute/build]] and carefully read the build logs to
237 make sure nothing bad happened.
239 SquashFS file order
240 -------------------
242 1. Build an ISO image.
243 1. Burn a DVD.
244 1. Boot this DVD **on bare metal**.
245 1. Add `profile` to the kernel command-line.
246 1. Three minutes after `iceweasel` has been loaded, retrieve the new sort
247    file from `/var/log/boot-profile`.
248 1. Copy the new sort file to `config/binary_rootfs/squashfs.sort`.
249 1. Cleanup a bit.
250 1. Inspect the Git diff (including diff stat), apply common sense.
251 1. `git commit -m 'Updating SquashFS sort file' config/binary_rootfs/squashfs.sort`
253 Build the final image
254 ---------------------
256 Then all included files should be up-to-date and the versioned APT
257 suite should be ready, so it is time to:
259 * tag the release *again*, with all included files in
260 * `git push --tags`
261 *  build the final image!
263 Build the Incremental Update Kit
264 --------------------------------
266 Example:
268     $ sudo tails-create-iuk --squashfs-diff-name 0.14.squashfs \
269         --old-iso tails-i386-0.14\~rc2.iso \
270         --new-iso tails-i386-0.14.iso      \
271         --outfile Tails_i386_0.14-rc2_to_0.14.iuk
273 Prepare update-description files
274 --------------------------------
276 1. Prepare update-description files (see [[!tails_todo incremental_upgrades]]
277    for details):
278    * update (create if needed) an update-description file for every
279      *previous* supported release (e.g. N-1, N-1~rc2) that describes
280      the path to the one being released,
281    * create a new update-description for the version being released,
282      that expresses that no update is available for that one yet
283 1. Detach-sign the update-description files.
284 1. Rename the detached signatures from `.asc` to `.sig`.
286 Generate the OpenPGP signatures and Torrents
287 ============================================
289 First, create a directory with a suitable name and go there:
291         mkdir "$ISOS/tails-i386-$VERSION" && cd "$ISOS/tails-i386-$VERSION"
293 Second, copy the built image to this brand new directory.
294 Then, rename it:
296         mv *.iso "tails-i386-$VERSION.iso"
298 Third, generate detached OpenPGP signatures for the image to be
299 published, in the same directory as the image and with a `.sig`
300 extension; e.g.
302         gpg --armor --default-key 1202821CBE2CD9C1 --detach-sign *.iso
303         rename 's,\.asc$,.sig,' *.asc
305 Fourth, go up to the parent directory, create a `.torrent` file and
306 check the generated `.torrent` files metainfo:
308         cd .. && \
309         mktorrent -a 'http://torrent.gresille.org/announce' "tails-i386-${VERSION}" && \
310         btshowmetainfo tails-i386-$VERSION.torrent
312 Fifth, generate detached OpenPGP signatures for every published
313 `.torrent` file:
315         gpg --armor --default-key 1202821CBE2CD9C1 --detach-sign \
316           tails-i386-$VERSION.torrent && \
317         mv tails-i386-$VERSION.torrent.{asc,sig}
319 Upload images
320 =============
322 Sanity check
323 ------------
325 Verify that the current source for Firefox is still the same we've
326 used when preparing our custom Iceweasel package: e.g. FF17.0.8 got
327 re-tagged and re-uploaded at the last minute, due to a test failure.
329 Better catch this before people spend time doing manual tests.
331 ## Announce, seed and test the Torrents
333 Announce and seed the Torrents.
335 Test them with a BitTorrent client running in a different place.
337 ## Download and seed image from lizard
339     scp tails-i386-$VERSION.torrent bittorrent.lizard:
340     ssh bittorrent.lizard transmission-remote --add tails-i386-$VERSION.torrent
342 Publish the ISO over HTTP
343 -------------------------
345 Upload the images to the primary rsync mirror. Best practice is to first
346 let bittorrent.lizard download the image, and then copy it from there to
347 rsync.lizard:
349     ssh lizard.tails.boum.org \
350         scp -3 -r \
351             bittorrent.lizard:/var/lib/transmission-daemon/downloads/tails-i386-$VERSION \
352             rsync.lizard:
353     # set DIST to either 'testing' (for RC:s) or 'stable' (for actual releases)
354     ssh rsync.lizard << EOF
355       chown -R root:rsync_tails tails-i386-$VERSION
356       chmod -R u=rwX,go=rX tails-i386-$VERSION
357       sudo mv tails-i386-$VERSION /srv/rsync/tails/tails/$DIST/
358     EOF
360 Update the time in `project/trace` file on the primary rsync mirror
361 and on the live wiki (even for a release candidate):
363         TRACE_TIME=$(date +%s) &&
364         echo $TRACE_TIME | ssh rsync.lizard "cat > /srv/rsync/tails/tails/project/trace" && \
365         [ -n "$MASTER_CHECKOUT" ] && \
366         echo $TRACE_TIME > "$MASTER_CHECKOUT/wiki/src/inc/trace" &&
367         (
368            cd "$MASTER_CHECKOUT" && \
369            git commit wiki/src/inc/trace -m "Updating trace file after uploading $VERSION."
370         )
372 Wait for the HTTP mirrors to catch up
373 -------------------------------------
375 Wait for the next rsync pull.
377 Make sure every webserver listed in the `dl.amnesia.boum.org` round
378 robin pool has the new version. Drop those that are lagging behind and
379 notify their administrators.
381 Test downloading the ISO over HTTP.
383 Testing
384 =======
386 1. Set up a Gobby document and copy the [[test
387    suite|contribute/release_process/test]] in it.
388 1. Email <tails@boum.org> to announce that tests may start:
389    - make it clear what's the deadline
390    - make it clear where and how you expect to get feedback
391    - attach the Torrent
392    - attach the `.packages` file
393 1. Make sure someone is committed to run the automated test suite.
394 1. Make sure that enough people are here to run the tests, that they
395    report their results in due time, and that they make it clear when
396    they're leaving for good.
398 While this happens, the release manager should prepare for the next
399 steps. Please read on!
401 Update the website and Git repository
402 =====================================
404 In order to get any new documentation into the website, merge either
405 `stable` or `testing` (depending on which release you just did) into
406 `master`.
408 Rename the `.packages` file to remove the `.iso` part of its name.
410 Copy the `.iso.sig`, `.packages`, `.torrent` and `.torrent.sig` files
411 into the Git repository's `wiki/src/torrents/files/` directory and
412 remove the one for the previous release (including any RCs). If
413 preparing an RC, only copy the `.iso.sig`.
415 Generate the SHA-256 hash of every image to be released in `inc/*`; e.g.
417         sha256sum $ISOS/tails-i386-$VERSION/tails-i386-$VERSION.iso | \
418           cut -f 1 -d ' ' | tr -d '\n' \
419           > wiki/src/inc/stable_i386_hash.html
421 Update the [[support/known_issues]] page.
423 Write the announcement for the release in
424 `news/version_$VERSION.mdwn`, including:
426 - Update the `meta title` directive.
427 - Make sure there's an `announce` tag to have an email sent to the
428   news mailing-list.
429 - Document important config changes that persistence users have to do
430   themselves (e.g. the Pidgin proxy settings change in
431   [[!tails_gitweb_commit 9925321]] breaks all existing persistent
432   profiles).
434 Write an announcement listing the security bugs affecting the previous
435 version in `security/` in order to let the users of the old versions
436 know that they have to upgrade. Date it a few days before the ISO
437 image to be released was *built*. Including:
439 - the list of CVE fixed in Linux since the one shipped in the previous
440   release of Tails:
441   <http://ftp-master.metadata.debian.org/changelogs/main/l/linux/unstable_changelog>
442 - the list of DSA fixed in packages we ship since those that were in
443   the previous release of Tails: <http://security.debian.org/>
444 - the list of MFSA fixed by the iceweasel update:
445   <https://www.mozilla.org/security/announce/>
447 Generate PO files for the release and security announcements with
448 `./build-wiki`.
449 Then, send them to <tails-l10n@boum.org> so that they get translated
450 shortly, perhaps even soon enough to integrate them before pushing the
451 release out officially.
453 Import the update description files and their detached OpenPGP
454 signature into the `updates/` tree. See [[!tails_todo incremental_upgrades]]
455 for the file naming conventions.
457 Then, record the last commit before putting the release out for real:
459         git commit -m "releasing version ${VERSION}"
461 Go wild!
462 ========
464 Sanity check
465 ------------
467 Verify once more that the current source for Firefox is still the same
468 we've used when preparing our custom Iceweasel packages.
470 Push
471 ----
473 ### Git
475 Push the last commits to our Git repository:
477         git push
479 ... and ask <root@boum.org> to refresh the ikiwiki wrappers for
480 our website.
482 Bug tracker
483 -----------
485 Mark all issues fixed in this release as `Status: Resolved` in our bug
486 tracker. For a list of candidates, see the [issues in *Fix committed*
487 status](https://labs.riseup.net/code/projects/tails/issues?query_id=111).
492 Update the topic in our [[chatroom|chat]].
494 Twitter
495 -------
497 Announce the release by tweeting a link to the "news" page.
499 Tor blog
500 --------
502 We announce *major* releases on the Tor blog:
504 - [login to their Drupal](https://blog.torproject.org/user)
505 - *Add a New Blog Post*
506 - add the same tags as the previous release announce had
507 - choose *Filtered HTML* as the *Input format*
508 - paste the HTML generated by ikiwiki from the announce in `news/`
509   into the textarea in the blog post editor
510 - cleanup a bit to make it shorter
511 - add a link to our [[download page|download]]
512 - change the internal links into external links
513 - turn `<h1>` into `<strong>`
514 - direct users to [[our communication channels|support/talk]] for
515   comments and feedback
516 - disable comments
518 Tor weekly news
519 ---------------
521 Write a short announcement for the Tor weekly news, or find someone
522 who's happy to do it.
524 Prepare for the next release
525 ============================
527 1. Move the previous stable release to `obsolete` on the mirrors.
528 1. Remove any remaining RC for the just-published release from
529    the mirrors.
530 1. Pull `master` back and merge it into `devel`.
531 1. Follow the
532    [[post-release|contribute/APT_repository#workflow-post-release]] APT
533    repository documentation.
534 1. Push the resulting `devel` branch.
535 1. If this was a major release, then reset experimental:
536    - take note of branches merged into `experimental`, but not into
537      `devel`:
539         git log --pretty=oneline --color=never --merges devel..experimental \
540           | /bin/grep 'into experimental$' \
541           | sed -e 's,^[a-f0-9]\+\s\+,,' | sort -u
543    - `git checkout experimental && git reset --hard devel`
544    - [[hard reset|contribute/APT_repository#workflow-reset]] the `experimental`
545      APT suite to the state of the `devel` one.
546    - merge additional branches into experimental (both at the Git and
547      APT levels)
549         for branch in $UNMERGED_BRANCHES ; do
550            suite=$(echo $branch | sed -e 's,[/_],-,g')
551            ssh reprepro@incoming.deb.tails.boum.org tails-merge-suite $suite experimental
552         done
554      Note that the merge will fail for suites that contain no package.
556    - `git push --force origin experimental`
557 1. Push the release tag to lizard for Jenkins' consumption: `git push --tags lizard`
558 1. Manually trigger Jenkins builds of experimental, devel and stable:
559    <https://jenkins.tails.boum.org/>.
560 1. Bonus points if you care about Tails 1.1: update the Iceweasel
561    packages for feature/wheezy, and trigger a Jenkins build thereof.
563 Related pages
564 =============
566 [[!map pages="contribute/release_process/*"]]