# Gateway API conformance (#19, spec/GATEWAY_API.md): rws in a kind cluster
# against the official suite at the pinned Gateway API release, in both
# deployment modes. Every profile and claimed feature must pass.
name: Gateway API conformance
on:
push:
branches: [main]
# A release tag: the reports submitted upstream (their
# implementation.version must be the release).
tags: ["[0-9]+.[0-9]+.[0-9]+"]
paths:
- "src/gateway_api/**"
- "src/proxy/**"
- "src/server/**"
- "helm/**"
- "ci/e2e/gateway_api*"
- ".github/workflows/gateway-api.yml"
- "Cargo.toml"
- "Cargo.lock"
workflow_dispatch:
concurrency:
group: gateway-api-${{ github.ref }}
cancel-in-progress: true
env:
GATEWAY_API_VERSION: v1.6.3
KIND_VERSION: v0.33.0
PROFILES: GATEWAY-HTTP,GATEWAY-GRPC,GATEWAY-TLS,GATEWAY-TCP,GATEWAY-UDP
# Keep in step with gateway_api::translate::SUPPORTED_FEATURES.
FEATURES: BackendTLSPolicy,BackendTLSPolicySANValidation,GRPCRoute,GRPCRouteNamedRouteRule,Gateway,GatewayAddressEmpty,GatewayBackendClientCertificate,GatewayFrontendClientCertificateValidation,GatewayFrontendClientCertificateValidationInsecureFallback,GatewayHTTPListenerIsolation,GatewayHTTPSListenerDetectMisdirectedRequests,GatewayInfrastructure,GatewayPort8080,GatewayStaticAddresses,HTTPRoute,HTTPRoute303RedirectStatusCode,HTTPRoute307RedirectStatusCode,HTTPRoute308RedirectStatusCode,HTTPRouteBackendProtocolH2C,HTTPRouteBackendProtocolWebSocket,HTTPRouteBackendRequestHeaderModification,HTTPRouteBackendTimeout,HTTPRouteCORS,HTTPRouteHostRewrite,HTTPRouteMethodMatching,HTTPRouteNamedRouteRule,HTTPRouteParentRefPort,HTTPRoutePathRedirect,HTTPRoutePathRewrite,HTTPRoutePortRedirect,HTTPRouteQueryParamMatching,HTTPRouteRequestMirror,HTTPRouteRequestMultipleMirrors,HTTPRouteRequestPercentageMirror,HTTPRouteRequestTimeout,HTTPRouteResponseHeaderModification,HTTPRouteSchemeRedirect,ListenerSet,ReferenceGrant,TCPRoute,TLSRoute,TLSRouteModeTerminate,UDPRoute
jobs:
conformance:
name: conformance (${{ matrix.mode }})
strategy:
fail-fast: false
matrix:
mode: [shared, provisioned]
runs-on: ubuntu-latest
timeout-minutes: 180
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: dtolnay/rust-toolchain@1.99
with:
targets: x86_64-unknown-linux-musl
- uses: Swatinem/rust-cache@v2
- name: Install musl tools
run: sudo apt-get update && sudo apt-get install -y musl-tools
# What the Linux release ships (release.yml): static musl, these features.
- name: Build rws as released for Linux
run: cargo build --bin rws --features "acme auth mimalloc gateway-api" --target x86_64-unknown-linux-musl
- uses: actions/setup-go@v5
with:
go-version: "1.26"
- name: kind, and the Gateway API suite at the pinned release
env:
GH_TOKEN: ${{ github.token }}
run: |
gh release download "$KIND_VERSION" --repo kubernetes-sigs/kind --pattern 'kind-linux-amd64' --dir "$RUNNER_TEMP"
install -m 0755 "$RUNNER_TEMP/kind-linux-amd64" /usr/local/bin/kind
git clone --depth 1 --branch "$GATEWAY_API_VERSION" https://github.com/kubernetes-sigs/gateway-api "$RUNNER_TEMP/gateway-api"
gh release download "$GATEWAY_API_VERSION" --repo kubernetes-sigs/gateway-api --pattern standard-install.yaml --dir "$RUNNER_TEMP/gateway-api"
- name: Conformance suite
run: ci/e2e/gateway_api.sh target/x86_64-unknown-linux-musl/debug/rws "$RUNNER_TEMP/gateway-api" "$RUNNER_TEMP/report.yaml" "$PROFILES" "$FEATURES" "${{ matrix.mode }}"
- name: Report
if: always()
run: |
if [ -f "$RUNNER_TEMP/report.yaml" ]; then
{ echo '```yaml'; cat "$RUNNER_TEMP/report.yaml"; echo '```'; } >> "$GITHUB_STEP_SUMMARY"
# Named as conformance/reports/<version>/<impl>/ in gateway-api wants it:
# <channel>-<version>-<mode>-report.yaml.
version=$(git describe --tags --always)
cp "$RUNNER_TEMP/report.yaml" "$RUNNER_TEMP/standard-$version-${{ matrix.mode }}-report.yaml"
fi
- uses: actions/upload-artifact@v4
if: always()
with:
name: gateway-api-conformance-report-${{ matrix.mode }}
path: ${{ runner.temp }}/standard-*-report.yaml
if-no-files-found: ignore