Add hotfixing workflow

This commit is contained in:
lepapareil 2022-11-10 16:17:29 +01:00
parent fb96c252cf
commit fc6e6b57b9
No known key found for this signature in database
GPG Key ID: F4F06B068FB00692
4 changed files with 127 additions and 112 deletions

View File

@ -128,10 +128,9 @@ jobs:
comment="✅ Github release ${tag_version} is published."
echo " - ${comment}"
else
comment="❌ Github release ${tag_version} is still in draft/prerelease. Please publish it before trying to merge this release PR."
comment="⚠ Github release ${tag_version} is still in draft/prerelease. Please don't forget to publish it after merging this release PR."
echo " - ${comment}"
gh pr comment "${PR_NUMBER}" --body "${comment}"
exit 1
fi
fi
@ -247,7 +246,7 @@ jobs:
- accept-pull-request
name: update-branch-version
if: needs.accept-pull-request.outputs.is_a_github_release_pr == 'true' && contains(github.event.comment.body, '--release')
uses: Orange-OpenSource/hurl/.github/workflows/update-branch-version.yml@master
uses: ./.github/workflows/update-branch-version.yml
with:
new_version: ${{ needs.accept-pull-request.outputs.new_version_master_snapshot_version }}
branch: ${{ needs.accept-pull-request.outputs.base_ref }}
@ -272,3 +271,4 @@ jobs:
- name: release-final-comment
run: |
gh pr comment "${{ github.event.issue.number }}" --body "✅ New PR [${{ needs.update-branch-version.outputs.pr_number }}](${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/pull/${{ needs.update-branch-version.outputs.pr_number }}) created to update master branch to ${{ needs.accept-pull-request.outputs.new_version_master_snapshot_version }} version"

View File

