build: statically link OpenSSL on Linux #10
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: publish | |
| on: | |
| pull_request: | |
| push: | |
| tags: | |
| - "v*" | |
| jobs: | |
| verify: | |
| name: Verify release tag | |
| runs-on: ubuntu-latest | |
| outputs: | |
| prerelease: ${{ steps.version.outputs.prerelease }} | |
| version: ${{ steps.version.outputs.version }} | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: Setup Rust | |
| uses: dtolnay/rust-toolchain@stable | |
| - name: Read and verify version | |
| id: version | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| version="$(cargo metadata --no-deps --format-version 1 | jq -er '.packages[0].version')" | |
| if [[ "$GITHUB_EVENT_NAME" == "push" && "$GITHUB_REF_NAME" != "v$version" ]]; then | |
| echo "::error::Tag $GITHUB_REF_NAME does not match Cargo.toml version $version." | |
| exit 1 | |
| fi | |
| case "$version" in | |
| *-*) prerelease=true ;; | |
| *) prerelease=false ;; | |
| esac | |
| { | |
| echo "prerelease=$prerelease" | |
| echo "version=$version" | |
| } >> "$GITHUB_OUTPUT" | |
| create-release: | |
| name: Create GitHub release | |
| needs: [verify] | |
| runs-on: ubuntu-latest | |
| if: startsWith(github.ref, 'refs/tags/') | |
| permissions: | |
| contents: write | |
| steps: | |
| - name: Create release | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| generate_release_notes: true | |
| name: Weibian ${{ needs.verify.outputs.version }} | |
| prerelease: ${{ needs.verify.outputs.prerelease }} | |
| build: | |
| name: Build for ${{ matrix.target }} | |
| needs: [verify, create-release] | |
| if: >- | |
| always() && needs.verify.result == 'success' && | |
| (github.event_name == 'pull_request' || needs.create-release.result == 'success') | |
| runs-on: ${{ matrix.os }} | |
| permissions: | |
| contents: read | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - os: ubuntu-latest | |
| target: x86_64-unknown-linux-gnu | |
| archive: tar.gz | |
| - os: ubuntu-24.04-arm | |
| target: aarch64-unknown-linux-gnu | |
| archive: tar.gz | |
| - os: macos-latest | |
| target: aarch64-apple-darwin | |
| archive: tar.gz | |
| - os: macos-15-intel | |
| target: x86_64-apple-darwin | |
| archive: tar.gz | |
| - os: windows-latest | |
| target: x86_64-pc-windows-msvc | |
| archive: zip | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: Setup Rust | |
| uses: dtolnay/rust-toolchain@stable | |
| with: | |
| targets: ${{ matrix.target }} | |
| - name: Cache Rust | |
| uses: Swatinem/rust-cache@v2 | |
| - name: Build (Linux, static OpenSSL) | |
| if: runner.os == 'Linux' | |
| env: | |
| OPENSSL_STATIC: "1" | |
| run: cargo build --verbose --bin=wb --release --locked --target=${{ matrix.target }} | |
| - name: Build | |
| if: runner.os != 'Linux' | |
| run: cargo build --verbose --bin=wb --release --locked --target=${{ matrix.target }} | |
| - name: Verify Linux linkage | |
| if: runner.os == 'Linux' | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| binary="target/${{ matrix.target }}/release/wb" | |
| if ldd "$binary" | grep -Eq 'lib(ssl|crypto)\.so' | |
| then | |
| echo "::error::Linux release must not dynamically link OpenSSL." | |
| ldd "$binary" | |
| exit 1 | |
| fi | |
| - name: Package (unix) | |
| if: matrix.archive == 'tar.gz' | |
| run: | | |
| mkdir -p dist/package | |
| cp target/${{ matrix.target }}/release/wb dist/package/ | |
| cp LICENSE README.md dist/package/ | |
| tar -czf dist/wb-${{ matrix.target }}.tar.gz -C dist/package . | |
| - name: Package (windows) | |
| if: matrix.archive == 'zip' | |
| shell: pwsh | |
| run: | | |
| New-Item -ItemType Directory -Force -Path dist\\package | Out-Null | |
| Copy-Item target\\${{ matrix.target }}\\release\\wb.exe dist\\package\\ | |
| Copy-Item LICENSE dist\\package\\ | |
| Copy-Item README.md dist\\package\\ | |
| Compress-Archive -Path dist\\package\\* -DestinationPath dist\\wb-${{ matrix.target }}.zip | |
| - name: Upload artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: wb-${{ matrix.target }} | |
| path: dist/wb-${{ matrix.target }}.${{ matrix.archive }} | |
| upload-release-assets: | |
| name: Upload release assets | |
| needs: [verify, build] | |
| if: startsWith(github.ref, 'refs/tags/') | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write | |
| steps: | |
| - name: Download artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: artifacts | |
| - name: Upload to release | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| files: artifacts/**/* | |
| prerelease: ${{ needs.verify.outputs.prerelease }} |