name: Release on: push: tags: - 'v*' env: CARGO_TERM_COLOR: always jobs: test: name: Test before release runs-on: ubuntu-latest defaults: run: working-directory: crates/hyper-custom-cert strategy: fail-fast: false matrix: include: - name: default (native-tls) features: "" no-default-features: false - name: no-default-features (no TLS) features: "" no-default-features: true - name: rustls features: "rustls" no-default-features: true - name: insecure-dangerous (native-tls) features: "insecure-dangerous" no-default-features: false - name: rustls + insecure-dangerous 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: Install clippy and rustfmt run: rustup component add clippy rustfmt - name: Cargo fmt (check) run: cargo fmt --all -- --check - name: Clippy 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 clippy --all-targets $FLAGS -- -D warnings" cargo clippy --all-targets $FLAGS -- -D warnings - name: Tests 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 $FLAGS -- --nocapture" cargo test $FLAGS -- --nocapture publish: name: Publish to crates.io runs-on: ubuntu-latest 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 - name: Publish to crates.io env: CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} run: cargo rustdoc -p hyper-custom-cert --all-features && cargo publish 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