@ -3,8 +3,8 @@ name: release
on:
workflow_dispatch:
inputs:
control-release-version:
description: 'Control release version'
set-release-version:
description: 'Set release version (x.y.z)'
required: true
type: string
create-release-branch:
@ -21,7 +21,7 @@ on:
concurrency: release
jobs:
control-release:
set-context:
if: github.event.inputs.create-release-branch == 'true'
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
@ -29,48 +29,44 @@ jobs:
outputs:
release_version: ${{ steps.set-release-version.outputs.release_version }}
release_branch: ${{ steps.set-release-branch.outputs.release_branch }}
name: control-release
name: set-context
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
ref: master
- name: Check trigger branch
run: |
if [ "${{ github.ref_name }}" == "master" ] ; then
echo " - ✅ The branch triggering this workflow is master."
if [ $(echo "${{ github.ref_name }}" | grep -Ec "^master$|^release/") -eq 1 ] ; then
echo " - ✅ The branch triggering this workflow is ${{ github.ref_name }}."
else
echo " - ❌ The branch triggering this workflow is ${{ github.ref_name }} instead of master."
echo " - ❌ The branch triggering this workflow is ${{ github.ref_name }} instead of master or release/[0-9].[0-9].[0-9] ."
exit 1
fi
- name: Set release version
id: set-release-version
run: |
actual_version=$(grep -E "^version" packages/hurl/Cargo.toml | cut --delimiter "=" --field 2 | tr -d '" ')
echo "actual_version=${actual_version}" | tee -a $GITHUB_OUTPUT
release_version=$(echo "${actual_version}" | cut --delimiter "-" --field 1)
echo "release_version=${release_version}" | tee -a $GITHUB_OUTPUT
echo "release_version=${{ github.event.inputs.set-release-version }}" | tee -a $GITHUB_OUTPUT
- name: Set release branch
id: set-release-branch
run: |
echo "release_branch=release/${{ steps.set-release-version.outputs.release_version }}" | tee -a $GITHUB_OUTPUT
if [ $(echo "${{ github.ref_name }}" | grep -c "^release/") -eq 1 ] ; then
echo "release_branch=${{ github.ref_name }}" | tee -a $GITHUB_OUTPUT
else
echo "release_branch=release/${{ github.event.inputs.set-release-version }}" | tee -a $GITHUB_OUTPUT
fi
- name: Control release version
run: |
if [ "${{ github.event.inputs.control-release-version }}" == "${{ steps.set-release-version.outputs.release_version }}" ] ; then
echo " - ✅ Desired release version ${{ github.event.inputs.control-release-version }} equals version ${{ steps.set-release-version.outputs.release_version }} getted from package/hurl/Cargo.toml on master."
if [ "${{ github.event.inputs.set-release-version }}" == "${{ steps.set-release-version.outputs.release_version }}" ] ; then
echo " - ✅ Desired release version ${{ github.event.inputs.set-release-version }} equals version ${{ steps.set-release-version.outputs.release_version }} getted from package/hurl/Cargo.toml on ${{ github.ref_name }}."
else
echo " - ❌ Desired release version ${{ github.event.inputs.control-release-version }} do not equals version ${{ steps.set-release-version.outputs.release_version }} getted from package/hurl/Cargo.toml on master."
echo " - ❌ Desired release version ${{ github.event.inputs.set-release-version }} do not equals version ${{ steps.set-release-version.outputs.release_version }} getted from package/hurl/Cargo.toml on ${{ github.ref_name }}."
exit 1
fi
clean-release:
if: github.event.inputs.create-release-branch == 'true'
needs: control-release
needs: set-context
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@ -79,13 +75,11 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
ref: master
- name: Check release pull request existence
id: check-release-pull-request-existence
run: |
actual_pr_number=$(gh pr list --repo "${{ github.repository }}" --head "${{ needs.control-release.outputs.release_branch }}" --state "open" --json number --jq .[].number)
actual_pr_number=$(gh pr list --repo "${{ github.repository }}" --head "${{ needs.set-context.outputs.release_branch }}" --state "open" --json number --jq .[].number)
actual_pr_number=${actual_pr_number:-0}
echo "actual_pr_number=${actual_pr_number}" | tee -a "${GITHUB_OUTPUT}"
if [ ${actual_pr_number} -eq 0 ] ; then
@ -114,72 +108,73 @@ jobs:
id: check-github-release-existence
run: |
gh release list || true
escaped_version=$(echo "${{ needs.control-release.outputs.release_version }}" | sed "s#\.#\\\.#g")
escaped_version=$(echo "${{ needs.set-context.outputs.release_version }}" | sed "s#\.#\\\.#g")
github_release_exists=$(gh release list | (grep -c "${escaped_version}" || true))
if [ ${github_release_exists} -eq 0 ] ; then
echo " - ✅ Github release ${{ needs.control-release.outputs.release_version }} does not exist."
echo " - ✅ Github release ${{ needs.set-context.outputs.release_version }} does not exist."
echo "github_release_exists=false" | tee -a $GITHUB_OUTPUT
else
echo " - ✅ Github release ${{ needs.control-release.outputs.release_version }} already exists on remote."
echo " - ✅ Github release ${{ needs.set-context.outputs.release_version }} already exists on remote."
echo "github_release_exists=true" | tee -a $GITHUB_OUTPUT
fi
- name: Delete github release
if: steps.check-github-release-existence.outputs.github_release_exists == 'true'
run: |
gh release delete ${{ needs.control-release.outputs.release_version }} --yes && gh_exit_code=0 || gh_exit_code=$?
gh release delete ${{ needs.set-context.outputs.release_version }} --yes && gh_exit_code=0 || gh_exit_code=$?
if [ ${gh_exit_code} -eq 0 ] ; then
echo " - ✅ ${{ needs.control-release.outputs.release_version }} github release deleted."
echo " - ✅ ${{ needs.set-context.outputs.release_version }} github release deleted."
else
echo " - ❌ A problem occurs when attempting to delete ${{ needs.control-release.outputs.release_version }} github release."
echo " - ❌ A problem occurs when attempting to delete ${{ needs.set-context.outputs.release_version }} github release."
exit 1
fi
- name: Check tag existence
id: check-tag-existence
run: |
escaped_version=$(echo "${{ needs.control-release.outputs.release_version }}" | sed "s#\.#\\\.#g")
escaped_version=$(echo "${{ needs.set-context.outputs.release_version }}" | sed "s#\.#\\\.#g")
tag_exists=$(git ls-remote --tags | (grep -c "${escaped_version}" || true))
if [ ${tag_exists} -eq 0 ] ; then
echo " - ✅ The origin/${{ needs.control-release.outputs.release_version }} tag does not exists on remote."
echo " - ✅ The origin/${{ needs.set-context.outputs.release_version }} tag does not exists on remote."
echo "release_tag_exists=false" | tee -a $GITHUB_OUTPUT
else
echo " - ✅ The origin/${{ needs.control-release.outputs.release_version }} tag already exists on remote."
echo " - ✅ The origin/${{ needs.set-context.outputs.release_version }} tag already exists on remote."
echo "release_tag_exists=true" | tee -a $GITHUB_OUTPUT
fi
- name: Delete release tag
if: steps.check-tag-existence.outputs.release_tag_exists == 'true'
run: |
git push origin --delete ${{ needs.control-release.outputs.release_version }} && git_exit_code=0 || git_exit_code=$?
git push origin --delete ${{ needs.set-context.outputs.release_version }} && git_exit_code=0 || git_exit_code=$?
if [ ${git_exit_code} -eq 0 ] ; then
echo " - ✅ ${{ needs.control-release.outputs.release_version }} tag deleted."
echo " - ✅ ${{ needs.set-context.outputs.release_version }} tag deleted."
else
echo " - ❌ A problem occurs when attempting to delete ${{ needs.control-release.outputs.release_version }} tag."
echo " - ❌ A problem occurs when attempting to delete ${{ needs.set-context.outputs.release_version }} tag."
exit 1
fi
- name: Check branch existence
id: check-branch-existence
- name: Check release branch existence
id: check-release-branch-existence
if: github.ref_name == 'master'
run: |
escaped_version=$(echo "${{ needs.control-release.outputs.release_version }}" | sed "s#\.#\\\.#g")
escaped_version=$(echo "${{ needs.set-context.outputs.release_version }}" | sed "s#\.#\\\.#g")
branch_exists=$(git ls-remote | (grep -c "${escaped_version}" || true))
if [ ${branch_exists} -eq 0 ] ; then
echo " - ✅ The origin/${{ needs.control-release.outputs.release_branch }} branch does not exists on remote."
echo " - ✅ The origin/${{ needs.set-context.outputs.release_branch }} branch does not exists on remote."
echo "release_branch_exists=false" | tee -a $GITHUB_OUTPUT
else
echo " - ✅ The origin/${{ needs.control-release.outputs.release_branch }} branch already exists on remote."
echo " - ✅ The origin/${{ needs.set-context.outputs.release_branch }} branch already exists on remote."
echo "release_branch_exists=true" | tee -a $GITHUB_OUTPUT
fi
- name: Delete release branch
if: steps.check-branch-existence.outputs.release_branch_exists == 'true'
if: github.ref_name == 'master' && steps.check-release-branch-existence.outputs.release_branch_exists == 'true'
run: |
git push origin --delete ${{ needs.control-release.outputs.release_branch }} && git_exit_code=0 || git_exit_code=$?
git push origin --delete ${{ needs.set-context.outputs.release_branch }} && git_exit_code=0 || git_exit_code=$?
if [ ${git_exit_code} -eq 0 ] ; then
echo " - ✅ ${{ needs.control-release.outputs.release_branch }} branch deleted."
echo " - ✅ ${{ needs.set-context.outputs.release_branch }} branch deleted."
else
echo " - ❌ A problem occurs when attempting to delete ${{ needs.control-release.outputs.release_branch }} branch."
echo " - ❌ A problem occurs when attempting to delete ${{ needs.set-context.outputs.release_branch }} branch."
exit 1
fi
@ -187,7 +182,7 @@ jobs:
if: github.event.inputs.create-release-branch == 'true'
needs:
- clean-release
- control-release
- set-context
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@ -196,25 +191,24 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
ref: master
- name: Create release branch
if: github.ref_name == 'master'
id: create-release-branch
run: |
git checkout -b "${{ needs.control-release.outputs.release_branch }}"
git push origin "${{ needs.control-release.outputs.release_branch }}" && git_exit_code=0 || git_exit_code=$?
git checkout -b "${{ needs.set-context.outputs.release_branch }}"
git push origin "${{ needs.set-context.outputs.release_branch }}" && git_exit_code=0 || git_exit_code=$?
if [ ${git_exit_code} -eq 0 ] ; then
echo " - ✅ ${{ needs.control-release.outputs.release_branch }} branch created."
echo " - ✅ ${{ needs.set-context.outputs.release_branch }} branch created."
else
echo " - ❌ A problem occurs when attempting to create ${{ needs.control-release.outputs.release_branch }} branch."
echo " - ❌ A problem occurs when attempting to create ${{ needs.set-context.outputs.release_branch }} branch."
exit 1
fi
- name: Checkout new release branch
uses: actions/checkout@v3
with:
ref: ${{ needs.control-release.outputs.release_branch }}
ref: ${{ needs.set-context.outputs.release_branch }}
- name: Init git credentials
run: |
@ -226,13 +220,13 @@ jobs:
hurl_packages="hurl_core hurl hurlfmt"
for package in ${hurl_packages} ; do
cargo_toml="packages/${package}/Cargo.toml"
sed -i "s/^version.*/version = \"${{ needs.control-release.outputs.release_version }}\"/" "${cargo_toml}"
sed -i "s/^version.*/version = \"${{ needs.set-context.outputs.release_version }}\"/" "${cargo_toml}"
echo "----------------------------"
echo " > package version for ${cargo_toml}"
echo " $(grep "^version =" "${cargo_toml}")"
for dep_package in ${hurl_packages} ; do
if [ $(grep -c "^${dep_package} =" "${cargo_toml}") -gt 0 ] ; then
sed -i "s/^${dep_package} = { version .*/${dep_package} = { version = \"${{ needs.control-release.outputs.release_version }}\", path = \"..\/${dep_package}\" }/" "${cargo_toml}"
sed -i "s/^${dep_package} = { version .*/${dep_package} = { version = \"${{ needs.set-context.outputs.release_version }}\", path = \"..\/${dep_package}\" }/" "${cargo_toml}"
echo " > ${dep_package} dep package version for ${cargo_toml}"
echo " $(grep "^${dep_package} =" "${cargo_toml}")"
fi
@ -248,8 +242,8 @@ jobs:
version_doc="docs/installation.md"
old_version=$(grep "sudo dpkg -i" "${version_doc}" | cut --delimiter "_" --field 2 )
echo "old_version=${old_version}"
sed -i "s/${old_version}/${{ needs.control-release.outputs.release_version }}/g" "${version_doc}"
grep "${{ needs.control-release.outputs.release_version }}" "${version_doc}"
sed -i "s/${old_version}/${{ needs.set-context.outputs.release_version }}/g" "${version_doc}"
grep "${{ needs.set-context.outputs.release_version }}" "${version_doc}"
- name: Update man
run: |
@ -265,12 +259,12 @@ jobs:
- name: Push create release commits
run: |
git commit -am "Create ${{ needs.control-release.outputs.release_version }} release"
git commit -am "Create ${{ needs.set-context.outputs.release_version }} release"
git push && git_exit_code=0 || git_exit_code=$?
if [ ${git_exit_code} -eq 0 ] ; then
echo " - ✅ commits pushed to ${{ needs.control-release.outputs.release_branch }}."
echo " - ✅ commits pushed to ${{ needs.set-context.outputs.release_branch }}."
else
echo " - ❌ A problem occurs when attempting to push create relase commits to ${{ needs.control-release.outputs.release_branch }} branch."
echo " - ❌ A problem occurs when attempting to push create relase commits to ${{ needs.set-context.outputs.release_branch }} branch."
exit 1
fi
@ -280,18 +274,18 @@ jobs:
with:
name: release-changelog
path: |
release_changelog.md
release_changelog.md
package-release:
needs:
- set-context
- clean-release
- control-release
- create-release-branch
name: package-release
if: github.event.inputs.deliver-github-release == 'true'
uses: Orange-OpenSource/hurl/.github/workflows/package.yml@master
uses: ./.github/workflows/package.yml
with:
branch: ${{ needs.control-release.outputs.release_branch }}
branch: ${{ needs.set-context.outputs.release_branch }}
deliver-github-release:
env:
@ -299,8 +293,8 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
REPO: ${{ github.repository }}
needs:
- set-context
- clean-release
- control-release
- create-release-branch
- package-release
name: deliver-github-release
@ -310,7 +304,7 @@ jobs:
- name: Checkout new release branch
uses: actions/checkout@v3
with:
ref: ${{ needs.control-release.outputs.release_branch }}
ref: ${{ needs.set-context.outputs.release_branch }}
- name: Init git credentials
run: |
@ -322,34 +316,34 @@ jobs:
- name: Push tag
run: |
git tag -a ${{ needs.control-release.outputs.release_version }} -m "Release ${{ needs.control-release.outputs.release_version }}"
git tag -a ${{ needs.set-context.outputs.release_version }} -m "Release ${{ needs.set-context.outputs.release_version }}"
git tag -n
git push --tags && git_exit_code=0 || git_exit_code=$?
if [ ${git_exit_code} -eq 0 ] ; then
echo " - ✅ ${{ needs.control-release.outputs.release_version }} tag created."
echo " - ✅ ${{ needs.set-context.outputs.release_version }} tag created."
git fetch
else
echo " - ❌ A problem occurs when attempting to create ${{ needs.control-release.outputs.release_version }} tag."
echo " - ❌ A problem occurs when attempting to create ${{ needs.set-context.outputs.release_version }} tag."
exit 1
fi
- name: Deliver release
run: |
cat CHANGELOG.md | python3 bin/release/changelog_extract.py ${{ needs.control-release.outputs.release_version }} > release_changelog.md
gh release create ${{ needs.control-release.outputs.release_version }} \
--target ${{ needs.control-release.outputs.release_branch }} \
cat CHANGELOG.md | python3 bin/release/changelog_extract.py ${{ needs.set-context.outputs.release_version }} > release_changelog.md
gh release create ${{ needs.set-context.outputs.release_version }} \
--target ${{ needs.set-context.outputs.release_branch }} \
--notes-file release_changelog.md \
--title ${{ needs.control-release.outputs.release_version }} \
--title ${{ needs.set-context.outputs.release_version }} \
--draft \
artifacts/release-deb-x64-artifacts/hurl_"${{ needs.control-release.outputs.release_version }}"_amd64.deb \
artifacts/release-generic-linux-x64-artifacts/hurl-"${{ needs.control-release.outputs.release_version }}"-x86_64-linux.tar.gz \
artifacts/release-macos-x64-artifacts/hurl-"${{ needs.control-release.outputs.release_version }}"-x86_64-macos.tar.gz \
artifacts/release-windows-x64-artifacts/hurl-"${{ needs.control-release.outputs.release_version }}"-win64-installer.exe \
artifacts/release-windows-x64-artifacts/hurl-"${{ needs.control-release.outputs.release_version }}"-win64.zip && gh_exit_code=0 || gh_exit_code=$?
artifacts/release-deb-x64-artifacts/hurl_"${{ needs.set-context.outputs.release_version }}"_amd64.deb \
artifacts/release-generic-linux-x64-artifacts/hurl-"${{ needs.set-context.outputs.release_version }}"-x86_64-linux.tar.gz \
artifacts/release-macos-x64-artifacts/hurl-"${{ needs.set-context.outputs.release_version }}"-x86_64-macos.tar.gz \
artifacts/release-windows-x64-artifacts/hurl-"${{ needs.set-context.outputs.release_version }}"-win64-installer.exe \
artifacts/release-windows-x64-artifacts/hurl-"${{ needs.set-context.outputs.release_version }}"-win64.zip && gh_exit_code=0 || gh_exit_code=$?
if [ ${gh_exit_code} -eq 0 ] ; then
echo " - ✅ Github release ${{ needs.control-release.outputs.release_version }} created."
echo " - ✅ Github release ${{ needs.set-context.outputs.release_version }} created."
else
echo " - ❌ A problem occurs when attempting to create github release ${{ needs.control-release.outputs.release_version }}."
echo " - ❌ A problem occurs when attempting to create github release ${{ needs.set-context.outputs.release_version }}."
exit 1
fi
@ -358,16 +352,15 @@ jobs:
GITHUB_TOKEN=${{ secrets.LEPAPAREIL_CI_TOKEN }}
{
echo "⚠ This is a github releasing PR."
echo "- Please \`/accept\` this PR only when github release ${{ needs.control-release.outputs.release_version }} is published"
echo "- Please use \`/accept --release\` if you want to automatically update master branch to next SNAPSHOT version"
} > file-body.txt
gh pr create \
--title "Merge Github ${{ needs.control-release.outputs.release_branch }} into master" \
--title "Merge Github ${{ needs.set-context.outputs.release_branch }} into ${{ github.ref_name }}" \
--body-file file-body.txt \
--base master \
--label bot && gh_exit_code=0 || gh_exit_code=$?
if [ ${gh_exit_code} -eq 0 ] ; then
new_pr_number=$(gh pr list --repo "${{ github.repository }}" --head "${{ needs.control-release.outputs.release_branch }}" --state "open" --json number --jq .[].number)
new_pr_number=$(gh pr list --repo "${{ github.repository }}" --head "${{ needs.set-context.outputs.release_branch }}" --state "open" --json number --jq .[].number)
echo " - ✅ Creation of pull request n°${new_pr_number} succeeds."
else
echo " - ❌ A problem occurs when attempting to create new pull request."

