name: httpclient-release # Release gate for the HTTP Client Platform (design §38 step 4). Each declared gate runs as its own # single-line `./gradlew ` step, because .github/scripts/verify-gate-matrix.sh reads these # commands to prove the gate is actually executed — a folded or flag-laden command would make the # declaration in .github/ci-gate-matrix.yml unverifiable. on: workflow_dispatch: push: tags: - 'v*' permissions: contents: read jobs: release-gate: runs-on: ubuntu-latest timeout-minutes: 60 defaults: run: working-directory: src env: # A project property rather than a command-line flag, so each run command stays a plain, # verifiable task invocation while the machine-dependent bounds are still asserted. GRADLE_OPTS: -Dorg.gradle.project.performance.assertions.enabled=true steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # actions/checkout@v4.2.2 - name: Validate Gradle wrapper id: gradle-wrapper-validation uses: gradle/actions/wrapper-validation@3f131e8634966bd73d06cc69884922b02e6faf92 # gradle/actions@v6 - uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # actions/setup-java@v4.7.1 with: distribution: temurin java-version: "21.0.11+10" cache: gradle cache-dependency-path: | src/**/*.gradle src/**/gradle-wrapper.properties src/**/gradle.lockfile - name: Focused module tests run: ./gradlew :adapter:outbound:httpclient:test --no-daemon --stacktrace - name: Spring 6.2 API surface lane run: ./gradlew :adapter:outbound:httpclient:spring62ApiSurfaceScan --no-daemon --stacktrace - name: Spring 7.0 compatibility lane run: ./gradlew :adapter:outbound:httpclient:spring70CompatibilityTest --no-daemon --stacktrace - name: Stable cross-transport contract suite run: ./gradlew :adapter:outbound:httpclient:httpClientStableContractTest --no-daemon --stacktrace - name: SSRF and cardinality suite run: ./gradlew :adapter:outbound:httpclient:httpClientSecurityTest --no-daemon --stacktrace - name: Event-loop blocking suite run: ./gradlew :adapter:outbound:httpclient:httpClientBlockHoundTest --no-daemon --stacktrace - name: Toxiproxy fault-injection suite run: ./gradlew :adapter:outbound:httpclient:httpClientFailureInjectionTest --no-daemon --stacktrace - name: Resource-bound performance certification run: ./gradlew :adapter:outbound:httpclient:httpClientPerformanceTest --no-daemon --stacktrace - name: Architecture dependency gate run: ./gradlew verifyCleanArchitectureDependencies --no-daemon --stacktrace httpclient-documentation: runs-on: ubuntu-latest timeout-minutes: 15 steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # actions/checkout@v4.2.2 - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # actions/setup-python@v5.6.0 with: python-version: '3.12' - name: Verify documentation matches the code run: python3 scripts/verify-httpclient-docs.py