-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Make the release workflow more resilient (#4728)
## Summary Currently, it is possible to create a tag and then have the release fail, which is a problem since we can't edit the tag (#4468). This change the release process so that the tag is created inside the release workflow. This leaves as a failure mode that we have published to pypi but then creating the tag or GitHub release doesn't work, but in this case we can restart and the pypi upload is just skipped because we use the skip existing option. The release workflow is started by a workflow dispatch with the tag instead of creating the tag yourself. You can start the release workflow without a tag to do a dry run which does not publish an artifacts. You can optionally add a git sha to the workflow run and it will verify that the release runs on the mentioned commit. This also adds docs on how to release and a small style improvement for the maturin integration. ## Test Plan Testing is hard since we can't do real releases, i've tested a minimized workflow in a separate dummy repository.
- Loading branch information
Showing
3 changed files
with
70 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,8 +2,17 @@ name: "[ruff] Release" | |
|
||
on: | ||
workflow_dispatch: | ||
release: | ||
types: [ published ] | ||
inputs: | ||
tag: | ||
description: "The version to tag, without the leading 'v'. If omitted, will initiate a dry run skipping uploading artifact." | ||
type: string | ||
sha: | ||
description: "Optionally, the full sha of the commit to be released" | ||
type: string | ||
push: | ||
paths: | ||
# When we change pyproject.toml, we want to ensure that the maturin builds still work | ||
- pyproject.toml | ||
|
||
concurrency: | ||
group: ${{ github.workflow }}-${{ github.ref }} | ||
|
@@ -394,7 +403,8 @@ jobs: | |
- linux-cross | ||
- musllinux | ||
- musllinux-cross | ||
if: "startsWith(github.ref, 'refs/tags/')" | ||
# If you don't set an input it's a dry run skipping uploading artifact | ||
if: ${{ inputs.tag }} | ||
environment: | ||
name: release | ||
permissions: | ||
|
@@ -403,11 +413,34 @@ jobs: | |
# For GitHub release publishing | ||
contents: write | ||
steps: | ||
- name: Consistency check tag | ||
run: | | ||
version=$(grep "version = " pyproject.toml | sed -e 's/version = "\(.*\)"/\1/g') | ||
if [ "${{ inputs.tag }}" != "${version}" ]; then | ||
echo "The input tag does not match the version from pyproject.toml:" >&2 | ||
echo "${{ inputs.tag }}" >&2 | ||
echo "${version}" >&2 | ||
exit 1 | ||
else | ||
echo "Releasing ${version}" | ||
fi | ||
- name: Consistency check sha | ||
if: ${{ inputs.sha }} | ||
run: | | ||
git_sha=$(git rev-parse HEAD) | ||
if [ "${{ inputs.sha }}" != "${git_sha}" ]; then | ||
echo "The specified sha does not match the git checkout" >&2 | ||
echo "${{ inputs.sha }}" >&2 | ||
echo "${git_sha}" >&2 | ||
exit 1 | ||
else | ||
echo "Releasing ${git_sha}" | ||
fi | ||
- uses: actions/download-artifact@v3 | ||
with: | ||
name: wheels | ||
path: wheels | ||
- name: "Publish to PyPi" | ||
- name: Publish to PyPi | ||
uses: pypa/gh-action-pypi-publish@release/v1 | ||
with: | ||
skip-existing: true | ||
|
@@ -417,10 +450,20 @@ jobs: | |
with: | ||
name: binaries | ||
path: binaries | ||
- name: git tag | ||
run: | | ||
git config user.email "[email protected]" | ||
git config user.name "Ruff Release CI" | ||
git tag -m "v${{ inputs.tag }}" "v${{ inputs.tag }}" | ||
# If there is duplicate tag, this will fail. The publish to pypi action will have been a noop (due to skip | ||
# existing), so we make a non-destructive exit here | ||
git push --tags | ||
- name: "Publish to GitHub" | ||
uses: softprops/action-gh-release@v1 | ||
with: | ||
draft: true | ||
files: binaries/* | ||
tag_name: v${{ inputs.tag }} | ||
|
||
# After the release has been published, we update downstream repositories | ||
# This is separate because if this fails the release is still fine, we just need to do some manual workflow triggers | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters