-
-
Notifications
You must be signed in to change notification settings - Fork 24
Closed
Labels
Description
Release preparation
- Announce expected release date (2026-01-14) and time span for feature freeze (starting on 2025-12-31)
- Feature freeze is about two weeks before release
- https://forum.crystal-lang.org/t/upcoming-1-19-release/8598
- Set date on the milestone
- Prepare the changelog entry: (
crystal)scripts/update-changelog.cr 1.19.0from the HEAD of the release branch (ormaster)- Ensure that all merged PRs are added to the milestone (check
is:pr is:merged sort:updated-desc no:milestone). - Ensure that all milestoned PRs are properly labelled (check
is:pr is:merged sort:updated-desc no:label milestone:1.19.0). - Ensure the milestone has
Due dateset.
- Ensure that all merged PRs are added to the milestone (check
- Start preparing release notes, publish draft in
crystal-lang/crystal-website(summary of changes that are most relevant for users) - Start feature freeze period (on 2025-12-31)
- Either no merging of features into
masteror split off release branch for backporting bugfixes.
- Either no merging of features into
- Publish release PR draft
- It should contain the expected date of the release.
- It should be populated with updates to
CHANGELOG.md,src/VERSIONand the version inshard.yml.
- Ensure documentation for language and compiler changes and other relevant changes is up to date.
- Crystal Book
- Update language specification
- Update compiler manual
- Add or update guides / tutorials?
- Crystal Book
- Look for library updates, check and document compatibility at https://crystal-lang.org/reference/man/required_libraries.html and in lib bindings
- Ensure that test-ecosystem functions and succeeds on master
- Run CI Workflow on
master(uses nightly build)
- Run CI Workflow on
Release process (on 2026-01-14)
Source release
- Finalize the changelog PR
- Make sure all changes are mentioned in the changelog
- Check release date
- Un-draft the PR
- Split off release branch
release/1.19frommasterto trigger Maintenance CI - Verify Maintenance CI workflow succeeds on the HEAD of the release
branch: https://app.circleci.com/pipelines/github/crystal-lang/crystal?branch=release%2F1.19 - Smoke test with test-ecosystem
- Run CI Workflow with
crystal=branch:release/{VERSION%.*}.
- Run CI Workflow with
- Merge the changelog PR
- Make the release and publish it on GitHub: (
crystal)../distribution-scripts/processes/scripts/make-crystal-release.sh(run fromcrystallang/crystal@1.19.0work tree). This performs these steps:- Tag & annotate the commit with the changelog using
<M.m.p>pattern as version
git tag -s -a -m 1.19.0 1.19.0git push --tags
- Publish Github release (https://github.com/crystal-lang/crystal/releases/new)
- Copy the changelog section as description
- Binaries are added later
- Tag & annotate the commit with the changelog using
- Close milestone (https://github.com/crystal-lang/crystal/milestones)
- Wait for the release build in circle CI (https://app.circleci.com/pipelines/github/crystal-lang/crystal)
- Fast-forward
release/1.19tomaster@1.19.0
Binary releases
- Publish build artifacts from CircleCI and GitHub Actions to GitHub release. For
URL_TO_CIRCLECI_ARTIFACTgrab the URL
of any of the build artifacts in circleCI (doesn't matter which).- Upload build artifacts from CircleCI: (
crystal)../distribution-scripts/processes/scripts/publish-crystal-packages-on-github.sh $URL_TO_CIRCLECI_ARTIFACT(run fromcrystallang/crystal@1.19.0work tree)crystal-*-darwin-*.tar.gzcrystal-*-linux-*.tar.gzcrystal-*.pkgcrystal-*-docs.tar.gz
- Upload build artifacts from GHA (Windows):
- Windows CI:
crystal.zip->crystal-1.19.0-windows-x86_64-msvc-unsupported.zip - Windows CI:
crystal-installer.zip-> unzip ->crystal-1.19.0-windows-x86_64-msvc-unsupported.exe - MinGW-w64 CI:
x86_64-mingw-w64-crystal.zip->crystal-1.19.0-windows-x86_64-gnu-unsupported.zip - MinGW-w64 CI:
aarch64-mingw-w64-crystal.zip->crystal-1.19.0-windows-aarch64-gnu-unsupported.zip
- Windows CI:
- Upload build artifacts from CircleCI: (
- Publish the GitHub release
- Push changes to OBS for building linux packages
- Checkout https://github.com/crystal-lang/distribution-scripts and go to
./packages - Configure build.opensuse.org credentials in environment variables:
export OBS_USER=export OBS_PASSWORD=
- Update the
crystalpackage: (distribution-scripts)./obs-release.sh devel:languages:crystal crystal 1.19.0- Uses the docker image
crystallang/oscto run the CLI client for OBS. - The script creates a branch in you home project, updates the version and pushes it back to OBS.
- You can also run the commands from that file manually and check build locally with
osc build xUbuntu_20.04 x86_64osc build Fedora_Rawhide x86_64
- Uses the docker image
- Create the
crystal1.19package: (distribution-scripts)./obs-new-minor.sh devel:languages:crystal crystal1.19 1.19.0 crystal1.18 - Now OBS builds the packages. It’s best to follow the build status in the browser:
open https://build.opensuse.org/package/show/home:$OBS_USER:branches:devel:languages:crystal/crystalopen https://build.opensuse.org/package/show/home:$OBS_USER:branches:devel:languages:crystal/crystal1.19- Wait for all package build jobs to finish and succeed
- When everything is green, create a submit request against the original
packages: Submit package link in the page actions (left sidebar) in your branch. - (optional) Verify package installation
- (
distribution-scripts/packages)OBS_PROJECT=devel:languages:crystal bats test
- (
- Checkout https://github.com/crystal-lang/distribution-scripts and go to
- Tag
latestdocker images- Versioned docker images have been pushed to Docker Hub.
- Now just assign the
latesttags: - (
distribution-scripts)./docker/apply-latest-tags.sh 1.19.0
- Publish snap package
- On https://snapcraft.io/crystal/releases promote the
latest/edgerelease tolatest/betaand thenlatest/stable
- On https://snapcraft.io/crystal/releases promote the
- Check PR for homebrew: https://github.com/Homebrew/homebrew-core/pulls?q=is%3Apr+crystal+sort%3Aupdated-desc
- It should've been automatically created
Publish documentation for the release
- Publish API docs
- Have
AWS_ACCESS_KEY_IDandAWS_SECRET_ACCESS_KEYenv variables defined- Keys can be generated at https://console.aws.amazon.com/iam/home#/security_credentials (contact a Manas admin if you don't have access).
- Run (
distribution-scripts)make -C docs publish_docs release_latest_docs CRYSTAL_VERSION=1.19.0to publish docs toapi/1.19.0, apply redirect fromapi/latesttoapi/1.19.0and set the 404 error page - Update API docs' 404 page to add
<base href="/api/1.19.0/" />in the<head>
- Have
- Publish Crystal book
- Make sure
release/1.18branch is merged intomaster(if not, create a PR; it needs to be merged as a merge commit) - Create
release/1.19branch and push it tocrystal-lang/crystal-book(deployment happens automatically in GHA) - Verify that deployment was successful
- Make sure
Release announcements
- Publish release notes on the website
- Make sure all links to API docs point to
/api/1.19.0/ - Insert number of changes and contributers
- Make sure all links to API docs point to
- Wait for website to build, then visit the release notes page. This should
create a thread for comments on the forum. Publish that topic
("List topic" in the wrench icon) and add tagrelease. - Announce on social media accounts (via Buffer; credentials are in Passbolt) and pin release posts
- Have the project manager post the release in https://opencollective.com/crystal-lang
Post-release
- Create a pull request to update
masterbranch to use released version:
(crystal)scripts/release-update.sh 1.19.0- Edit PREVIOUS_CRYSTAL_BASE_URL in
.circleci/config.yml - Edit DOCKER_TEST_PREFIX in
bin/ci - Edit
prepare_buildon_osx download package and folder - Edit
.github/workflows/*.ymlto point to docker image - Edit
shell.nixlatestCrystalBinaryusingnix-prefetch-url --unpack <url> - Branch:
infra/release-update. Commit message:Update previous Crystal release 1.19.0
- Edit PREVIOUS_CRYSTAL_BASE_URL in
- Increment
src/VERSIONand version inshard.ymlto the next minor plus-devsuffix - Perform uncomment/todos left in the repo
- Merge
release/1.19branch intomaster(if the two have diverged)- This needs to be a merge commit. Those are disabled in the GitHub UI.
- Create branch and PR:
git fetch upstream release/1.19 master git switch -c merge/1.19.0 upstream/master git merge upstream/release/1.19 # resolve conflicts git commit -m \'Merge `release/1.19` into master\' git log --graph --decorate --pretty=oneline --abbrev-commit git push -u upstream merge/1.19.0 gh pr create --title \'Merge `release/1.19`@`%{VERSION} into `master`\' --label \'topic:infrastructure\'
- Merge PR locally:
git switch master git merge --ff-only merge/1.19.0 # double check history git log --graph --decorate --pretty=oneline --abbrev-commit git push - GitHub branch protection rules normally prevent direct pushes to
master. This needs to be deactivated for this purpose, which can be on a
per-user basis. - In case master has diverged,
--ff-onlymerge will fail. Then you can
first rebasemerge/1.19.0on current master withgit rebase master --rebase-merges.