| 
 | 1 | +# Crystal release process checklist  | 
 | 2 | + | 
 | 3 | +1. Submit a Freeze/Release PR  | 
 | 4 | +   * It should contain the expected date of the release (~two weeks after the PR is issued).  | 
 | 5 | +   * It should be populated with updates to CHANGELOG.md and VERSION.  | 
 | 6 | +2. Verify Maintenance CI in the parent commit of the changelog succeed  | 
 | 7 | +   * This mean either the commit was the one used for nightly build or,  | 
 | 8 | +   * A branch with `release/` prefix or `ci` word was pushed  | 
 | 9 | +3. Check the artifacts pass the ecosystem test  | 
 | 10 | +   * Grab latest copy of https://github.com/crystal-lang/test-ecosystem  | 
 | 11 | +   * Override branches of projects if needed at ./scripts/10-clone-repos.sh  | 
 | 12 | +   * Set `./crystal-versions.env` with the URL of the artifacts and with the docker image  | 
 | 13 | +   * Use the different make targets described in the `./README`  | 
 | 14 | +4. Merge the Changelog PR  | 
 | 15 | +5. Tag & annotate the commit with the changelog using `<M.m.p>` pattern as {version} (as a pre-release directly in GH?)  | 
 | 16 | +6. Wait for the build  | 
 | 17 | +7. Smoke test with test-ecosystem  | 
 | 18 | +8. Push changes to OBS for building linux packages  | 
 | 19 | +   1. Checkout https://github.com/crystal-lang/distribution-scripts  | 
 | 20 | +   2. Grab the urls (or local path) of the artifacts from circle-ci  | 
 | 21 | +      * `crystal-*-linux-x86_64.tar.gz`  | 
 | 22 | +      * `crystal-*-linux-i686.tar.gz`  | 
 | 23 | +      * `crystal-*-docs.tar.gz`  | 
 | 24 | +   3. Follow [./packages/README.md](../packages/README.md) in distribution-scripts  | 
 | 25 | +      1. The following steps should run in an openSUSE distribution with osc installed (https://github.com/crystal-lang/osc-docker)  | 
 | 26 | +      1. Configure build.opensuse.org credentials in ~/.oscrc  | 
 | 27 | +      1. `osc branchco devel:languages:crystal crystal`  | 
 | 28 | +      1. `cd home\:$OBS_USERNAME\:branches\:devel\:languages\:crystal/crystal`  | 
 | 29 | +      1. Copy the updated build artifact tarballs in place  | 
 | 30 | +      1. Update version in package specifications:  | 
 | 31 | +         ```bash  | 
 | 32 | +         VERSION=1.1.0 # or whatever version you’re releasing  | 
 | 33 | +         sed -i -e "s/^Version: .*/Version: ${VERSION}-1/" *.dsc  | 
 | 34 | +         sed -i -e "s/^Version: .*/Version: ${VERSION}/" *.spec  | 
 | 35 | +         ```  | 
 | 36 | +      1. Verify the changes with `osc diff`  | 
 | 37 | +      1. Update changelog: `osc vc -m “Update devel:languages:crystal to $VERSION`  | 
 | 38 | +      1. Commit changes: `osc commit -m “Update devel:languages:crystal to $VERSION`  | 
 | 39 | +      1. Now OBS builds the packages. It’s best to continue in the browser now: https://build.opensuse.org/project/show/home:$OBS_USER:branches:devel:langauges:crystal/crystal  | 
 | 40 | +      1. Wait for all jobs to finish and when everything is green, create a submit request against the original package (“Submit package” link in the menu bar on the package in your branch)  | 
 | 41 | +9. Build and publish docker images  | 
 | 42 | +   1. Checkout https://github.com/crystal-lang/crystal-dist  | 
 | 43 | +   2. `$ ./dist.sh build-docker {version}`  | 
 | 44 | +   3. `$ ./dist.sh push-docker {version}`  | 
 | 45 | +   4. Manually push the `crystallang/crystal:{version}` image as `crystallang/crystal:latest`  | 
 | 46 | +      * `$ docker tag crystallang/crystal:{version} crystallang/crystal:latest`  | 
 | 47 | +      * `$ docker push crystallang/crystal:latest`  | 
 | 48 | +   5. Manually build and push alpine images  | 
 | 49 | +      * Go to distribution-scripts/docker  | 
 | 50 | +      * `$ make clean alpine DOCKER_REPOSITORY=crystallang/crystal DOCKER_TAG={version} CRYSTAL_VERSION={version} CRYSTAL_TARGZ=~/Downloads/crystal-{version}-1-linux-x86_64.tar.gz`  | 
 | 51 | +      * `$ docker push crystallang/crystal:{version}-alpine`  | 
 | 52 | +      * `$ docker push crystallang/crystal:{version}-alpine-build`  | 
 | 53 | +      * `$ docker tag crystallang/crystal:{version}-alpine crystallang/crystal:latest-alpine`  | 
 | 54 | +      * `$ docker push crystallang/crystal:latest-alpine`  | 
 | 55 | +10. Publish docs  | 
 | 56 | +    1. Have s3cmd installed and AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY env variables defined  | 
 | 57 | +    1. `$ source /Volumes/Secured/secure/manas-aws-key-crystal-dist.sh`  | 
 | 58 | +    1. Checkout https://github.com/crystal-lang/crystal-dist  | 
 | 59 | +    1. Download `*-docs.tar.gz` from circle-ci artifacts  | 
 | 60 | +    1. `$ ./dist.sh push-docs {version} path/to/crystal-{version}-docs.tar.gz`  | 
 | 61 | +    1. `$ ./dist.sh update-docs-versions {crystal_working_copy}`  | 
 | 62 | +    1. `$ ./dist.sh redirect-docs {version}`  | 
 | 63 | +11. Publish snap package  | 
 | 64 | +    1. You need to logged in via `$ snapcraft login`  | 
 | 65 | +    1. Recent tagged release is published directly to edge channel. The CI logs the snap revision number. Otherwise the .snap file is in the artifacts.  | 
 | 66 | +    1. Check the current status to find the revision of the tagged release otherwise:  | 
 | 67 | +    1. `$ snapcraft status crystal`  | 
 | 68 | +    1. `$ snapcraft release crystal <revision-number> beta`  | 
 | 69 | +    1. `$ snapcraft release crystal <revision-number> stable`  | 
 | 70 | +12. Build Github release  | 
 | 71 | +    1. Copy the changelog as release notes in the tag (if not done before)  | 
 | 72 | +    1. Upload the signed binaries, *.tar.gz and *.pkg artifacts  | 
 | 73 | +    1. Signed binaries are in bintray/build/signed  | 
 | 74 | +    1. Publish the Github release  | 
 | 75 | +13. Submit a PR to update the homebrew formula in https://github.com/Homebrew/homebrew-core/blob/master/Formula/crystal.rb .  | 
 | 76 | +    1. Update the previous and new version (with their respective hashes).  | 
 | 77 | +    1. Try locally `$ brew install --build-from-source <source of formula>`  | 
 | 78 | +    1. Create PR  | 
 | 79 | +14. Update crystal-website  | 
 | 80 | +    1. Post a release notes in the website  | 
 | 81 | +    1. Update information of `latest_release` in https://github.com/crystal-lang/crystal-website/blob/master/_config.yml  | 
 | 82 | +    1. Update link to blog in https://github.com/crystal-lang/crystal-website/blob/5905e5644fcb4863976d0ca69856edbd74091370/index.html#L26  | 
 | 83 | +15. Post announcement in https://forum.crystal-lang.org/c/news/official  | 
 | 84 | +16. Tweet about the release  | 
 | 85 | +17. Post in Reddit  | 
 | 86 | +18. Update crystal repo to use released version  | 
 | 87 | +   * Edit PREVIOUS_CRYSTAL_BASE_URL in `.circleci/config.yml`  | 
 | 88 | +   * Edit DOCKER_TEST_PREFIX in `bin/ci`  | 
 | 89 | +   * Edit `prepare_build` on_osx download package and folder  | 
 | 90 | +   * Edit ` .github/workflows/win.yml` to point to docker image  | 
 | 91 | +   * Edit `shell.nix` `latestCrystalBinary` using  `nix-prefetch-url --unpack <url>`  | 
 | 92 | +19. Increment VERSION file to the next minor and -dev suffix  | 
 | 93 | +20. Perform uncomment/todos left in the repo  | 
 | 94 | +21. Update carc.in / play.crystal-lang.org (by jhass)  | 
 | 95 | +    Note: This is done after Arch repos are updated  | 
 | 96 | + | 
 | 97 | +## Observable Helper  | 
 | 98 | + | 
 | 99 | +Build changelog lines  | 
 | 100 | +https://observablehq.com/d/035be530d554ccdf  | 
 | 101 | + | 
 | 102 | +Check commit history  | 
 | 103 | +https://observablehq.com/d/4937e5db876fe1d4  | 
0 commit comments