Skip to content

Release Crystal 1.16.2 #361

Closed
Closed
@straight-shoota

Description

@straight-shoota

Release preparation

  1. Prepare the changelog entry: crystal:scripts/github-changelog.cr Changelog for 1.16.2 crystal#15716
  2. Start preparing release notes
  3. Publish release PR draft
    • It should be populated with updates to CHANGELOG.md, src/VERSION and the version in shard.yml.
  4. Ensure that test-ecosystem functions and succeeds on master

Release process (on 2025-04-29)

Source release

  1. Finalize the release PR
    • Make sure all changes are mentioned in the changelog
    • Check release date
    • Un-draft the PR
  2. Verify Maintenance CI workflow succeeds on the HEAD of the release branch
  3. Smoke test with test-ecosystem
  4. Merge the release PR
  5. Make the release and publish it on GitHub: ../distribution-scripts/processes/scripts/make-crystal-release.sh (run from crystallang/[email protected] work tree). This performs these steps:
    1. Tag & annotate the commit with the changelog using <M.m.p> pattern as version
    • git tag -s -a -m 1.16.2 1.16.2
    • git push --tags
    1. Publish Github release (https://github.com/crystal-lang/crystal/releases/new)
      • Copy the changelog section as description
      • Binaries are added later
  6. Close milestone (https://github.com/crystal-lang/crystal/milestones)
  7. Wait for the release build in circle CI (https://app.circleci.com/pipelines/github/crystal-lang/crystal)

Binary releases

  1. Publish build artifacts from CircleCI and GitHub Actions to GitHub release. For URL_TO_CIRCLECI_ARTIFACT grab the URL
    of any of the build artifacts in circleCI (doesn't matter which).
  2. Push changes to OBS for building linux packages
    1. Checkout https://github.com/crystal-lang/distribution-scripts and go to ./packages
    2. Configure build.opensuse.org credentials in environment variables:
      • export OBS_USER=
      • export OBS_PASSWORD=
    3. Update the crystal1.16 package: ./obs-release.sh devel:languages:crystal crystal1.16 1.16.2
    4. Now OBS builds the packages. It’s best to follow the build status in the browser:
      1. open https://build.opensuse.org/project/show/home:$OBS_USER:branches:devel:langauges:crystal/crystal
      2. Wait for all package build jobs to finish and succeed
    5. When everything is green, create a submit request against the original packages (Submit package link in the menu bar on the package in your branch)
    6. Verify package installation
      • OBS_PROJECT=devel:languages:crystal bats test
  3. Tag latest docker images
    • Versioned docker images have been pushed to dockerhub.
    • Now just assign the latest tags:
    • ./docker/apply-latest-tags.sh 1.16.2
  4. Publish snap package
  5. 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

  1. Publish API docs
    1. Have AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY env variables defined
    2. Run make -C docs publish_docs dist-redirect_latest CRYSTAL_VERSION=1.16.2 to publish docs to api/1.16.2 and apply redirect from api/latest to api/1.16.2

Release announcements

  1. Publish release notes on the website
  2. Post announcement in https://forum.crystal-lang.org/c/news/official
  3. Announce on social media accounts (via Buffer; credentials are in Passbolt) and pin release posts
  4. Update https://github.com/crystal-lang/crystal-book/blob/master/crystal-version.txt

Post-release

  1. Update crystal master branch to use released version: crystal:scripts/release-update.sh 1.16.2
    • 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/*.yml to point to docker image
    • Edit shell.nix latestCrystalBinary using nix-prefetch-url --unpack <url>
  2. Update default base version in test-ecosystem: test-ecosystem:scripts/release-update.sh 1.16.2
  3. Merge release/1.16 branch into master (if the two have diverged) Merge release/1.16 into master crystal#15729
  • This needs to be a merge commit. Those are disabled in the GitHub UI.
  • Create branch and PR:
    git fetch upstream release/1.16 master
    git switch -c merge/1.16.2 upstream/master
    git merge upstream/release/1.16
    # resolve conflicts
    git commit -m 'Merge `release/1.16` into master'
    git log --graph --decorate --pretty=oneline --abbrev-commit
    git push -u upstream merge/1.16.2
    gh pr create --title 'Merge `release/1.16` into master' --label 'topic:infrastructure'
  • Merge PR locally:
    git switch master
    git merge --ff-only merge/1.16.2
    # 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-only merge will fail. Then you can
    first rebase merge/1.16.2 on current master with git rebase master --rebase-merges.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions