1---
2layout: default
3title: Publish
4parent: Release & Milestone Tasks
5grand_parent: Contributors
6nav_order: 90
7---
8
9<!--
10© 2021 and later: Unicode, Inc. and others.
11License & terms of use: http://www.unicode.org/copyright.html
12-->
13
14# Publish
15{: .no_toc }
16
17## Contents
18{: .no_toc .text-delta }
19
201. TOC
21{:toc}OnlineDemosHowToUpdate
22
23---
24
25## Create a release branch in GitHub
26
27Once the branch is created, only changes necessary for the target release are
28merged in from the trunk.
29
30---
31
32## Upgrade LocaleExplorer and other demos/samples
33
34... to the ICU project site.
35
36Build the icu-demos module following the README's. Update code and/or docs as
37needed. "Reference" platforms for icu-demos are: RedHat Linux and win32. On Linux,
38icu-demos is built against the "make install "'ed ICU. So, run ICU4C's configure
39with --prefix=/some/where pointing to where ICU4C should be installed, and also
40follow icu-demos's README.
41
42Install the new locale explorer and other demos/samples onto the public demo
43hosting site.
44
45---
46
47## ICU Collation Demo
48
49Update the ICU collation demo's `index.html` with the new ICU version’s
50available collators.
51
521.  Do a clean build (configure, make clean, make install, make check).
53    1.  Otherwise, the data build may not pick up a new locale into the
54        coll/res_index.txt file.
552.  Run [icu-demos >
56    webdemo/collation/build.sh](https://github.com/unicode-org/icu-demos/blob/main/webdemo/collation/build.sh)
57    (after modifying it for your system).
583.  Copy-paste the output `available-collators.txt` into `index.html`.
59    1.  Or, easier: Use a GUI difftool (e.g., meld) to compare the two and move
60        the changes into index.html.
61    2.  `meld webdemo/collation/index.html ../available-collators.txt`
624.  See for example the changes for
63    [ICU-11355](https://unicode-org.atlassian.net/browse/ICU-11355)
64
65For details see the comments at the start of the build.sh file.
66
67---
68
69## Repository Branch and Tags
70
71⚠ Careful! The following examples contain specific version, revision and ticket
72numbers. Adjust them for the current release! Easiest: Paste into an editor,
73fix, then paste into the terminal.
74
75### Creating Maintenance Branch.
76
77Sanity check: Update to the latest repository revision. (Main branch if you
78copy from main, maintenance branch if you copy from there.)
79
80```sh
81git checkout main 
82git pull upstream main 
83git log -n1 
84commit bcd0... (HEAD -> main, upstream/main, ...)
85```
86
87Ensure that your local branch is in sync with the upstream branch. Make sure you
88are checking the upstream remote, and not your fork!
89
90Build & test ICU4C & ICU4J on your machine.
91
92Create the maintenance branch from the current known good main ref.
93
94```sh
95git checkout -b maint/maint-63 
96git push -u upstream maint/maint-63
97```
98
99#### Tagging
100
101Use the GitHub GUI to create both the "release" and the "tag" at the same time:
102
103<https://github.com/unicode-org/icu/releases/new>
104
105Fill in the tag name, such as "release-63-rc" or "release-63-1", and make the
106target the "maint/maint-xx" branch (such as maint/maint-63).
107
108Set the title to "ICU 63 RC" or "ICU 63.1". Fill in the description using the
109text from the announcement email. (You can also look at previous releases and
110possibly re-use some of the generic text, such as links to the API docs, etc.)
111
112Your screen should look like this:
113
114![image](maint-63-rc-screenshot.png)
115
116For the release candidate tag, please check the box that says "Pre-Release".
117
118We no longer need to add the note about Git LFS files, as GitHub now includes
119them in the auto-generated .zip downloads.
120
121Click the "Publish Release" button to make the tag.
122
123Note: The "latest" tag is no longer updated. It was agreed by the ICU-TC to be
124deleted around the 64.2 time-frame, as it doesn't work well with with Git. (You
125need to force-push the new tag, and if somebody has already cloned the
126repository, they might have something different for the "latest" tag).
127A possible future alternative might be a sym-link folder, or HTTP redirect that
128points to the latest release.
129
130#### Maintenance release
131
132Create the maintenance release tag from the maintenance branch, as above.
133
134Update the "latest" tag.
135
136### ~~ICU 58 and earlier~~
137
138~~Tag related svn files, for **icu**, **icu4j** and (for final releases)
139**tools** file trees. We tag the tools tree so that we can reproduce the Unicode
140tools that were used for the Unicode data files in this release.~~
141
142~~For a Release Candidate, just tag, don't branch, and only tag icu & icu4j.~~
143
144~~For the final release, branch then tag. Copy the trunk to maint/maint-4-8 and
145copy that to tags/release-4-8. Specify the source revision explicitly via -r so
146that you don't inadvertently pick up an unexpected changeset. Make sure that the
147trunk at the source revision is good.~~
148
149~~We do not tag the data & icu-demos trees. Steven Loomis writes on 2011-may-23:~~
150
151> ~~My thought had been (in the CVS days) to take a 'snapshot' of these items.
152> However, in SVN all you need is a date or a revision number (such as
153> r30140).~~
154
155> ~~So, probably, we don't need to tag these two (idu-demos or data).~~
156
157> ~~Tools are more important because those tools are actually used in the
158> release.~~
159
160### Create ICU download page
161
162Create the download page before the first milestone, if we have one, or before
163the release candidate.
164
165Log into the ICU homepage Google Site. (If you don't have write access, ask one
166of the editors to grant you access.)
167
168Verify that there is not already a page for the upcoming release: Either via the
169sitemap, or on the bottom of the main download page where it says something like
170"Subpages (27): View All".
171
172Copy the download page for the last release: Go to that page, gear menu, Copy
173page; "Name your page" using just the major version number for now (e.g., "61")
174so that the page URL is just that number, select "Put page under Downloading
175ICU", click the red COPY button.
176
177Adjust the new page as needed: Change the title to "Download ICU 61 Release
178Candidate" (with the right version number...), remove contents specific to the
179previous release, update all version numbers, update all links.
180
181Put a big, bold+italics, red warning at the top like "This version has not been
182released yet. Use it for testing but not in production!"
183
184Save the page. It is generally a good idea to save frequently. For further
185edits, simply go back into edit mode. (Keyboard shortcut 'e' for edit, ctrl+s
186for save.)
187
188Add new contents for the upcoming release: Grab some text from the sibling
189Unicode and CLDR release notes, look at the proposal status doc for this
190release, make a pass through the api/enhancement tickets fixed in this release
191or under reviewing/reviewfeedback.
192
193Look at the download pages of the last two releases for templates for things
194like a Migration Issues section etc.
195
196Ask everyone on the team to add stuff & details.
197
198**Once the page has been created and various people are invited to edit it,
199everyone should keep editing short so that the page is not locked for others for
200long periods of time.**
201
202### Maintenance release
203
204For a maintenance release, look at the ICU 60 page which includes 60.2.
205
206---
207
208## Milestone on the main download page
209
210We had the following HTML on the main download page for ICU 4.8M1 = 4.7.1:
211
212```html
213<h3 style="background-color:rgb(102, 102, 102);color:white;margin-bottom:0pt;margin-top:12pt;padding-left:0.75em;font-size:1em;font-family:Arial,Helvetica,sans-serif">Development Milestones</h3>
214<table border="0"><p style="font-size:10pt;font-family:Arial,Helvetica,sans-serif">Development milestone versions of ICU can be downloaded below. A development milestone is a stable snapshot build for next ICU major version.  These binaries and source code are provided for evaluation purpose and should be not be used in production environments.  New APIs or features in a milestone release might be changed or removed without notice.&nbsp;</p>
215<tbody>
216<tr>
217<td style="width:105px;height:16px">&nbsp;<b>Release</b></td>
218<td style="width:792px;height:16px">&nbsp;<b>Major Changes<br>
219</b></td>
220</tr>
221<tr>
222<td style="width:105px;height:29px">&nbsp;<a href="https://sites.google.com/site/icusite/download/471">4.8M1 (4.7.1)</a><br>
223</td>
224<td style="width:792px;height:29px">&nbsp;CLDR 1.9.1+, Parent locale override, Dictionary type trie, Alphabetic index (C), Compound text encoding (C), JDK7 Locale conversion (J)<br>
225</td>
226</tr>
227</tbody>
228</table>
229</span><br>
230```
231
232---
233
234## Upload Release Source / Binaries
235
236Download Directories are located at, for example,
237`icu-project.org:/home/htdocs/ex/files/icu4c/4.4.2`
238corresponding to <http://download.icu-project.org/ex/files/icu4c/4.4.2/>
239Look at previous releases for an example.
240
241### Java Source/Bin:
242
243Follow instructions here: [Building ICU4J Release Files](../release-build.md)
244
245### C source/binary:
246
247<span style="background:yellow">***WORK IN PROGRESS***</a>
248
249#### Source and Linux Binaries:
250
251Important: this step works with Unix make + docker.
252
253First, install *docker* and *docker-compose. D*o not proceed until *docker run
254hello-world* works!
255
256```sh
257$ git clone https://github.com/unicode-org/icu-docker.git
258$ cd icu-docker/src
259$ git clone --branch release-64-rc --depth 1 https://github.com/unicode-org/icu.git
260$ cd icu
261$ git lfs fetch
262$ git lfs checkout
263$ cd ../..
264$ less [README.md](https://github.com/unicode-org/icu-docker/blob/main/README.md)  # Follow these instructions.
265```
266
267*   Source and binaries are created in ./dist/.
268*   The names [don't match what's needed on
269    output](https://github.com/unicode-org/icu-docker/issues/1) so be sure to
270    rename.
271
272**Note:** If you only want to make a source tarball (.tgz/.zip), then you can
273run \`make dist\`.
274
275*   This will produce a source tarball and will include a pre-compiled .dat file
276    under icu4c/source/data/in/.
277*   Note: This tarball will also omit all of the data sub-directories containing
278    locale data.
279*   Note that the source is taken from the git repository itself, and not your
280    local checkout. (Thus it will exclude any local uncommitted changes).
281
282#### Windows Binary:
283
284*   Manual process:
285    *   Build with MSVC x64 Release. (See the ICU
286        [readme.html](https://github.com/unicode-org/icu/main/blob/icu4c/readme.html)
287        file for details).
288    *   Open a command prompt.
289        ```
290        cd C:\icu\icu4c\ (or wherever you have ICU located).
291        powershell
292        Set-ExecutionPolicy -Scope Process Unrestricted
293        .\packaging\distrelease.ps1 -arch x64
294        ```
295        This will produce the file "source\dist\icu-windows.zip", which will
296        need to be renamed before uploading.
297        *   For example, the binaries for ICU4C v61.1 generated with VS2017 were
298            named "icu4c-61_1-Win64-MSVC2017.zip".
299        *   Note: As of ICU 68, the pre-built binaries use MSVC2019 instead of
300            MSVC2017.
301*   Using the output from the build bots:
302    *   Navigate to the GitHub page for the commits on the
303        `maint/maint-<version>` branch.
304        *   Ex: https://github.com/unicode-org/icu/commits/maint/maint-64
305    *   Click on the green check mark (✔) on the most recent/last commit. (It
306        might be a red X if the builds failed, hopefully not).
307        *   This will open up a pop-up with links to various CI builds.
308    *   Click on one of the various links that says "Details" for the Azure CI
309        builds.
310        *   This will open up the GitHub overview of the build status.<br>
311            ![image](azure-ci-builds.png)<br>
312    *   Click on the link "View more details on Azure Pipelines" link.
313        *   This will take you to the actual Azure CI build page.
314    *   On the top right of the page there should be a button titled
315        "Artifacts". Click this and it should show a drop-down with various ZIP
316        files that you can download.<br>
317        ![image](azure-ci-builds-artifacts.png)<br>
318    *   The ZIP may automatically download for you.
319    *   However, if you are signed-in to visualstudio.com then you might see a
320        dialog titled "Artifacts explorer".
321    *   In this case click on the name, then the "..." button to download the
322        zip file.<br>
323        ![image](azure-ci-builds-artifacts-download.png)<br>
324    *   Download both the x64 (64-bit) and x86 (32-bit) ZIP files.
325    *   For each architecture:
326        *   Extract the Zip file. (It will have a name like
327            "20190829.6_ICU4C_MSVC_x64_Release.zip").
328        *   Navigate into the folder with the same name.
329        *   Rename the file "icu-windows.zip" to the appropriate name:
330            *   Ex: The x64 zip for version 64.1 was named
331                "icu4c-64_1-Win64-MSVC2017.zip"
332            *   Ex: The x86 zip for version 64.1 was named
333                "icu4c-64_1-Win32-MSVC2017.zip"
334            *   Note: Note: As of ICU 68, the pre-built binaries use MSVC2019
335                instead of MSVC2017.
336        *   Note: For RC releases the name looked like this:
337            "icu4c-64rc-Win64-MSVC2017.zip"
338*   ~~AIX Bin:~~ (AIX is broken and ignored for now.)
339    *   ~~login to gcc119.fsffrance.org and copy the ICU4C source archive
340        created above to there.~~
341    *   ~~$ gzip -dc icu4c-XXX-src.tgz | tar xf -~~
342    *   ~~$ cd icu~~
343    *   ~~$ PATH=/opt/IBM/xlC/13.1.3/bin:$PATH source/runConfigureICU AIX~~
344    *   ~~(The above command line doesn't actually work, see [ICU Ticket
345        ICU-13639](https://unicode-org.atlassian.net/browse/ICU-13639) for a
346        workaround.)~~
347    *   ~~$ gmake DESTDIR=/tmp/icu releaseDist~~
348    *   ~~That last step will create a directory in **/tmp/icu** - zip that up
349        to make the release.~~
350    *   ~~In case /tmp happens to be full, see the [mailing list
351        archive](https://sourceforge.net/p/icu/mailman/message/36275940/) for
352        advice.~~
353
354#### Output of icuexportdata:
355
356This step publishes pre-processed Unicode property data, which may be ingested by downstream clients such as ICU4X.
357
358*   Using the output from the build bots:
359    *   Navigate to the Azure Pipeline `C: Create Artifacts from icuexportdata` and download its single artifact (`icuexportdata_output`)
360    *   Unzip the file
361    *   Rename the `icuexportdata_tag-goes-here.zip` file to the correct tag (replacing slashes with dashes)
362
363### Signing archives and creating checksums:
364
365#### Step 1. PGP files:
366
367Sign all archives created above with your own personal PGP key. This creates a
368file with .asc as the suffix.
369
370```sh
371$ gpg --armor --detach-sign icu4c-xxx-xxx.zip
372# To verify
373$ gpg --verify icu4c-xxx-xxx.zip.asc
374```
375
376#### Step 2. MD5 files:
377
378Use md5sum or [cfv](http://cfv.sf.net) to create [md5](https://en.wikipedia.org/wiki/MD5) hash sums for three groups of files:
379
380*   icu4j (all files),
381*   icu4c (source),
382*   icu4c (binaries).
383
384Using md5sum to create and verify the checksum files:
385
386<pre><code><b><b>md5sum source1 source2 ... sourceN &gt; icu4c_sources.md5</b></b> # To verifymd5sum -c icu4c_sources.md5 
387</code></pre>
388
389Alternatively, use cfv to create and verify md5 files:
390
391```sh
392cfv -t md5 -C -f icu-……-src.md5 somefile.zip somefile.tgz393# To verify 
394cfv -f icu-……-src.md5
395```
396
397#### Step 3. SHASUM512.txt
398
399Create an additional hash sum file SHASUM512.txt file with:
400
401```sh
402shasum -a 512 *.zip *.tgz | tee SHASUM512.txt
403```
404
405This file should also be GPG signed. Check the .asc with \`gpg verify\`.
406
407### Update the Download Page Gadgets
408
409Update the gadgets on the download page to point at the new URL for the
410binaries.
411
4121.  Edit the download page.
4132.  Click on the Gadget area.
4143.  Click on the "gear" icon.
4154.  Update the URL field with the new URL.
416    1.  For example: The ICU4C 63.1 Binaries URL was:
417        <http://apps.icu-project.org/icu-jsp/downloadSection.jsp?ver=63.1&base=c&svn=release-63-1>
418
419#### Check the ICU public site for the new release
420
421Make sure that, aside from download pages, homepages, news items, feature lists
422and feature comparisons, etc. are updated. Upload the new API references. Update
423the User Guide.
424
425#### Update the Trac release number list for ICU4C and ICU4J. <<?? STILL VALID ??>>
426
427Update the ICU release number list by going to "Admin>Versions" in Trac, and add
428the new ICU version.
429
430#### Post-release cleanup
431
432*   Cleanup the milestone in the ICU Trac. Move left over items to future
433    milestones. Close the milestone.
434*   Look for TODO comments in the source code and file new tickets as required.
435*   Delete and retag
436    [latest](http://source.icu-project.org/repos/icu/tags/latest/) (**ONLY**
437    after GA release, including maintenance!) << IS THIS STILL VALID WITH GIT?
438    >>
439
440---
441
442## Update online demos
443
444These are the online demos/tools that need to be updated to the latest version.
445
446* Be sure to verify that the deployed version is publicly available.
447
448Note that updating ICU4C demos online requires Gcloud access.
449
450### ICU4C demos
451* [Run ICU4C demos](https://icu4c-demos.unicode.org/icu-bin/idnbrowser)
452
453* [Demo described here](https://github.com/unicode-org/icu-demos/blob/main/README.md)
454
455* [Building and deploying from GCloud](https://github.com/unicode-org/icu-demos//blob/main/README.md)
456
457### ICU4J demos
458
459* [Run ICU4J online demos](https://icu4j-demos.unicode.org/icu4jweb/)
460
461* [Information on the Java demos and samples](https://icu.unicode.org/home/icu4j-demos)
462
463* [Instructions for building and deploying updates](https://github.com/unicode-org/icu-demos/blob/main/icu4jweb/README.md)
464
465
466### Online information update
467
468Collation and [comparison](../../../../charts/comparison/index.md) charts need
469to be updated. See [charts/Performance & Size](../../../../charts/index.md).
470
471### Old sensitive tickets
472
473Unset the "sensitive" flag on old tickets. For example, on tickets that were
474fixed two or more releases ago.
475
476[Sample ticket query for ICU 65, for tickets fixed in 63 or
477earlier](https://unicode-org.atlassian.net/issues/?jql=project%20%3D%20ICU%20AND%20Level%3DSensitive%20AND%20fixVersion%20not%20in%20(65.1%2C%2064.2%2C%2064.1)%20AND%20status%3DDone).
478Adjust the fixVersion selection as appropriate. Check the list in the ICU
479meeting.
480
481Check duplicates and fixedbyotherticket! Keep the "sensitive" flag on tickets
482that were closed as duplicates of other tickets that are not yet fixed or have
483been fixed only very recently.
484
485For removing the flag:
486
487*   Enter bulk edit. Select all query results.
488*   Uncheck duplicates of unfixed or too-recent tickets.
489*   Edit fields:
490    *   Security Level = None
491    *   Add label "was_sensitive"
492    *   No notification emails
493*   Confirm bulk edit.
494
495---
496
497## Punt tickets
498
499Double-check that tickets with commits in this release are closed/fixed. Close
500as needed. (Hopefully none misticketed at this point...)
501
502Then punt remaining tickets marked for this release:
503
5041.  In Jira, search for all tickets with Project=ICU, Fix Version=<this
505    release>, Status≠Done.
5062.  Go to Bulk Edit ("..." menu in the upper right corner)
5073.  Select all
5084.  Edit fields:
509    1.  Fix Version: replace all with "future"
510    2.  Labels: add "punt<this release>" (e.g., "punt63")
511    3.  No email notifications
5125.  Confirm bulk edit
5136.  Send a courtesy email to the team with a Jira query URL for the
514    Label="punt<this release>" tickets.
515
516After punting, please also update the "To-Do for Next ICU Release" widget on
517Jira.
518
5191.  Open <https://unicode-org.atlassian.net/issues/?filter=10007>
5202.  Use the drop-down to change the fix version to the next ICU version
5213.  Click "Save" next to the filter title
522
523## Update readme
524
525Update [ICU4C
526readme.html](https://github.com/unicode-org/icu/main/icu4c/readme.html)
527and [ICU4J
528readme.html](https://github.com/unicode-org/icu/main/icu4j/readme.html)
529before every milestone (GA / RC / Milestone-N). Make sure the following items
530are up to date.
531
532*   Release version
533*   Last update date
534*   Description - descriptions for GA, RC and Milesone-N are already included in
535    the readme file.
536    *   Comment/uncomment parts as appropriate.
537    *   If the readme should remain the same between milestones, we can skip
538        directly to the GA description. Otherwise, pick the right one for the
539        release type.
540    *   **Since ICU 67, we have skipped from GA to GA**, without marking &
541        unmarking the readme specifically for the release candidate.
542*   Build steps - make sure supported compiler versions are up to date
543