- Submit a Freeze/Release PR
- It should contain the expected date of the release (~two weeks after the PR is issued).
- It should be populated with updates to CHANGELOG.md and VERSION.
- Verify Maintenance CI in the parent commit of the changelog succeed
- This mean either the commit was the one used for nightly build or,
- A branch with
release/
prefix orci
word was pushed
- Check the artifacts pass the ecosystem test
- Grab latest copy of https://github.com/crystal-lang/test-ecosystem
- Override branches of projects if needed at ./scripts/10-clone-repos.sh
- Set
./crystal-versions.env
with the URL of the artifacts and with the docker image - Use the different make targets described in the
./README
- Merge the Changelog PR
- Tag & annotate the commit with the changelog using
<M.m.p>
pattern as {version} (as a pre-release directly in GH?) - Wait for the build
- Smoke test with test-ecosystem
- Push changes to OBS for building linux packages
- Checkout https://github.com/crystal-lang/distribution-scripts
- Grab the urls (or local path) of the artifacts from circle-ci
crystal-*-linux-x86_64.tar.gz
crystal-*-linux-i686.tar.gz
crystal-*-docs.tar.gz
- Follow ./packages/README.md in distribution-scripts
- The following steps should run in an openSUSE distribution with osc installed (https://github.com/crystal-lang/osc-docker)
- Configure build.opensuse.org credentials in ~/.oscrc
osc branchco devel:languages:crystal crystal
cd home\:$OBS_USERNAME\:branches\:devel\:languages\:crystal/crystal
- Copy the updated build artifact tarballs in place
- Update version in package specifications:
VERSION=1.1.0 # or whatever version you’re releasing sed -i -e "s/^Version: .*/Version: ${VERSION}-1/" *.dsc sed -i -e "s/^Version: .*/Version: ${VERSION}/" *.spec
- Verify the changes with
osc diff
- Update changelog:
osc vc -m “Update devel:languages:crystal to $VERSION
- Commit changes:
osc commit -m “Update devel:languages:crystal to $VERSION
- 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
- 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)
- Build and publish docker images
- Checkout https://github.com/crystal-lang/crystal-dist
$ ./dist.sh build-docker {version}
$ ./dist.sh push-docker {version}
- Manually push the
crystallang/crystal:{version}
image ascrystallang/crystal:latest
$ docker tag crystallang/crystal:{version} crystallang/crystal:latest
$ docker push crystallang/crystal:latest
- Manually build and push alpine images
- Go to distribution-scripts/docker
$ make clean alpine DOCKER_REPOSITORY=crystallang/crystal DOCKER_TAG={version} CRYSTAL_VERSION={version} CRYSTAL_TARGZ=~/Downloads/crystal-{version}-1-linux-x86_64.tar.gz
$ docker push crystallang/crystal:{version}-alpine
$ docker push crystallang/crystal:{version}-alpine-build
$ docker tag crystallang/crystal:{version}-alpine crystallang/crystal:latest-alpine
$ docker push crystallang/crystal:latest-alpine
- Publish docs
- Have s3cmd installed and AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY env variables defined
$ source /Volumes/Secured/secure/manas-aws-key-crystal-dist.sh
- Checkout https://github.com/crystal-lang/crystal-dist
- Download
*-docs.tar.gz
from circle-ci artifacts $ ./dist.sh push-docs {version} path/to/crystal-{version}-docs.tar.gz
$ ./dist.sh update-docs-versions {crystal_working_copy}
$ ./dist.sh redirect-docs {version}
- Publish snap package
- You need to logged in via
$ snapcraft login
- Recent tagged release is published directly to edge channel. The CI logs the snap revision number. Otherwise the .snap file is in the artifacts.
- Check the current status to find the revision of the tagged release otherwise:
$ snapcraft status crystal
$ snapcraft release crystal <revision-number> beta
$ snapcraft release crystal <revision-number> stable
- You need to logged in via
- Build Github release
- Copy the changelog as release notes in the tag (if not done before)
- Upload the signed binaries, *.tar.gz and *.pkg artifacts
- Signed binaries are in bintray/build/signed
- Publish the Github release
- Submit a PR to update the homebrew formula in https://github.com/Homebrew/homebrew-core/blob/master/Formula/crystal.rb .
- Update the previous and new version (with their respective hashes).
- Try locally
$ brew install --build-from-source <source of formula>
- Create PR
- Update crystal-website
- Post a release notes in the website
- Update information of
latest_release
in https://github.com/crystal-lang/crystal-website/blob/master/_config.yml - Update link to blog in https://github.com/crystal-lang/crystal-website/blob/5905e5644fcb4863976d0ca69856edbd74091370/index.html#L26
- Post announcement in https://forum.crystal-lang.org/c/news/official
- Tweet about the release
- Post in Reddit
- Update crystal repo to use released version
- Edit PREVIOUS_CRYSTAL_BASE_URL in
.circleci/config.yml
- Edit DOCKER_TEST_PREFIX in
bin/ci
- Edit
prepare_build
on_osx download package and folder - Edit
.github/workflows/win.yml
to point to docker image - Edit
shell.nix
latestCrystalBinary
usingnix-prefetch-url --unpack <url>
- Increment VERSION file to the next minor and -dev suffix
- Perform uncomment/todos left in the repo
- Update carc.in / play.crystal-lang.org (by jhass) Note: This is done after Arch repos are updated
Build changelog lines https://observablehq.com/d/035be530d554ccdf
Check commit history https://observablehq.com/d/4937e5db876fe1d4