name: Release on: push: tags: - "v[0-9]+.[0-9]+.[0-9]+*" workflow_dispatch: inputs: tag: description: "Release tag (e.g., v1.0.0)" required: true type: string env: CARGO_TERM_COLOR: always BINARY_NAME: crypt jobs: build: name: Build ${{ matrix.target }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: include: - target: x86_64-unknown-linux-gnu os: ubuntu-latest archive: tar.gz - target: x86_64-pc-windows-msvc os: windows-latest archive: zip - target: x86_64-apple-darwin os: macos-latest archive: tar.gz - target: aarch64-apple-darwin os: macos-latest archive: tar.gz steps: - name: Checkout code uses: actions/checkout@v4 - name: Install Rust uses: dtolnay/rust-toolchain@nightly with: targets: ${{ matrix.target }} - name: Build release binary run: cargo build --release --locked -p crypt --target ${{ matrix.target }} - name: Prepare artifacts (Unix) if: matrix.os != 'windows-latest' run: | cd target/${{ matrix.target }}/release strip ${{ env.BINARY_NAME }} || true tar -czvf ../../../${{ env.BINARY_NAME }}-${{ matrix.target }}.${{ matrix.archive }} ${{ env.BINARY_NAME }} - name: Prepare artifacts (Windows) if: matrix.os == 'windows-latest' shell: pwsh run: | cd target/${{ matrix.target }}/release Compress-Archive -Path "${{ env.BINARY_NAME }}.exe" -DestinationPath "../../../${{ env.BINARY_NAME }}-${{ matrix.target }}.${{ matrix.archive }}" - name: Upload artifact uses: actions/upload-artifact@v4 with: name: ${{ env.BINARY_NAME }}-${{ matrix.target }} path: ${{ env.BINARY_NAME }}-${{ matrix.target }}.${{ matrix.archive }} release: name: Create Release needs: build runs-on: ubuntu-latest permissions: contents: write steps: - name: Checkout code uses: actions/checkout@v4 - name: Download all artifacts uses: actions/download-artifact@v4 with: path: artifacts merge-multiple: true - name: Get version from tag id: version run: | if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then echo "version=${{ inputs.tag }}" >> $GITHUB_OUTPUT else echo "version=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT fi - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: tag_name: ${{ steps.version.outputs.version }} name: Release ${{ steps.version.outputs.version }} draft: false prerelease: ${{ contains(steps.version.outputs.version, '-') }} generate_release_notes: true files: artifacts/*