name: Release on: push: tags: - 'v*' env: CARGO_TERM_COLOR: always jobs: docs: name: Build and validate documentation runs-on: ubuntu-latest defaults: run: working-directory: crates/hyper-custom-cert strategy: fail-fast: false matrix: include: - name: default-features features: "" no-default-features: false - name: no-default-features features: "" no-default-features: true - name: rustls features: "rustls" no-default-features: true - name: insecure-dangerous features: "insecure-dangerous" no-default-features: false - name: all-features features: "rustls,insecure-dangerous" no-default-features: true steps: - name: Checkout uses: actions/checkout@v4 - uses: actions/cache@v4 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - name: Setup Rust run: rustup update stable && rustup default stable - name: Build documentation shell: bash run: | FLAGS="" if [ "${{ matrix.no-default-features }}" = "true" ]; then FLAGS="$FLAGS --no-default-features"; fi if [ -n "${{ matrix.features }}" ]; then FLAGS="$FLAGS --features ${{ matrix.features }}"; fi echo "Running: cargo doc $FLAGS --no-deps" cargo doc $FLAGS --no-deps - name: Check documentation warnings shell: bash run: | FLAGS="" if [ "${{ matrix.no-default-features }}" = "true" ]; then FLAGS="$FLAGS --no-default-features"; fi if [ -n "${{ matrix.features }}" ]; then FLAGS="$FLAGS --features ${{ matrix.features }}"; fi echo "Running: cargo doc $FLAGS --no-deps" RUSTDOCFLAGS="-D warnings" cargo doc $FLAGS --no-deps - name: Test documentation examples shell: bash run: | FLAGS="" if [ "${{ matrix.no-default-features }}" = "true" ]; then FLAGS="$FLAGS --no-default-features"; fi if [ -n "${{ matrix.features }}" ]; then FLAGS="$FLAGS --features ${{ matrix.features }}"; fi echo "Running: cargo test --doc $FLAGS" cargo test --doc $FLAGS test: name: Test before release runs-on: ubuntu-latest needs: docs defaults: run: working-directory: crates/hyper-custom-cert strategy: fail-fast: false steps: - name: Checkout uses: actions/checkout@v4 - uses: actions/cache@v4 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - name: Setup Rust run: rustup update stable && rustup default stable - name: Install clippy and rustfmt run: rustup component add clippy rustfmt - name: Cargo fmt (check) run: cargo fmt --all -- --check - name: Clippy shell: bash run: cargo clippy --all-targets - name: Tests shell: bash run: cargo test --all-features publish: name: Publish to crates.io runs-on: ubuntu-latest permissions: id-token: write # Required for OIDC token exchange https://crates.io/docs/trusted-publishing needs: test defaults: run: working-directory: crates/hyper-custom-cert steps: - name: Checkout uses: actions/checkout@v4 - uses: actions/cache@v4 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - name: Setup Rust run: rustup update stable && rustup default stable - name: Verify tag matches version run: | TAG_VERSION=${GITHUB_REF#refs/tags/v} CARGO_VERSION=$(cargo metadata --no-deps --format-version 1 | jq -r '.packages[0].version') if [ "$TAG_VERSION" != "$CARGO_VERSION" ]; then echo "Tag version ($TAG_VERSION) does not match Cargo.toml version ($CARGO_VERSION)" exit 1 fi # See Trusted publishing: https://crates.io/docs/trusted-publishing - uses: rust-lang/crates-io-auth-action@v1 id: auth - run: cargo publish env: CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }} release: name: Create GitHub Release runs-on: ubuntu-latest needs: [test, publish] permissions: contents: write steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Extract tag name id: tag run: echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT - name: Generate changelog id: changelog run: | # Get the previous tag PREV_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "") # Generate changelog if [ -n "$PREV_TAG" ]; then echo "## What's Changed" > changelog.md echo "" >> changelog.md git log --pretty=format:"* %s (%h)" ${PREV_TAG}..HEAD >> changelog.md echo "" >> changelog.md echo "" >> changelog.md echo "**Full Changelog**: https://github.com/${{ github.repository }}/compare/${PREV_TAG}...${{ steps.tag.outputs.tag }}" >> changelog.md else echo "## What's Changed" > changelog.md echo "" >> changelog.md echo "Initial release of hyper-custom-cert" >> changelog.md echo "" >> changelog.md echo "A small, ergonomic HTTP client wrapper around hyper with optional support for custom Root CAs and a dev-only insecure mode for self-signed certificates." >> changelog.md fi # Set the changelog as output (handle multiline) echo "changelog<> $GITHUB_OUTPUT cat changelog.md >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT - name: Create Release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | if [[ "${{ steps.tag.outputs.tag }}" == *"-"* ]]; then PRERELEASE_FLAG="--prerelease" else PRERELEASE_FLAG="" fi gh release create "${{ steps.tag.outputs.tag }}" \ --title "Release ${{ steps.tag.outputs.tag }}" \ --notes-file changelog.md \ $PRERELEASE_FLAG