From ada5db05ffdf4b7ec979cc6b14c90856f23f8979 Mon Sep 17 00:00:00 2001 From: Jonathan LEI Date: Mon, 3 Jul 2023 07:05:39 +0000 Subject: [PATCH] ci: crate release workflow --- .github/workflows/release.yml | 119 ++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..d37f513c --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,119 @@ +on: + push: + tags: + - "starknet/v*.*.*" + - "starknet-*/v*.*.*" + +name: "Release" + +jobs: + crate-info: + name: "Extract crate info" + runs-on: "ubuntu-latest" + outputs: + crate: ${{ steps.derive.outputs.crate }} + version: ${{ steps.derive.outputs.version }} + + steps: + - id: "derive" + name: "Derive crate info from Git tag" + run: | + FULL_REF="${{ github.ref }}" + REGEX="^refs\/tags\/([a-z\\-]*)\/v(.*)$" + [[ $FULL_REF =~ $REGEX ]]; + + echo "crate=${BASH_REMATCH[1]}" >> $GITHUB_OUTPUT + echo "version=${BASH_REMATCH[2]}" >> $GITHUB_OUTPUT + + # Just in case we accidentally release something not on master. + commit-branch-check: + name: "Check commit branch" + runs-on: "ubuntu-latest" + needs: ["crate-info"] + + steps: + - name: "Checkout source code" + uses: "actions/checkout@v3" + with: + fetch-depth: 0 + + - name: "Check if commit is on master" + run: | + COMMIT_HASH=$(git log -1 --format=%H ${{ github.ref }}) + GREP_OUTPUT=$(git log origin/master --format=%H | grep "$COMMIT_HASH") + + if [ -z "$GREP_OUTPUT" ]; then + echo "Cannot release commits not on the master branch" + exit 1 + fi + + crate-version-check: + name: "Check crate version" + runs-on: "ubuntu-latest" + needs: ["crate-info"] + + steps: + - name: "Checkout source code" + uses: "actions/checkout@v3" + + - name: "Check against Cargo.toml" + run: | + if [ "starknet" != "${{ needs.crate-info.outputs.crate }}" ]; then + cd ${{ needs.crate-info.outputs.crate }} + fi + + GREP_OUTPUT=$(cat Cargo.toml | grep "^version = \"${{ needs.crate-info.outputs.version }}\"$") + + if [ -z "$GREP_OUTPUT" ]; then + echo "Crate version mismatch" + exit 1 + fi + + build: + name: "Build for ${{ matrix.os }}" + runs-on: "${{ matrix.os }}" + needs: ["crate-info"] + + strategy: + matrix: + os: + - "ubuntu-latest" + - "windows-latest" + - "macos-latest" + + steps: + - name: "Checkout source code" + uses: "actions/checkout@v3" + + - name: "Setup stable toolchain" + uses: "actions-rs/toolchain@v1" + with: + toolchain: "stable" + profile: "minimal" + override: true + + - name: "Build crate" + run: | + cargo build --package ${{ needs.crate-info.outputs.crate }} --all-targets + + crates-io-release: + name: "Release to crates.io" + runs-on: "ubuntu-latest" + + needs: + - "crate-info" + - "commit-branch-check" + - "crate-version-check" + - "build" + + steps: + - name: "Checkout source code" + uses: "actions/checkout@v3" + + - name: "Login to crates.io" + run: | + cargo login ${{ secrets.CRATES_IO_API_TOKEN }} + + - name: "Public crate" + run: | + cargo publish --package ${{ needs.crate-info.outputs.crate }}