You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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/crystal
open https://build.opensuse.org/package/show/home:$OBS_USER:branches:devel:languages:crystal/crystal1.21
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.
crystal
crystal1.21
(optional) Verify package installation
(distribution-scripts/packages) OBS_PROJECT=devel:languages:crystal bats test
Tag latest docker images
Versioned docker images have been pushed to Docker Hub.
Run (distribution-scripts) make -C docs publish_docs release_latest_docs CRYSTAL_VERSION=1.21.0 to publish docs to api/1.21.0, apply redirect from api/latest to api/1.21.0 and set the 404 error page
Publish Crystal book
Make sure release/1.20 branch is merged into master (if not, create a PR; it needs to be merged as a merge commit)
Create release/1.21 branch and push it to crystal-lang/crystal-book (deployment happens automatically in GHA)
Verify that deployment was successful
Release announcements
Publish release notes on the website
Make sure all links to API docs point to /api/1.21.0/
Insert number of changes and contributors
Wait for website to build, then visit the release notes page. This should
create a thread for comments on the forum.
Add tag release
Replace content with link to release notes (this should insert a preview card)
Publish the topic ("List topic" in the wrench icon)
Announce on social media accounts (via Buffer; credentials are in Passbolt) and pin release posts
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-only merge will fail. Then you can
first rebase merge/1.21.0 on current master with git rebase master --rebase-merges.
Release preparation
crystal)scripts/update-changelog.sh 1.21.0from the HEAD of the release branch (ormaster) (Changelog for 1.21.0 crystal#17095)is:pr is:merged sort:updated-desc no:milestone).is:pr is:merged sort:updated-desc no:label milestone:1.21.0).Due dateset.crystal-lang/crystal-website(summary of changes that are most relevant for users)masteror split off release branch for backporting bugfixes.CHANGELOG.md,src/VERSIONand the version inshard.yml.master(uses nightly build)Release process (on 2026-07-16)
Source release
release/1.21frommasterto trigger Maintenance CIbranch: https://app.circleci.com/pipelines/github/crystal-lang/crystal?branch=release%2F1.21
crystal=branch:release/1.21.crystal)../distribution-scripts/processes/scripts/make-crystal-release.sh(run fromcrystallang/crystal@1.21.0work tree). This performs these steps:<M.m.p>pattern as versiongit tag -s -a -m 1.21.0 1.21.0git push --tagsrelease/1.21tomaster@1.21.0Binary releases
distribution-scripts)./processes/scripts/download-crystal-release-artifacts.sh $VERSION. This performs these steps:crystal-*-darwin-*.tar.gzcrystal-*-linux-*.tar.gzcrystal-*.pkgcrystal-*-docs.tar.gzcrystal/*->crystal-1.21.0-windows-x86_64-msvc-unsupported.zipcrystal-installer/crystal-setup.exe->crystal-1.21.0-windows-x86_64-msvc-unsupported.exe*-mingw-w64-crystal/*->crystal-1.21.0-windows-*-gnu-unsupported.zipdistribution-scripts)gh release -R crystal-lang/crystal upload 1.21.0 crystal-1.21.0*./packagesexport OBS_USER=export OBS_PASSWORD=crystalpackage: (distribution-scripts)./obs-release.sh devel:languages:crystal crystal 1.21.0crystallang/oscto run the CLI client for OBS.osc build xUbuntu_20.04 x86_64osc build Fedora_Rawhide x86_64crystal1.21package: (distribution-scripts)./obs-new-minor.sh devel:languages:crystal crystal1.21 1.21.0 crystal1.20open 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.21packages: Submit package link in the page actions (left sidebar) in your branch.
crystalcrystal1.21distribution-scripts/packages)OBS_PROJECT=devel:languages:crystal bats testlatestdocker imageslatesttags:distribution-scripts)./docker/apply-latest-tags.sh 1.21.0latest/edgerelease tolatest/betaand thenlatest/stablePublish documentation for the release
AWS_ACCESS_KEY_IDandAWS_SECRET_ACCESS_KEYenv variables defineddistribution-scripts)make -C docs publish_docs release_latest_docs CRYSTAL_VERSION=1.21.0to publish docs toapi/1.21.0, apply redirect fromapi/latesttoapi/1.21.0and set the 404 error pagerelease/1.20branch is merged intomaster(if not, create a PR; it needs to be merged as a merge commit)release/1.21branch and push it tocrystal-lang/crystal-book(deployment happens automatically in GHA)Release announcements
/api/1.21.0/create a thread for comments on the forum.
releasePost-release
masterbranch to use released version:(
crystal)scripts/release-update.sh 1.21.0.circleci/config.ymlbin/ciprepare_buildon_osx download package and folder.github/workflows/*.ymlto point to docker imageshell.nixlatestCrystalBinaryusingnix-prefetch-url --unpack <url>infra/release-update. Commit message:Update previous Crystal release 1.21.0src/VERSIONand version inshard.ymlto the next minor plus-devsuffixrelease/1.21branch intomaster(if the two have diverged)This needs to be a merge commit. Those are disabled in the GitHub UI.
Create branch and PR:
Merge PR locally:
git switch master git merge --ff-only merge/1.21.0 # double check history git log --graph --decorate --pretty=oneline --abbrev-commit git pushGitHub branch protection rules normally prevent direct pushes to
master. This needs to be deactivated for this purpose, which can be on aper-user basis.
In case master has diverged,
--ff-onlymerge will fail. Then you canfirst rebase
merge/1.21.0on current master withgit rebase master --rebase-merges.