Skip to content

Move every unreleased SDK change log entry to 1.43 and fix version markers #3170

Move every unreleased SDK change log entry to 1.43 and fix version markers

Move every unreleased SDK change log entry to 1.43 and fix version markers #3170

Workflow file for this run

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