View File

@ -4,7 +4,7 @@ on:
workflow_dispatch:
inputs:
new_version:
description: 'Version (Major.Minor.Patch or Major.Minor.Patch-SNASPHOT)'
description: 'Version (x.y.z-SNASPHOT)'
required: true
type: string
workflow_call:
@ -14,7 +14,7 @@ on:
required: true
inputs:
new_version:
description: "Version (Major.Minor.Patch or Major.Minor.Patch-SNASPHOT)"
description: "Version (x.y.z-SNASPHOT)"
required: true
type: string
branch:

View File

@ -1,33 +1,55 @@
# Releasing Process
We are starting with current version x.y.0-snapshot (in Cargo.toml).
Releasing a new version of Hurl will create a release M.m.0
and update master to M.(m+1).0-snapshot
## Steps
0. Create branch/PR release/M.m.0
1. Update CHANGELOG from Issues/PR
2. Update Cargo.toml (x3) remove -snapshot suffix and Cargo.lock
3. Update version in docs/installations.md
4. Regenerate man pages and README
5. Commit
6. Tag M.n.0
7. Create GitHub Release
8. Copy Changelog and upload artifacts
9. Merge (Fast forward) release branch to master
10. Increase Version in Cargo.toml to M.(m+1).0-snapshot
11. Commit
12. Upload packages to external package managers
We always have to start with current version x.y.0-snapshot (in all Cargo.toml).
## CHANGELOG
- Issues are grouped into Changes (Enhancement) and Bug Fixes.
- Use description from PR (starts with a verb)
- Add link(s) to related issue(s)
- Add enhancement or Bug label to the issue
- Add target milestone to the issue
- Use a well formatted description on PR (starts with a verb)
- Add link(s) to the issue
## Release steps
- Run `release.yml` workflow on `master` branch, it will:
- Clean pending release
- Create new `release/x.y.0` branch
- Checkout this new branch
- Update all toml with `x.y.0`
- Update all crate with `x.y.0`
- Update man and docs with `x.y.0`
- Generate CHANGELOG
- Commit all updates
- Create the `x.y.0` tag
- Create draft github release `x.y.0`
- Create PR from `release/x.y.0` to `master`
- You have to `/accept --release` this PR, it will:
- Merge fast-forward this PR
- Open a new one to update `master` files to next version `x.y+1.0-SNAPSHOT`
## Hotfix steps
- Create a new branch `release/x.y.z` from desired tag `x.y.0`, for example `release/1.8.1` from tag `1.8.0`
- Run `update-branch-version.yml` workflow on the new branch filling version field with `x.y.z-SNAPSHOT`, for example `1.8.1-SNAPSHOT` for `release/1.8.1` branch
- Run release.yml workflow on `release/x.y.z` branch, it will:
- Clean pending release
- Checkout `release/x.y.z` branch
- Update all toml with `x.y.z`
- Update all crate with `x.y.z`
- Update man and docs with `x.y.z`
- Generate CHANGELOG
- Commit all updates
- Create the `x.y.z` tag
- Create draft github release `x.y.z`
- Create PR from `release/x.y.z` to `master`
- You have to manually `merge` as a revert rebase to reorder commits between this new hotfix and master
- Run `update-branch-version.yml` workflow on `master` to restore actual dev version to `x.y+1.0-SNAPSHOT`, for example from `1.8.1` to `1.9.0-SNAPSHOT`
## Additional
- push source packages (checkout tag) to crates.io
- push package to chocolatey
- push package to winget
- push package to docker
- push package to brew
- push source packages to crates.io