Repository navigation
Move every unreleased SDK change log entry to 1.43 and fix version markers #3170
Workflow file for this run
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: Check Gate CI | |
| on: | |
| pull_request: | |
| # Adding or removing the ci:fast-merge label changes the required workflows. | |
| # edited re-runs the skills checks that read the pull request description. | |
| types: [opened, synchronize, reopened, edited, labeled, unlabeled] | |
| # A manual dispatch checks non-PR CI only; it validates no pull request description. | |
| workflow_dispatch: | |
| permissions: | |
| actions: read | |
| checks: read | |
| contents: read | |
| pull-requests: read | |
| concurrency: | |
| group: check-gate-${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| check-gate: | |
| name: Check Gate CI | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 90 | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Validate CI runner policy | |
| run: make ci-runner-check | |
| - name: Reject agent attribution | |
| if: github.event_name == 'pull_request' | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| PR_NUMBER: ${{ github.event.pull_request.number }} | |
| PR_TITLE: ${{ github.event.pull_request.title }} | |
| PR_BODY: ${{ github.event.pull_request.body }} | |
| run: | | |
| { | |
| printf '%s\n%s\n' "$PR_TITLE" "$PR_BODY" | |
| gh api --paginate "repos/$GITHUB_REPOSITORY/pulls/$PR_NUMBER/commits" --jq '.[].commit.message' | |
| } | script/check-commit-attribution | |
| - uses: dorny/paths-filter@v3 | |
| id: filter | |
| if: github.event_name == 'pull_request' | |
| with: | |
| filters: | | |
| agents: | |
| - 'agents/**' | |
| - '.github/workflows/agents-ci.yml' | |
| - '.github/workflows/agents-python-publish.yml' | |
| - '.github/workflows/agents-typescript-publish.yml' | |
| sdk_go: | |
| - 'sdk-go/**' | |
| - 'blob-cache-go/**' | |
| - 'protos/**' | |
| - 'server-zd/**' | |
| - 's3local/**' | |
| - 'cli/**' | |
| - 'web/**' | |
| - 'go.work' | |
| - 'go.work.sum' | |
| - 'codecov.yml' | |
| - '.github/workflows/sdk-go-ci.yml' | |
| sdk_rust: | |
| - 'sdk-rust/**' | |
| - 'cli/**' | |
| - 'server-zd/**' | |
| - 's3local/**' | |
| - 'protos/**' | |
| - 'web/**' | |
| - 'codecov.yml' | |
| - '.github/workflows/sdk-rust-ci.yml' | |
| sdk_java: | |
| - 'sdk-java/**' | |
| - 'sdk-rust/Cargo.lock' | |
| - 'sdk-rust/Cargo.toml' | |
| - 'sdk-rust/crates/dex-blob-cache/**' | |
| - 'sdk-rust/crates/dex-blob-cache-jni/**' | |
| - 'cli/**' | |
| - 'web/**' | |
| - 'server-zd/**' | |
| - 's3local/**' | |
| - 'protos/**' | |
| - 'codecov.yml' | |
| - '.github/workflows/sdk-java-ci.yml' | |
| - '.github/workflows/sdk-java-publish.yml' | |
| sdk_python: | |
| - 'sdk-python/**' | |
| - 'sdk-rust/Cargo.lock' | |
| - 'sdk-rust/Cargo.toml' | |
| - 'sdk-rust/crates/dex-blob-cache/**' | |
| - 'sdk-rust/crates/dex-blob-cache-python/**' | |
| - 'cli/**' | |
| - 'server-zd/**' | |
| - 's3local/**' | |
| - 'web/**' | |
| - 'protos/**' | |
| - 'codecov.yml' | |
| - '.github/workflows/sdk-python-ci.yml' | |
| sdk_typescript: | |
| - 'sdk-typescript/**' | |
| - 'examples/typescript/decorator-free-rpc/**' | |
| - 'sdk-rust/Cargo.lock' | |
| - 'sdk-rust/Cargo.toml' | |
| - 'sdk-rust/crates/dex-blob-cache/**' | |
| - 'sdk-rust/crates/dex-blob-cache-node/**' | |
| - 'cli/**' | |
| - 'server-zd/**' | |
| - 's3local/**' | |
| - 'protos/**' | |
| - 'web/**' | |
| - '.github/workflows/sdk-typescript-ci.yml' | |
| - '.github/workflows/sdk-typescript-publish.yml' | |
| rust_rules: | |
| - '**/*.rs' | |
| - '**/Cargo.toml' | |
| - '**/clippy.toml' | |
| - 'script/check-rust-rules.py' | |
| - 'script/check_rust_rules_test.py' | |
| - 'script/rust-crate-layers.json' | |
| - 'script/rust-rules-baseline.json' | |
| - 'Makefile' | |
| - '.github/workflows/rust-rules-ci.yml' | |
| web: | |
| - 'web/**' | |
| - 'protos/**' | |
| - 'sdk-go/integ/main_test.go' | |
| - 'sdk-go/integ/web*' | |
| - 'sdk-go/integ/webv2*/**' | |
| - '.github/workflows/web-ci.yml' | |
| examples_go: | |
| - 'examples/go/**' | |
| - '.github/workflows/examples-go-ci.yml' | |
| - 'examples/entity-store/**' | |
| examples_java: | |
| - 'examples/java/**' | |
| - '.github/workflows/examples-java-ci.yml' | |
| - 'examples/entity-store/**' | |
| examples_python: | |
| - 'examples/python/**' | |
| - '.github/workflows/examples-python-ci.yml' | |
| - 'examples/entity-store/**' | |
| examples_rust: | |
| - 'examples/rust/**' | |
| - '.github/workflows/examples-rust-ci.yml' | |
| - 'examples/entity-store/**' | |
| s3local: | |
| - 's3local/**' | |
| - '.github/workflows/s3local-ci.yml' | |
| server_zd: | |
| - 'server-zd/**' | |
| - 's3local/**' | |
| - 'sdk-rust/Cargo.toml' | |
| - 'sdk-rust/crates/dex-blob-cache/**' | |
| - 'protos/**' | |
| - '.github/workflows/server-zd-ci.yml' | |
| server_zd_integ: | |
| - 'sdk-go/**' | |
| - 'server-zd/**' | |
| - 'protos/**' | |
| - '.github/workflows/server-zd-integ-ci.yml' | |
| server_zd_simulation_runner: | |
| - 'script/server-zd-simulation-run.py' | |
| - 'script/test_server_zd_simulation_run.py' | |
| - '.github/workflows/server-zd-simulation-nightly.yml' | |
| - '.github/workflows/server-zd-simulation-runner-ci.yml' | |
| - 'Makefile' | |
| server_zd_image: | |
| - 'server-zd/LICENSE.md' | |
| - 'server-zd/LEGACY_NOTICES.md' | |
| - 'server-zd/LICENSES/**' | |
| - 'server-zd/Dockerfile' | |
| - '.dockerignore' | |
| - '.github/workflows/server-zd-image-release.yml' | |
| - '.github/workflows/server-zd-image-main.yml' | |
| server_zd_binary: | |
| - 'server-zd/LICENSE.md' | |
| - 'server-zd/LEGACY_NOTICES.md' | |
| - 'server-zd/LICENSES/**' | |
| - '.github/workflows/server-zd-binary-release.yml' | |
| server_zd_minio: | |
| - '.github/workflows/server-zd-minio-nightly.yml' | |
| examples_typescript: | |
| - 'examples/typescript/**' | |
| - '.github/workflows/examples-typescript-ci.yml' | |
| - 'examples/entity-store/**' | |
| generated_code: | |
| - 'protos/**' | |
| - 'sdk-go/gen/dexpb/**' | |
| - 'sdk-java/src/main/java/io/superdurable/gen/**' | |
| - 'sdk-python/dex/dexpb/**' | |
| - 'sdk-python/pyproject.toml' | |
| - 'sdk-python/uv.lock' | |
| - 'sdk-typescript/src/gen/**' | |
| - 'sdk-typescript/scripts/generate-proto.mjs' | |
| - 'sdk-typescript/package.json' | |
| - 'sdk-typescript/package-lock.json' | |
| - 'Makefile' | |
| - '.github/workflows/generated-code-ci.yml' | |
| release_tooling: | |
| - 'script/release/**' | |
| - '.github/workflows/release-changed-components.yml' | |
| - '.github/workflows/release-tooling-ci.yml' | |
| - 'CONTRIBUTING.md' | |
| skills: | |
| - 'skills/**' | |
| - 'docs/content/concepts/**' | |
| - 'docs/content/components/**' | |
| - 'docs/content/design-patterns/**' | |
| - '.github/workflows/skills-ci.yml' | |
| copyright: | |
| - 'agents/**' | |
| - 'cli/**' | |
| - 'sdk-go/**' | |
| - 'sdk-java/**' | |
| - 'sdk-python/**' | |
| - 'sdk-rust/**' | |
| - 's3local/**' | |
| - 'server-zd/**' | |
| - 'web/**' | |
| - 'examples/go/**' | |
| - 'examples/java/**' | |
| - 'examples/python/**' | |
| - 'protos/**' | |
| - 'script/licenseheaders/**' | |
| - 'LICENSE' | |
| - 'LEGACY_NOTICES.md' | |
| - 'LICENSING.md' | |
| - 'CLA.md' | |
| - 'CLA-INDIVIDUAL.md' | |
| - 'CLA-CORPORATE.md' | |
| - 'Makefile' | |
| - '.github/workflows/copyright-ci.yml' | |
| - uses: actions/setup-python@v5 | |
| if: github.event_name == 'pull_request' && steps.filter.outputs.skills == 'true' | |
| with: | |
| python-version: '3.13' | |
| # The gate reads the current description itself, so no stale Skills CI run can approve it. | |
| - name: Check skills release metadata and doc-map pairing against the current description | |
| if: github.event_name == 'pull_request' && steps.filter.outputs.skills == 'true' | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| PR_NUMBER: ${{ github.event.pull_request.number }} | |
| run: | | |
| set -euo pipefail | |
| pull_request_file="$RUNNER_TEMP/pull-request.json" | |
| body_file="$RUNNER_TEMP/pull-request-body.txt" | |
| gh api "repos/$GITHUB_REPOSITORY/pulls/$PR_NUMBER" > "$pull_request_file" | |
| jq -r '.body // ""' "$pull_request_file" > "$body_file" | |
| base_sha="$(jq -r '.base.sha' "$pull_request_file")" | |
| if [[ "$(git rev-parse --is-shallow-repository)" == "true" ]]; then | |
| git fetch --no-tags --unshallow origin | |
| fi | |
| git fetch --no-tags origin "$base_sha" | |
| cd skills | |
| python3 script/check-package.py --base-ref "$base_sha" --pr-body-file "$body_file" | |
| python3 script/check-doc-map.py --base-ref "$base_sha" --pr-body-file "$body_file" | |
| - name: Wait for required workflows | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| REPO: ${{ github.repository }} | |
| HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }} | |
| EVENT_NAME: ${{ github.event_name }} | |
| FILTER_AGENTS: ${{ steps.filter.outputs.agents }} | |
| FILTER_SDK_GO: ${{ steps.filter.outputs.sdk_go }} | |
| FILTER_SDK_RUST: ${{ steps.filter.outputs.sdk_rust }} | |
| FILTER_SDK_JAVA: ${{ steps.filter.outputs.sdk_java }} | |
| FILTER_SDK_PYTHON: ${{ steps.filter.outputs.sdk_python }} | |
| FILTER_SDK_TYPESCRIPT: ${{ steps.filter.outputs.sdk_typescript }} | |
| FILTER_RUST_RULES: ${{ steps.filter.outputs.rust_rules }} | |
| FILTER_WEB: ${{ steps.filter.outputs.web }} | |
| FILTER_EXAMPLES_GO: ${{ steps.filter.outputs.examples_go }} | |
| FILTER_EXAMPLES_JAVA: ${{ steps.filter.outputs.examples_java }} | |
| FILTER_EXAMPLES_PYTHON: ${{ steps.filter.outputs.examples_python }} | |
| FILTER_EXAMPLES_RUST: ${{ steps.filter.outputs.examples_rust }} | |
| FILTER_S3LOCAL: ${{ steps.filter.outputs.s3local }} | |
| FILTER_SERVER_ZD: ${{ steps.filter.outputs.server_zd }} | |
| FILTER_SERVER_ZD_INTEG: ${{ steps.filter.outputs.server_zd_integ }} | |
| FILTER_SERVER_ZD_SIMULATION_RUNNER: ${{ steps.filter.outputs.server_zd_simulation_runner }} | |
| FILTER_SERVER_ZD_IMAGE: ${{ steps.filter.outputs.server_zd_image }} | |
| FILTER_SERVER_ZD_BINARY: ${{ steps.filter.outputs.server_zd_binary }} | |
| FILTER_SERVER_ZD_MINIO: ${{ steps.filter.outputs.server_zd_minio }} | |
| FILTER_EXAMPLES_TYPESCRIPT: ${{ steps.filter.outputs.examples_typescript }} | |
| FILTER_GENERATED_CODE: ${{ steps.filter.outputs.generated_code }} | |
| FILTER_RELEASE_TOOLING: ${{ steps.filter.outputs.release_tooling }} | |
| FILTER_SKILLS: ${{ steps.filter.outputs.skills }} | |
| FILTER_COPYRIGHT: ${{ steps.filter.outputs.copyright }} | |
| IS_FAST_MERGE: ${{ contains(github.event.pull_request.labels.*.name, 'ci:fast-merge') }} | |
| run: | | |
| set -euo pipefail | |
| expected=() | |
| if [[ "$EVENT_NAME" != "pull_request" ]]; then | |
| expected=( | |
| "Agents CI" | |
| "Blob Cache Go CI" | |
| "Dex CLI CI" | |
| "Copyright" | |
| "Go examples CI" | |
| "Java examples CI" | |
| "Python examples CI" | |
| "Rust examples CI" | |
| "TypeScript examples CI" | |
| "Generated Code CI" | |
| "Release Tooling CI" | |
| "Go SDK CI" | |
| "Java SDK CI" | |
| "Python SDK CI" | |
| "Rust Rules CI" | |
| "Rust SDK CI" | |
| "TypeScript SDK CI" | |
| "S3local CI" | |
| "Server ZD CI" | |
| "Server Integration against server-zd" | |
| "Server ZD Simulation Runner CI" | |
| "Web CI" | |
| ) | |
| else | |
| expected+=("CLA") | |
| [[ "$FILTER_AGENTS" == "true" ]] && expected+=("Agents CI") | |
| [[ "$FILTER_SDK_GO" == "true" ]] && expected+=("Go SDK CI") | |
| [[ "$FILTER_SDK_RUST" == "true" ]] && expected+=("Rust SDK CI") | |
| [[ "$FILTER_SDK_JAVA" == "true" ]] && expected+=("Java SDK CI") | |
| [[ "$FILTER_SDK_PYTHON" == "true" ]] && expected+=("Python SDK CI") | |
| [[ "$FILTER_SDK_TYPESCRIPT" == "true" ]] && expected+=("TypeScript SDK CI") | |
| [[ "$FILTER_RUST_RULES" == "true" ]] && expected+=("Rust Rules CI") | |
| [[ "$FILTER_WEB" == "true" ]] && expected+=("Web CI") | |
| [[ "$FILTER_EXAMPLES_GO" == "true" ]] && expected+=("Go examples CI") | |
| [[ "$FILTER_EXAMPLES_JAVA" == "true" ]] && expected+=("Java examples CI") | |
| [[ "$FILTER_EXAMPLES_PYTHON" == "true" ]] && expected+=("Python examples CI") | |
| [[ "$FILTER_EXAMPLES_RUST" == "true" ]] && expected+=("Rust examples CI") | |
| [[ "$FILTER_S3LOCAL" == "true" ]] && expected+=("S3local CI") | |
| [[ "$FILTER_SERVER_ZD" == "true" ]] && expected+=("Server ZD CI") | |
| [[ "$FILTER_SERVER_ZD_INTEG" == "true" ]] && expected+=("Server Integration against server-zd") | |
| [[ "$FILTER_SERVER_ZD_SIMULATION_RUNNER" == "true" ]] && expected+=("Server ZD Simulation Runner CI") | |
| [[ "$FILTER_SERVER_ZD_IMAGE" == "true" ]] && expected+=("Server ZD image release") | |
| [[ "$FILTER_SERVER_ZD_BINARY" == "true" ]] && expected+=("Server ZD binary release") | |
| [[ "$FILTER_SERVER_ZD_MINIO" == "true" ]] && expected+=("Server ZD MinIO Nightly") | |
| [[ "$FILTER_EXAMPLES_TYPESCRIPT" == "true" ]] && expected+=("TypeScript examples CI") | |
| [[ "$FILTER_GENERATED_CODE" == "true" ]] && expected+=("Generated Code CI") | |
| [[ "$FILTER_RELEASE_TOOLING" == "true" ]] && expected+=("Release Tooling CI") | |
| [[ "$FILTER_SKILLS" == "true" ]] && expected+=("Skills CI") | |
| [[ "$FILTER_COPYRIGHT" == "true" ]] && expected+=("Copyright") | |
| fi | |
| # ci:fast-merge stops the SDK, CLI, Web, examples, and agents | |
| # suites from blocking the merge. They still run on the pull request and on main. | |
| # The SDK suites on server-zd are non-blocking too; Server ZD CI still blocks. | |
| if [[ "$EVENT_NAME" == "pull_request" && "$IS_FAST_MERGE" == "true" ]]; then | |
| non_blocking=( | |
| "Agents CI" | |
| "Blob Cache Go CI" | |
| "Dex CLI CI" | |
| "Go SDK CI" | |
| "Java SDK CI" | |
| "Python SDK CI" | |
| "Rust SDK CI" | |
| "TypeScript SDK CI" | |
| "Web CI" | |
| "Go examples CI" | |
| "Java examples CI" | |
| "Python examples CI" | |
| "Rust examples CI" | |
| "TypeScript examples CI" | |
| ) | |
| blocking=() | |
| for name in "${expected[@]}"; do | |
| is_non_blocking=false | |
| for skipped in "${non_blocking[@]}"; do | |
| [[ "$name" == "$skipped" ]] && is_non_blocking=true | |
| done | |
| if [[ "$is_non_blocking" == "true" ]]; then | |
| echo "NOT WAITING $name (ci:fast-merge)" | |
| else | |
| blocking+=("$name") | |
| fi | |
| done | |
| expected=("${blocking[@]}") | |
| fi | |
| if [[ ${#expected[@]} -eq 0 ]]; then | |
| echo "No path-matched CI workflows; Check Gate CI succeeded." | |
| exit 0 | |
| fi | |
| echo "Waiting for workflows: ${expected[*]}" | |
| echo "head_sha=$HEAD_SHA" | |
| deadline=$((SECONDS + 85 * 60)) | |
| while (( SECONDS < deadline )); do | |
| runs_json="$(gh api \ | |
| "repos/${REPO}/actions/runs?head_sha=${HEAD_SHA}&per_page=100")" | |
| failed=0 | |
| pending=0 | |
| for name in "${expected[@]}"; do | |
| row="$(jq -c --arg name "$name" ' | |
| [.workflow_runs[] | select(.name == $name)] | |
| | sort_by(.id) | |
| | reverse | |
| | if length == 0 then empty | |
| else .[0] | {status, conclusion, html_url, id} | |
| end | |
| ' <<<"$runs_json")" | |
| if [[ -z "$row" ]]; then | |
| echo "PENDING $name (not started)" | |
| pending=1 | |
| continue | |
| fi | |
| status="$(jq -r '.status' <<<"$row")" | |
| conclusion="$(jq -r '.conclusion // empty' <<<"$row")" | |
| url="$(jq -r '.html_url' <<<"$row")" | |
| if [[ "$status" != "completed" ]]; then | |
| echo "PENDING $name ($status) $url" | |
| pending=1 | |
| continue | |
| fi | |
| if [[ "$conclusion" == "success" ]]; then | |
| echo "OK $name $url" | |
| continue | |
| fi | |
| echo "FAILED $name ($conclusion) $url" | |
| failed=1 | |
| done | |
| if (( failed )); then | |
| echo "One or more required workflows failed." | |
| exit 1 | |
| fi | |
| if (( pending == 0 )); then | |
| echo "All required workflows succeeded." | |
| exit 0 | |
| fi | |
| sleep 30 | |
| done | |
| echo "Timed out waiting for required workflows." | |
| exit 1 |