diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2529c7c..fd759f8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,26 +5,103 @@ on: env: CARGO_TERM_COLOR: always jobs: - publish: - name: Publish to crates.io + check-version: + name: Check version runs-on: ubuntu-latest + outputs: + version: ${{ steps.check.outputs.version }} + release: ${{ steps.check.outputs.release }} steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable - - uses: Swatinem/rust-cache@v2 - - name: Check if version already published - id: check + - id: check run: | LOCAL=$(cargo metadata --no-deps --format-version 1 | jq -r '.packages[0].version') + echo "version=$LOCAL" >> "$GITHUB_OUTPUT" PUBLISHED=$(cargo search paraglide-launch --limit 1 2>/dev/null | head -1 | sed -n 's/.*= "\(.*\)".*/\1/p') echo "local=$LOCAL published=$PUBLISHED" if [ "$LOCAL" = "$PUBLISHED" ]; then - echo "skip=true" >> "$GITHUB_OUTPUT" + echo "release=false" >> "$GITHUB_OUTPUT" else - echo "skip=false" >> "$GITHUB_OUTPUT" + echo "release=true" >> "$GITHUB_OUTPUT" fi - - name: Publish - if: steps.check.outputs.skip != 'true' - run: cargo publish --no-verify + + build: + name: Build ${{ matrix.target }} + needs: check-version + if: needs.check-version.outputs.release == 'true' + runs-on: ${{ matrix.runner }} + strategy: + matrix: + include: + - target: x86_64-unknown-linux-gnu + runner: ubuntu-latest + archive: tar.gz + - target: aarch64-unknown-linux-gnu + runner: ubuntu-latest + archive: tar.gz + cross: true + - target: x86_64-apple-darwin + runner: macos-13 + archive: tar.gz + - target: aarch64-apple-darwin + runner: macos-latest + archive: tar.gz + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + with: + targets: ${{ matrix.target }} + - uses: Swatinem/rust-cache@v2 + with: + key: ${{ matrix.target }} + - name: Install cross + if: matrix.cross + run: cargo install cross --locked + - name: Build + run: | + if [ "${{ matrix.cross }}" = "true" ]; then + cross build --release --target ${{ matrix.target }} + else + cargo build --release --target ${{ matrix.target }} + fi + - name: Package + run: | + cd target/${{ matrix.target }}/release + tar czf ../../../launch-${{ matrix.target }}.${{ matrix.archive }} launch + - uses: actions/upload-artifact@v4 + with: + name: launch-${{ matrix.target }} + path: launch-${{ matrix.target }}.${{ matrix.archive }} + + release: + name: Release + needs: [check-version, build] + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/download-artifact@v4 + with: + merge-multiple: true + - name: Create GitHub release + env: + GH_TOKEN: ${{ github.token }} + run: | + gh release create "v${{ needs.check-version.outputs.version }}" \ + --repo "${{ github.repository }}" \ + --title "v${{ needs.check-version.outputs.version }}" \ + --generate-notes \ + launch-*.tar.gz + + publish: + name: Publish to crates.io + needs: [check-version, build] + if: needs.check-version.outputs.release == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + - run: cargo publish --no-verify env: CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}