Create a release branch in SVN

See "Tag related svn files".

Once the branch is created, only changes necessary for the target release are merged in from the trunk.

Upgrade LocaleExplorer and other demos/samples

... to the ICU project site.

Build the icuapps module following the README's. Update code and/or docs as needed. "Reference" platforms for icuapps are: RedHat Linux and win32. On Linux, icuapps is built against the "make install "'ed ICU. So, run ICU4C's configure with --prefix=/some/where pointing to where ICU4C should be installed, and also follow icuapps's README.

Install the new locale explorer and other demos/samples onto the public demo hosting site.

ICU Collation Demo

Update the ICU collation demo's index.html with the new ICU version’s available collators. For example, by running icuapps/trunk/webdemo/collation/ (after modifying it for your system) and copy-pasting the output available-collators.txt into index.html. See for example the changes for

For details see the comments at the start of the file.

Tag related svn files

Careful! The following examples contain specific version, revision and ticket numbers. Adjust them for the current release! Easiest: Paste into an editor, fix, then paste into the terminal.

Also, the following command lines use repository-relative paths. For this to work, you have to be in an svn workspace for the ICU repository. Alternatively, replace the "^" with the repository root (svn+ssh://

Before you tag

Sanity check: Update to the lastest repository revision. (Trunk if you copy from trunk, maintenance branch if you copy from there.)

svn update
Updated to revision 41082.
Build & test ICU4C & ICU4J on your machine.

Release candidate

Create the maintenance branch from the current known good trunk revision, using the rc release ticket.

svn cp -r 41082 ^/trunk ^/branches/maint/maint-61 -m 'ticket:13581: create ICU 61 maintenance branch from trunk r41082'

Create the rc tag from there.

svn cp -r 41083 ^/branches/maint/maint-61 ^/tags/release-61-rc -m 'ticket:13581: create ICU 61 rc tag from maintenance branch r41083'


Create the release tag from the maintenance branch.

svn cp -r CHANGESET ^/branches/maint/maint-61 ^/tags/release-61-1 -m 'ticket:TICKET: create ICU 61 release tag from maintenance branch rCHANGESET'

Update the "latest" tag.

svn rm ^/tags/latest -m 'ticket:TICKET: delete latest tag before re-tagging'
svn cp -r CHANGESET ^/tags/release-61-1 ^/tags/latest -m 'ticket:TICKET: create latest tag from ICU 61 release tag rCHANGESET'

Maintenance release

Create the maintenance release tag from the maintenance branch.

svn cp -r CHANGESET ^/branches/maint/maint-61 ^/tags/release-61-2 -m 'ticket:TICKET: create ICU 61-2 maintenance release tag from maintenance branch rCHANGESET'

Update the "latest" tag.

svn rm ^/tags/latest -m 'ticket:TICKET: delete latest tag before re-tagging'
svn cp -r CHANGESET ^/tags/release-61-2 ^/tags/latest -m 'ticket:TICKET: create latest tag from ICU 61-2 maintenance release tag rCHANGESET'

ICU 58 and earlier

Tag related svn files, for icu, icu4j and (for final releases) tools file trees. We tag the tools tree so that we can reproduce the Unicode tools that were used for the Unicode data files in this release.

For a Release Candidate, just tag, don't branch, and only tag icu & icu4j.

For the final release, branch then tag. Copy the trunk to maint/maint-4-8 and copy that to tags/release-4-8. Specify the source revision explicitly via -r so that you don't inadvertently pick up an unexpected changeset. Make sure that the trunk at the source revision is good.

We do not tag the data & icuapps trees. Steven Loomis writes on 2011-may-23:

My thought had been (in the CVS days) to take a 'snapshot' of these items. However, in SVN all you need is a date or a revision number (such as r30140).

So, probably, we don't need to tag these two (icuapps or data).

Tools are more important because those tools are actually used in the release.

Create ICU download page

Create the download page before the first milestone, if we have one, or before the release candidate.

Log into the ICU homepage Google Site. (If you don't have write access, ask one of the editors to grant you access.)

Verify that there is not already a page for the upcoming release: Either via the sitemap, or on the bottom of the main download page where it says something like "Subpages (27): View All".

Copy the download page for the last release: Go to that page, gear menu, Copy page; "Name your page" using just the major version number for now (e.g., "61") so that the page URL is just that number, select "Put page under Downloading ICU", click the red COPY button.

Adjust the new page as needed: Change the title to "Download ICU 61 Release Candidate" (with the right version number...), remove contents specific to the previous release, update all version numbers, update all links.

Put a big, bold+italics, red warning at the top like "This version has not been released yet. Use it for testing but not in production!"

Save the page. It is generally a good idea to save frequently. For further edits, simply go back into edit mode. (Keyboard shortcut 'e' for edit, ctrl+s for save.)

Add new contents for the upcoming release: Grab some text from the sibling Unicode and CLDR release notes, look at the proposal status doc for this release, make a pass through the api/enhancement tickets fixed in this release or under reviewing/reviewfeedback.

Look at the download pages of the last two releases for templates for things like a Migration Issues section etc.

Ask everyone on the team to add stuff & details.

Once the page has been created and various people are invited to edit it, everyone should keep editing short so that the page is not locked for others for long periods of time.

Maintenance release

For a maintenance release, look at the ICU 60 page which includes 60.2.

Milestone on the main download page

We had the following HTML on the main download page for ICU 4.8M1 = 4.7.1:

<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>
<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>
<td style="width:105px;height:16px">&nbsp;<b>Release</b></td>
<td style="width:792px;height:16px">&nbsp;<b>Major Changes<br>
<td style="width:105px;height:29px">&nbsp;<a href="">4.8M1 (4.7.1)</a><br>
<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>

Upload Release Source/Binaries

Download Directories are located at, for example,
corresponding to

Look at previous releases for an example.

Java Source/Bin:   See Building ICU4J Release Files

C source/binary: WORK IN PROGRESS

  • Source and Linux Bins: requirements:   Unix make + docker
  • (You need to install docker and docker-compose, do not proceed until docker run hello-world works!)
  • Windows Bin:
    • Build with MSVC x64 Release. (See the ICU readme.html file for details).
    • Open a command prompt.
    • > cd C:\icu\icu4c\  (or wherever you have ICU located).
    • > powershell
    • > Set-ExecutionPolicy -Scope Process Unrestricted
    • > .\packaging\distrelease.ps1
    • This will produce the file "source\dist\", which will need to be renamed before uploading.
      • For example, the binaries for ICU4C v61.1 generated with VS2017 were named "".
  • AIX Bin: (AIX is broken and ignored for now.)
    • login to and copy the ICU4C source archive created above to there.
    • $ gzip -dc icu4c-XXX-src.tgz | tar xf -
    • $ cd icu
    • $ PATH=/opt/IBM/xlC/13.1.3/bin:$PATH source/runConfigureICU AIX
    • (The above command line doesn't actually work, see ICU Ticket #13639 for a workaround.)
    • $ gmake DESTDIR=/tmp/icu releaseDist
    • That last step will create a directory in /tmp/icu - zip that up to make the release.
    • In case /tmp happens to be full, see the mailing list archive for advice.
PGP files:
Sign all archives created above with your own personal PGP key:
gpg --armor --detach-sign
MD5 files:
Create three different '.md5' files for icu4j (all files),  icu4c (source) and icu4c (binaries).
Use cfv: like this to create a .md5 file:
cfv -t md5 -C -f icu-……-src.md5 somefile.tgz
To verify, just run "cfv -f icu-……-src.md5" and it will verify that the md5 file contains hashes for all referenced files.


Create a SHASUM512.txt file  with:

shasum -a 512 *.zip *.tgz | tee SHASUM512.txt

This file should also be GPG signed.

Check the ICU public site for the new release

Make sure that, aside from download pages, homepages, news items, feature lists and feature comparisons, etc. are updated. Upload the new API references. Update the User Guide.

Update the Trac release number list for ICU4C and ICU4J.

Update the ICU release number list by going to "Admin>Versions" in Trac, and add the new ICU version.

Post-release cleanup

  • Cleanup the milestone in the ICU Trac. Move left over items to future milestones. Close the milestone.
  • Look for TODO comments in the source code and file new tickets as required.
  • Delete and retag latest (ONLY after GA release, including maintenance!)
    • svn delete latest
    • svn cp <the latest tags/release-###  tag>  latest

Update online demos

Update online demos/tools to the latest version:

Online information update

Collation and comparison charts need to be updated. See charts/Performance & Size.

Old sensitive tickets

Unset the "sensitive" flag on old tickets. For example, on tickets that were fixed two or more releases ago.

Sample ticket query for ICU 59. Adjust the milestone selection as appropriate. Check the list in the ICU meeting.

Check duplicates and fixedbyotherticket! Keep the "sensitive" flag on tickets that were closed as duplicates of other tickets that are not yet fixed or have been fixed only very recently.

For removing the flag:

  • Select all query results.
  • Uncheck duplicates of unfixed or too-recent tickets.
  • At the bottom of the page, set the bulk update to do
    • field sensitive=no
    • field keywords=was_sensitive
    • update timestamps=yes
    • send emails=no
  • Submit & verify/spot-check.

Update readme

Update ICU4C readme.html and ICU4J readme.html before every milestone (GA / RC / Milestone-N). Make sure following items are up to date.

  • Release version
  • Last update date
  • Description - descriptions for GA, RC and Milesone-N are already included in the readme file. For every milestone, pick the right one for the release type.
  • Build steps - make sure supported compiler versions are up to date