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 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. </p> 215<tbody> 216<tr> 217<td style="width:105px;height:16px"> <b>Release</b></td> 218<td style="width:792px;height:16px"> <b>Major Changes<br> 219</b></td> 220</tr> 221<tr> 222<td style="width:105px;height:29px"> <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"> 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 <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 <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 <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 > 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.tgz … 393# 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