-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* ci: Update release workflow * fix: Enforce `major.minor` version only for initial release * fix: Use full `major.minor.patch` for `Cargo.toml` and tag
- Loading branch information
1 parent
4837ee4
commit 8601da5
Showing
2 changed files
with
79 additions
and
18 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
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -10,6 +10,8 @@ on: | |
- hotfix | ||
required: true | ||
default: 'release' | ||
# NOTE: For a `release` branch, only specify the `major.minor` version. This branch will be persistent across patches, | ||
# so any patch number specified in this case will be dropped. For a hotfix, specify the full `major.minor.patch` version | ||
version: | ||
description: 'Version' | ||
required: true | ||
|
@@ -22,18 +24,50 @@ jobs: | |
CRATES: './aptos/aptos-programs,./aptos/core,./aptos/light-client,./aptos/programs/inclusion,./aptos/programs/epoch-change,./aptos/proof-server' | ||
|
||
steps: | ||
- name: Git config | ||
run: | | ||
git config --global user.name "github-actions[bot]" | ||
git config --global user.email "github-actions[bot]@users.noreply.github.com" | ||
git config --global url."https://${{ secrets.REPO_TOKEN }}@github.com/".insteadOf ssh://[email protected] | ||
git config --global url."https://${{ secrets.REPO_TOKEN }}@github.com".insteadOf https://github.com | ||
- name: Checkout code | ||
uses: actions/checkout@v4 | ||
|
||
# The `release/1.0` branch is always truncated, so that patch version merges still are valid Semver | ||
# However, when we make the initial `release/1.0` version bump, we include the full `1.0.0` in `Cargo.toml` | ||
# and the release for clarity | ||
- name: Set branches | ||
run: | | ||
BASE_VERSION_SHORT=$(echo "${{ inputs.version }}" | cut -d'.' -f1-2) | ||
BASE_VERSION="${BASE_VERSION_SHORT}.0" | ||
if [[ "${{ inputs.type }}" == "hotfix" ]]; then | ||
VERSION=${{ inputs.version }} | ||
BASE_BRANCH="release/$BASE_VERSION_SHORT" | ||
PR_BRANCH="${{ inputs.type }}/${{ inputs.version }}" | ||
git checkout ${{ env.PR_BRANCH }} | ||
else | ||
VERSION=$BASE_VERSION | ||
BASE_BRANCH="main" | ||
PR_BRANCH="release/$BASE_VERSION_SHORT" | ||
git checkout -b ${{ env.PR_BRANCH }} | ||
fi | ||
echo "BASE_BRANCH=$BASE_BRANCH" | tee -a $GITHUB_ENV | ||
echo "PR_BRANCH=$PR_BRANCH" | tee -a $GITHUB_ENV | ||
echo "PR_DESCRIPTION=chore: Release $VERSION" | tee -a $GITHUB_ENV | ||
echo "VERSION=$VERSION" | tee -a $GITHUB_ENV | ||
# Regex from https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string | ||
- name: Validate version | ||
run: | | ||
echo "Validating version ${{ github.event.inputs.version }}..." | ||
echo "Validating version ${{ env.VERSION }}..." | ||
D='0|[1-9][0-9]*' | ||
PW='[0-9]*[a-zA-Z-][0-9a-zA-Z-]*' | ||
MW='[0-9a-zA-Z-]+' | ||
if [[ "${{ github.event.inputs.version }}" =~ ^($D)\.($D)\.($D)(-(($D|$PW)(\.($D|$PW))*))?(\+($MW(\.$MW)*))?$ ]]; then | ||
echo "Version ${{ github.event.inputs.version }} is valid." | ||
if [[ "${{ env.VERSION }}" =~ ^($D)\.($D)\.($D)(-(($D|$PW)(\.($D|$PW))*))?(\+($MW(\.$MW)*))?$ ]]; then | ||
echo "Version ${{ env.VERSION }} is valid." | ||
else | ||
echo "Version is not valid SemVer. Aborting..." | ||
exit 1 | ||
|
@@ -46,19 +80,33 @@ jobs: | |
for path in "${CRATE_PATHS[@]}"; do | ||
cd $path | ||
OLD_VERSION=$(grep -oP 'version = "\K[^"]+' Cargo.toml) | ||
if [[ "${{ inputs.version }}" > "$OLD_VERSION" ]]; then | ||
sed -i 's/version = "'$OLD_VERSION'"/version = "${{ inputs.version }}"/' Cargo.toml | ||
if [[ "${{ env.VERSION }}" > "$OLD_VERSION" ]]; then | ||
sed -i 's/version = "'$OLD_VERSION'"/version = "${{ env.VERSION }}"/' Cargo.toml | ||
else | ||
echo "New version is not greater than the current version for $path. Aborting..." | ||
exit 1 | ||
fi | ||
cd $GITHUB_WORKSPACE | ||
done | ||
- name: Commit changes | ||
run: | | ||
git add . | ||
git commit -m "${{ env.PR_DESCRIPTION }}" | ||
git push origin ${{ env.PR_BRANCH }} | ||
# Note: Can't use `peter-evans/create-pull-request` because for hotfixes we need to make the PR with an existing branch | ||
# The former always creates a new one for single-commit PRs, thus overwriting the actual hotfix | ||
- name: Create PR | ||
run: | | ||
cat << 'EOF' > body.md | ||
This is an automated release PR for version `${ env.VERSION }}`. | ||
On merge, this will trigger the [release publish workflow](${{ github.server_url }}/${{ github.repository }}/actions/workflows/tag-release.yml), which will upload a new GitHub release with tag `${{ env.VERSION }}`. | ||
[Workflow run](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) | ||
EOF | ||
- name: Create Pull Request | ||
uses: peter-evans/create-pull-request@v5 | ||
with: | ||
title: "${{ inputs.type == 'release' && 'Release' || 'Hotfix' }} ${{ inputs.version }}" | ||
branch: "${{ inputs.type }}/${{ inputs.version }}" | ||
commit-message: "chore: ${{ inputs.type == 'release' && 'release' || 'hotfix' }} ${{ inputs.version }}" | ||
base: ${{ github.ref }} | ||
gh pr create --title "${{ env.PR_DESCRIPTION }}" --body-file ./body.md --head ${{ env.PR_BRANCH }} --base ${{ env.BASE_BRANCH }} | ||
env: | ||
GH_TOKEN: ${{ github.token }} |
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 |
---|---|---|
|
@@ -15,16 +15,28 @@ jobs: | |
((startsWith(github.event.pull_request.head.ref, 'release/') && github.event.pull_request.base.ref == 'dev') || | ||
(startsWith(github.event.pull_request.head.ref, 'hotfix/') && startsWith(github.event.pull_request.base.ref, 'release/'))) | ||
runs-on: ubuntu-latest | ||
|
||
steps: | ||
- name: Git config | ||
run: | | ||
git config --global user.name "github-actions[bot]" | ||
git config --global user.email "github-actions[bot]@users.noreply.github.com" | ||
git config --global url."https://${{ secrets.REPO_TOKEN }}@github.com/".insteadOf ssh://[email protected] | ||
git config --global url."https://${{ secrets.REPO_TOKEN }}@github.com".insteadOf https://github.com | ||
- name: Checkout code | ||
uses: actions/checkout@v4 | ||
|
||
- name: Get version | ||
id: get-version | ||
run: | | ||
VERSION=$(echo "${{ github.event.pull_request.head.ref }}" | cut -d'/' -f 2) | ||
echo "version=${VERSION}" >> "$GITHUB_OUTPUT" | ||
RELEASE_BRANCH="${{ startsWith(github.event.pull_request.head.ref, 'release/') && github.event.pull_request.head.ref || github.event.pull_request.base.ref }}" | ||
git tag -a $VERSION -m "$VERSION" $RELEASE_BRANCH | ||
git push origin $VERSION -f | ||
echo "version=$VERSION" | tee -a "$GITHUB_OUTPUT" | ||
echo "RELEASE_BRANCH=$RELEASE_BRANCH" | tee -a "$GITHUB_ENV" | ||
- name: Build Changelog | ||
id: github_release | ||
|
@@ -35,8 +47,9 @@ jobs: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
|
||
- name: Create Release | ||
uses: softprops/action-gh-release@v2 | ||
uses: ncipollo/release-action@v1 | ||
with: | ||
body: ${{steps.github_release.outputs.changelog}} | ||
tag_name: ${{ steps.get-version.outputs.version }} | ||
target_commitish: ${{ startsWith(github.event.pull_request.head.ref, 'release/') && github.event.pull_request.head.ref || github.event.pull_request.base.ref }} | ||
body: ${{ steps.github_release.outputs.changelog }} | ||
tag: ${{ steps.get-version.outputs.version }} | ||
commit: ${{ env.RELEASE_BRANCH }} | ||
allowUpdates: true |