From 21762dcf15242684e9afb4deeff2d613dc62b7f5 Mon Sep 17 00:00:00 2001 From: Mauro Ezequiel Moltrasio Date: Wed, 13 May 2026 18:20:28 +0200 Subject: [PATCH] feat(ci): add basic release workflows Since the repository has some pretty strict rules about pushing certain branches, we need to define some basic workflows that will allow us to push them via a robot account. While we are at it, we are also automating some of the additional steps needed for updating and pinning versions TODO: update release.md --- .github/workflows/prepare-release.yml | 168 ++++++++++++++++++++++++++ .github/workflows/release.yml | 60 +++++++++ 2 files changed, 228 insertions(+) create mode 100644 .github/workflows/prepare-release.yml create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml new file mode 100644 index 00000000..3922a867 --- /dev/null +++ b/.github/workflows/prepare-release.yml @@ -0,0 +1,168 @@ +name: Prepare Release Branch + +on: + workflow_dispatch: + inputs: + version: + description: | + The release version in . format. + required: true + type: string + next-version: + description: | + The . version that will be used for the next + release. + required: true + type: string + rust-version: + description: | + The Rust version that will be used for the new release branch. + required: true + type: string + dry-run: + description: Do not push anything + default: true + type: boolean + +jobs: + validate-version: + runs-on: ubuntu-24.04 + steps: + - name: Validate release versions + run: | + function validate_version() { + name="$1" + version="$2" + + if [[ ! "$version" =~ ^([[:digit:]]+)\.([[:digit:]]+)$ ]] ; then + echo >&2 "Invalid $name $version. The expected format is ." + exit 1 + fi + } + + validate_version "version" ${{ inputs.version }} + validate_version "next-version" ${{ inputs.next-version }} + validate_version "rust-version" ${{ inputs.rust-version }} + + prepare-release-branch: + runs-on: ubuntu-24.04 + needs: + - validate-version + steps: + - uses: actions/checkout@v6 + with: + submodules: false + ref: main + token: ${{ secrets.RHACS_BOT_GITHUB_TOKEN }} + + - name: Initialize mandatory git config + run: | + git config user.name "${{ github.event.sender.login }}" + git config user.email noreply@github.com + + - name: Create internal tag and release-${{ inputs.version }} branch + run: | + git checkout main + git pull --ff-only + git tag "${{ inputs.version }}.x" + git checkout -b "release-${{ inputs.version }}" + + - name: Push internal tag and release-${{ inputs.version }} branch + if: ${{ ! inputs.dry-run }} + run: | + git push origin "${{ inputs.version }}.x" + git push --set-upstream origin "release-${{ inputs.version }}" + + pin-rust-version: + runs-on: ubuntu-24.04 + needs: + - validate-version + - prepare-release-branch + steps: + - uses: actions/checkout@v6 + with: + submodules: false + ref: release-${{ inputs.version }} + token: ${{ secrets.RHACS_BOT_GITHUB_TOKEN }} + + - name: Pin Rust version + run: | + sed -i -e "s/^RUST_VERSION .*/RUST_VERSION ?= ${{ inputs.rust-version }}/" \ + constants.mk + + - name: Update fact version + run: | + sed -i \ + -e "/^version = / s/\".*\"/\"${{ inputs.version}}.0\"/" \ + fact/Cargo.toml + + cargo update -p fact + + - name: Print git diff for validation + run: | + git diff + + - name: Create Pull Request + if: ${{ ! inputs.dry-run }} + uses: peter-evans/create-pull-request@v8 + with: + token: '${{ secrets.RHACS_BOT_GITHUB_TOKEN }}' + commit-message: 'chore: pin Rust version and update fact version' + committer: '${{ secrets.RHACS_BOT_GITHUB_USERNAME }} <${{ secrets.RHACS_BOT_GITHUB_EMAIL }}>' + author: '${{ secrets.RHACS_BOT_GITHUB_USERNAME }} <${{ secrets.RHACS_BOT_GITHUB_EMAIL }}>' + branch: chore/pin-rust-update-version-${{ inputs.version }} + signoff: false + delete-branch: true + title: 'chore: pin Rust version and update fact version' + body: | + Pin Rust version to ${{ inputs.rust-version }} and update fact to version ${{ inputs.version }} + team-reviewers: | + collector-team + draft: false + + update-version: + runs-on: ubuntu-24.04 + needs: + - validate-version + steps: + - uses: actions/checkout@v6 + with: + submodules: false + ref: main + token: ${{ secrets.RHACS_BOT_GITHUB_TOKEN }} + + - name: Update CHANGELOG.md + run: | + sed -i \ + -e "s/^## Next/&\n\n## ${{ inputs.version }}.0/" \ + CHANGELOG.md + + - name: Update fact version + run: | + sed -i \ + -e "/^version = / s/\".*\"/\"${{ inputs.next-version }}.0-dev\"/" \ + fact/Cargo.toml + + cargo update -p fact + + - name: Print git diff for validation + run: | + git diff + + - name: Create Pull Request + if: ${{ ! inputs.dry-run }} + uses: peter-evans/create-pull-request@v8 + with: + token: '${{ secrets.RHACS_BOT_GITHUB_TOKEN }}' + commit-message: 'chore: update CHANGELOG.md and fact version' + committer: '${{ secrets.RHACS_BOT_GITHUB_USERNAME }} <${{ secrets.RHACS_BOT_GITHUB_EMAIL }}>' + author: '${{ secrets.RHACS_BOT_GITHUB_USERNAME }} <${{ secrets.RHACS_BOT_GITHUB_EMAIL }}>' + branch: chore/update-changelog-fact-${{ inputs.next-version }}-dev + signoff: false + delete-branch: true + title: 'chore(docs): Update CHANGELOG.md and fact version' + body: | + Cut the CHANGELOG.md changes and update fact to version ${{ inputs.next-version }}-dev + team-reviewers: | + collector-team + draft: false diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..445cabc5 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,60 @@ +name: Release new version + +on: + workflow_dispatch: + inputs: + version: + description: | + The release version in . format. + required: true + type: string + dry-run: + description: Do not push anything + default: true + type: boolean + +jobs: + release: + runs-on: ubuntu-24.04 + env: + VERSION: ${{ inputs.version }} + steps: + - uses: actions/checkout@v6 + with: + submodules: true + fetch-depth: 0 + ref: release-${{ inputs.version }} + token: ${{ secrets.RHACS_BOT_GITHUB_TOKEN }} + + - name: Determine patch version + id: patch + run: | + last_tag="$(git describe --tags --abbrev=0)" + + if [[ "$last_tag" =~ ^"${VERSION}"\.x$ ]]; then + patch=0 + elif [[ "$last_tag" =~ ^"${VERSION}"\.([[:digit:]]+)$ ]]; then + patch=$((BASH_REMATCH[1] + 1)) + else + echo >&2 "Failed to determine patch version for ${VERSION}" + echo >&2 "Last tag found: $last_tag" + exit 1 + fi + + echo "patch=$patch" >> "$GITHUB_OUTPUT" + + - name: Initialize mandatory git config + run: | + git config user.name "${{ github.event.sender.login }}" + git config user.email noreply@github.com + + - name: Create release tag + env: + PATCH: ${{ steps.patch.outputs.patch }} + run: | + git tag -a -m "fact v${VERSION}.${PATCH} release" "${RELEASE}.${PATCH}" + + - name: Push tag + if: ${{ ! inputs.dry-run }} + run: | + git push origin "${VERSION}.${PATCH}"