name: Release new version on: workflow_dispatch: secrets: CARGO_REGISTRY_TOKEN: required: true env: RUST_BACKTRACE: 1 CARGO_TERM_COLOR: always jobs: create-release: name: Create release runs-on: ubuntu-latest if: github.ref == 'refs/heads/main' steps: - name: Checkout uses: actions/checkout@v3 with: persist-credentials: true - name: Install rust uses: actions-rs/toolchain@v1 with: toolchain: stable profile: minimal override: true - uses: Swatinem/rust-cache@v2 # Determine which version we're about to publish, so we can tag it appropriately. # If the tag already exists, then we've already published this version. - name: Determine current version id: version-check run: | # Fail on first error, on undefined variables, and on errors in pipes. set -euo pipefail export VERSION="$(cargo metadata --format-version 1 | \ jq --arg crate_name cargo_metadata --exit-status -r \ '.packages[] | select(.name == $crate_name) | .version')" echo "version=$VERSION" >> $GITHUB_OUTPUT if [[ "$(git tag -l "$VERSION")" != '' ]]; then echo "Aborting: Version $VERSION is already published, we found its tag in the repo." exit 1 fi - name: Semver-check uses: obi1kenobi/cargo-semver-checks-action@v2 with: rust-toolchain: manual # we've already installed Rust, don't install a new one - name: Publish run: cargo publish env: CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} - name: Tag the version run: | # Fail on first error, on undefined variables, and on errors in pipes. set -euo pipefail git tag "${{ steps.version-check.outputs.version }}" git push origin "${{ steps.version-check.outputs.version }}" - uses: taiki-e/create-gh-release-action@v1 name: Create GitHub release with: branch: main ref: refs/tags/${{ steps.version-check.outputs.version }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}