From 22bcfbdf3c705599f3701cd16016ae90a2983dc0 Mon Sep 17 00:00:00 2001 From: Igor Aleksanov Date: Wed, 4 Sep 2024 12:08:28 +0400 Subject: [PATCH] feat(ci): Introduce release-please and automatic publishing --- .github/release-please/config.json | 12 +++ .github/release-please/manifest.json | 3 + .../release-please-prepare-branch.yaml | 70 +++++++++++++++ .github/workflows/release-please.yaml | 90 +++++++++++++++++++ 4 files changed, 175 insertions(+) create mode 100644 .github/release-please/config.json create mode 100644 .github/release-please/manifest.json create mode 100644 .github/workflows/release-please-prepare-branch.yaml create mode 100644 .github/workflows/release-please.yaml diff --git a/.github/release-please/config.json b/.github/release-please/config.json new file mode 100644 index 0000000..43b430b --- /dev/null +++ b/.github/release-please/config.json @@ -0,0 +1,12 @@ +{ + "bootstrap-sha": "f7866247c9cdd0431211b267d2507e8cc2aaf4dd", + "include-component-in-tag": false, + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": true, + "packages": { + ".": { + "component": "zksync-crypto", + "release-type": "simple" + } + } +} diff --git a/.github/release-please/manifest.json b/.github/release-please/manifest.json new file mode 100644 index 0000000..d25a501 --- /dev/null +++ b/.github/release-please/manifest.json @@ -0,0 +1,3 @@ +{ + ".": "0.28.0" +} diff --git a/.github/workflows/release-please-prepare-branch.yaml b/.github/workflows/release-please-prepare-branch.yaml new file mode 100644 index 0000000..afbc1ab --- /dev/null +++ b/.github/workflows/release-please-prepare-branch.yaml @@ -0,0 +1,70 @@ +on: + push: + branches: + - release-please--branches--main--components--zksync-crypto + +env: + EXPECTED_COMMIT_MESSAGE: "Update version in Cargo.toml" + CARGO_TERM_COLOR: "always" + CARGO_INCREMENTAL: "0" + # Rust version to use. + nightly: nightly-2024-08-01 + +name: release-please-update-versions +jobs: + check_state: + name: "release-please: Check if Cargo.toml is updated" + runs-on: [ubuntu-latest] + outputs: + already_committed: ${{ steps.condition.outputs.already_committed }} + + steps: + - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4 + + - name: Check last commit + id: condition + run: | + COMMIT=$(git log -1 --pretty=%B) + if [[ "$COMMIT" == "$EXPECTED_COMMIT_MESSAGE" ]]; then + echo "Cargo.lock is already updated" + echo "already_committed=true" >> "$GITHUB_OUTPUT" + else + echo "Cargo.lock should be updated" + echo "already_committed=false" >> "$GITHUB_OUTPUT" + fi + + update_version: + runs-on: [ubuntu-latest] + name: "release-please: Update version in Cargo.toml" + needs: [check_state] + if: ${{ needs.check_state.outputs.already_committed != 'true' }} + steps: + - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4 + with: + persist-credentials: false + + - name: Install Rust + uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + toolchain: ${{ env.nightly }} + components: rustfmt, clippy + # Remove default `-D warnings`. This is a temporary measure. + rustflags: "" + + # cargo-workspaces fails to update versions in some cases. + - name: Install cargo-edit + run: cargo install cargo-edit + + - name: Bump version + run: | + NEW_VERSION=$(cat .github/release-please/manifest.json | jq -r '."."') + cargo-set-version set-version $NEW_VERSION --workspace + + - name: Push changes + run: | + git config --global user.email "zksync-era-bot@users.noreply.github.com" + git config --global user.name "zksync-era-bot" + git remote set-url origin 'https://${{ secrets.RELEASE_TOKEN }}@github.com/matter-labs/zksync-crypto.git' + git add ./Cargo.toml + git commit -m "$EXPECTED_COMMIT_MESSAGE" + git push diff --git a/.github/workflows/release-please.yaml b/.github/workflows/release-please.yaml new file mode 100644 index 0000000..d0486d8 --- /dev/null +++ b/.github/workflows/release-please.yaml @@ -0,0 +1,90 @@ +on: + push: + branches: + - main + workflow_dispatch: + +env: + CARGO_TERM_COLOR: "always" + CARGO_INCREMENTAL: "0" + RUSTC_WRAPPER: "sccache" + SCCACHE_GHA_ENABLED: "true" + # Rust version to use. + nightly: nightly-2024-08-01 + +permissions: + contents: write + pull-requests: write + +name: release-please +jobs: + release-please: + runs-on: ubuntu-latest + outputs: + releases_created: ${{ steps.release.outputs.releases_created }} + release_please_output_json: ${{ toJSON(steps.release.outputs) }} + steps: + - name: Run release-please + id: release + uses: googleapis/release-please-action@7987652d64b4581673a76e33ad5e98e3dd56832f # v4.1.3 + with: + token: ${{ secrets.RELEASE_TOKEN }} + config-file: .github/release-please/config.json + manifest-file: .github/release-please/manifest.json + + - name: Show outputs + env: + OUTPUTS: ${{ toJSON(steps.release.outputs) }} + run: echo "$OUTPUTS" + + process-release: + runs-on: [ubuntu-22.04-github-hosted-16core] + needs: [release-please] + if: ${{ needs.release-please.outputs.releases_created == 'true' }} + steps: + - name: Checkout code + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4 + + - name: Install Rust + uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + toolchain: ${{ env.nightly }} + # Remove default `-D warnings`. This is a temporary measure. + rustflags: "" + + - name: Install sccache + uses: mozilla-actions/sccache-action@v0.0.4 + + - name: Install cargo-workspaces + run: cargo install cargo-workspaces + + - name: Build each package separately + run: cargo ws exec cargo build + + - name: Login to crates.io + run: cargo login ${{ secrets.CRATES_IO_TOKEN }} + + - name: Publish + run: cargo ws publish --publish-as-is --allow-dirty + + - name: Set owners for new packages + # `cargo owner --add` fails if the package is already owned by the same entity, + # so we have to check if the package is already owned by the organization. + run: | + ORG_OWNER=github:matter-labs:crates-io + for PKG in $(cargo ws list); do + cargo owner --list --quiet $PKG | grep $ORG_OWNER || cargo owner --add $ORG_OWNER $PKG + done + + - name: Send Release Info + uses: matter-labs/format-release-please-for-slack-action@69e6fe9e4ec531b7b5fb0d826f73c190db83cf42 # v2.1.0 + with: + release-please-output: ${{ needs.release-please.outputs.release_please_output_json }} + slack-webhook-url: ${{ secrets.SLACK_WEBHOOK_RELEASES }} + + - name: Notify about failure + if: failure() + uses: matter-labs/format-release-please-for-slack-action@69e6fe9e4ec531b7b5fb0d826f73c190db83cf42 # v2.1.0 + with: + release-please-output: '{ "body": "⚠️ Failed to publish the release" }' + slack-webhook-url: ${{ secrets.SLACK_WEBHOOK_RELEASES }}