name: release
on:
workflow_dispatch:
permissions:
contents: write
concurrency:
group: release
cancel-in-progress: false
jobs:
checks:
uses: ./.github/workflows/checks.yml
with:
network-tests: true
ref: master
secrets:
curseforge-api-key: ${{ secrets.CURSEFORGE_API_KEY }}
prepare:
needs: checks
runs-on: ubuntu-latest
outputs:
release: ${{ steps.version.outputs.release }}
tag: ${{ steps.version.outputs.tag }}
steps:
- uses: actions/checkout@v6
with:
ref: master
fetch-depth: 0
fetch-tags: true
- name: check version
id: version
shell: bash
run: |
set -euo pipefail
version=$(cargo metadata --no-deps --format-version 1 | jq -r '.packages[] | select(.name == "rmcl") | .version')
mapfile -t versions < <(git tag --list 'v*' --sort=-v:refname | sed -nE 's/^v([0-9]+\.[0-9]+\.[0-9]+([-+][0-9A-Za-z.-]+)?)$/\1/p')
latest=${versions[0]:-}
tag="v${version}"
release=false
if [[ -z "$latest" ]] || [[ "$version" != "$latest" && "$(printf '%s\n%s\n' "$latest" "$version" | sort -V | tail -n1)" == "$version" ]]; then
release=true
fi
echo "release=$release" >> "$GITHUB_OUTPUT"
echo "tag=$tag" >> "$GITHUB_OUTPUT"
if [[ "$release" == true ]]; then
echo "releasing $tag (latest release: ${latest:-none})"
else
echo "Cargo.toml version $version is not newer than latest release v$latest; nothing to release"
fi
- name: create tag
if: steps.version.outputs.release == 'true'
env:
TAG: ${{ steps.version.outputs.tag }}
run: |
git config user.name github-actions[bot]
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
git tag --annotate "$TAG" --message "Release $TAG"
git push origin "$TAG"
publish:
needs: prepare
if: needs.prepare.outputs.release == 'true'
uses: ./.github/workflows/build-release.yml
with:
tag: ${{ needs.prepare.outputs.tag }}
secrets: inherit
permissions:
contents: write