diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..0c0abe5 --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,75 @@ +name: Publish to crates.io + +on: + push: + tags: ['v*'] + +jobs: + test: + runs-on: ubuntu-24.04 + + steps: + - name: Print environment (debug) + run: env + + - name: Fetch sources + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Run tests + uses: frequenz-floss/gh-action-cargo-test@v1.0.0 + + create-github-release: + needs: ["test"] + name: Create GitHub release + runs-on: ubuntu-24.04 + permissions: + # We need write permissions on contents to create GitHub releases and on + # discussions to create the release announcement in the discussion forums + contents: write + discussions: write + steps: + - name: Download RELEASE_NOTES.md + run: | + set -ux + gh api \ + -X GET \ + -f ref=$REF \ + -H "Accept: application/vnd.github.raw" \ + "/repos/$REPOSITORY/contents/RELEASE_NOTES.md" \ + > RELEASE_NOTES.md + env: + REF: ${{ github.ref }} + REPOSITORY: ${{ github.repository }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Create GitHub release + run: | + set -ux + extra_opts= + if echo "$REF_NAME" | grep -- -; then extra_opts=" --prerelease"; fi + gh release create \ + -R "$REPOSITORY" \ + --notes-file RELEASE_NOTES.md \ + --generate-notes \ + $extra_opts \ + $REF_NAME + env: + REF_NAME: ${{ github.ref_name }} + REPOSITORY: ${{ github.repository }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + publish: + needs: ["create-github-release"] + runs-on: ubuntu-24.04 + environment: release + permissions: + id-token: write + steps: + - uses: actions/checkout@v5 + - uses: rust-lang/crates-io-auth-action@b7e9a28eded4986ec6b1fa40eeee8f8f165559ec # v1.0.3 + id: auth + - run: cargo publish + env: + CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }}