metadata: annotations: description: Generates dependency diff with visualization showing added/removed dependencies prow.k8s.io/context: check-dependency-stats prow.k8s.io/job: check-dependency-stats testgrid-alert-email: davanum@gmail.com testgrid-create-test-group: "true" testgrid-dashboards: sig-arch-code-organization creationTimestamp: "2026-07-03T12:28:22Z" generation: 10 labels: created-by-prow: "true" event-GUID: acf8f160-76da-11f1-9fe7-7afe9dfd1e8d prow.k8s.io/build-id: "2073021025599098880" prow.k8s.io/context: check-dependency-stats prow.k8s.io/id: 93c6a84f-cd5d-4948-9456-89878d2739e7 prow.k8s.io/is-optional: "true" prow.k8s.io/job: check-dependency-stats prow.k8s.io/refs.base_ref: master prow.k8s.io/refs.org: kubernetes prow.k8s.io/refs.pull: "140205" prow.k8s.io/refs.repo: kubernetes prow.k8s.io/type: presubmit name: 93c6a84f-cd5d-4948-9456-89878d2739e7 namespace: default resourceVersion: "1783081779645663019" uid: 7efbefcc-d7d3-411f-b8af-b50b2e6eb181 spec: agent: kubernetes cluster: eks-prow-build-cluster context: check-dependency-stats decoration_config: blobless_fetch: true gcs_configuration: bucket: kubernetes-ci-logs default_org: kubernetes default_repo: kubernetes path_strategy: legacy gcs_credentials_secret: service-account grace_period: 15m0s resources: clonerefs: requests: cpu: 100m initupload: requests: cpu: 100m place_entrypoint: requests: cpu: 100m sidecar: requests: cpu: 100m timeout: 10m0s utility_images: clonerefs: us-docker.pkg.dev/k8s-infra-prow/images/clonerefs:v20260702-ef12e757d entrypoint: us-docker.pkg.dev/k8s-infra-prow/images/entrypoint:v20260702-ef12e757d initupload: us-docker.pkg.dev/k8s-infra-prow/images/initupload:v20260702-ef12e757d sidecar: us-docker.pkg.dev/k8s-infra-prow/images/sidecar:v20260702-ef12e757d job: check-dependency-stats namespace: test-pods pod_spec: containers: - args: - -c - | set -euo pipefail export WORKDIR=${ARTIFACTS:-$TMPDIR} export PATH=$PATH:$GOPATH/bin export GOWORK=off mkdir -p "${WORKDIR}" pushd "$WORKDIR" go install github.com/kubernetes-sigs/depstat@latest popd # Install graphviz and jq apt-get update -qq && apt-get install -y -qq graphviz jq > /dev/null 2>&1 MAIN_MODULES="k8s.io/kubernetes$(ls staging/src/k8s.io | awk '{printf ",k8s.io/" $0}')" echo "=== Dependency Stats: ${PULL_BASE_SHA}..HEAD ===" echo "" # Show compact before/after/delta stats summary depstat diff "${PULL_BASE_SHA}" HEAD -m "${MAIN_MODULES}" --stats | tee "${WORKDIR}/stats.txt" depstat diff "${PULL_BASE_SHA}" HEAD -m "${MAIN_MODULES}" --stats --json > "${WORKDIR}/stats.json" echo "" echo "=== Dependency Diff: ${PULL_BASE_SHA}..HEAD ===" echo "" # Generate dependency diff with split-test-only and vendor-level signals. depstat diff "${PULL_BASE_SHA}" HEAD -m "${MAIN_MODULES}" -v --split-test-only --vendor --vendor-files | tee "${WORKDIR}/diff.txt" # Generate JSON for programmatic consumption (split + version + vendor sections) depstat diff "${PULL_BASE_SHA}" HEAD -m "${MAIN_MODULES}" --split-test-only --vendor --vendor-files --json > "${WORKDIR}/diff.json" # Generate DOT and SVG visualization of changes depstat diff "${PULL_BASE_SHA}" HEAD -m "${MAIN_MODULES}" --dot > "${WORKDIR}/diff.dot" dot -Tsvg "${WORKDIR}/diff.dot" -o "${WORKDIR}/diff.svg" # Show why each new dependency was added ADDED_DEPS=$(jq -r '.added[]?' "${WORKDIR}/diff.json" 2>/dev/null || true) if [ -n "${ADDED_DEPS}" ]; then echo "" echo "=== Why new dependencies are included ===" for dep in ${ADDED_DEPS}; do echo "" echo "--- ${dep} ---" depstat why "${dep}" -m "${MAIN_MODULES}" 2>/dev/null || echo " (could not trace dependency path)" done | tee "${WORKDIR}/why-added.txt" fi # Explain vendor-only removals (removed from vendor, still in module graph) VENDOR_ONLY_REMOVED=$(jq -r '.vendor.vendorOnlyRemovals[]?.path' "${WORKDIR}/diff.json" 2>/dev/null || true) if [ -n "${VENDOR_ONLY_REMOVED}" ]; then echo "" echo "=== Why vendor-only removed modules are still in module graph ===" for dep in ${VENDOR_ONLY_REMOVED}; do echo "" echo "--- ${dep} ---" depstat why "${dep}" -m "${MAIN_MODULES}" 2>/dev/null || echo " (could not trace dependency path)" done | tee "${WORKDIR}/why-vendor-only-removed.txt" fi # Summarize test-only vs non-test changes echo "" echo "=== Test-only vs Non-test dependency changes ===" jq -r '"Non-test added: \(.split.nonTestOnly.added // [] | length), removed: \(.split.nonTestOnly.removed // [] | length)"' "${WORKDIR}/diff.json" jq -r '"Test-only added: \(.split.testOnly.added // [] | length), removed: \(.split.testOnly.removed // [] | length)"' "${WORKDIR}/diff.json" echo "" echo "=== High-signal dependency summary ===" jq -r '[ "Module graph: added=\(.added | length), removed=\(.removed | length), versionChanges=\(.versionChanges // [] | length)", "Non-test: added=\(.split.nonTestOnly.added // [] | length), removed=\(.split.nonTestOnly.removed // [] | length), versionChanges=\(.split.nonTestOnly.versionChanges // [] | length)", "Test-only: added=\(.split.testOnly.added // [] | length), removed=\(.split.testOnly.removed // [] | length), versionChanges=\(.split.testOnly.versionChanges // [] | length)", "Vendor: added=\(.vendor.added // [] | length), removed=\(.vendor.removed // [] | length), versionChanges=\(.vendor.versionChanges // [] | length), vendorOnlyRemovals=\(.vendor.vendorOnlyRemovals // [] | length)", "Vendor files: added=\(.vendor.filesAdded // [] | length), deleted=\(.vendor.filesDeleted // [] | length)" ] | .[]' "${WORKDIR}/diff.json" echo "" echo "Artifacts saved to: ${WORKDIR}" echo " - diff.txt: Human-readable diff (summary + split + version + vendor sections)" echo " - diff.json: Machine-readable diff (includes .split.*, .versionChanges, .vendor.*)" echo " - diff.svg: Visual dependency change graph" command: - /bin/bash env: - name: GOPROXY value: https://proxy.golang.org - name: GOTOOLCHAIN value: auto - name: AWS_ROLE_SESSION_NAME valueFrom: fieldRef: fieldPath: metadata.name image: golang name: "" resources: limits: cpu: "2" memory: 4Gi requests: cpu: "2" memory: 4Gi prowjob_defaults: tenant_id: GlobalDefaultID refs: base_link: https://github.com/kubernetes/kubernetes/commit/cbe5e3096ec29950198ed0b77ed9c611f3183c14 base_ref: master base_sha: cbe5e3096ec29950198ed0b77ed9c611f3183c14 blobless_fetch: true org: kubernetes path_alias: k8s.io/kubernetes pulls: - author: pohly author_link: https://github.com/pohly commit_link: https://github.com/kubernetes/kubernetes/pull/140205/commits/c61f1f5c0aab507c0770b144737f8ecfdc0551b9 head_ref: cel-deps link: https://github.com/kubernetes/kubernetes/pull/140205 number: 140205 sha: c61f1f5c0aab507c0770b144737f8ecfdc0551b9 title: 'dependencies: cel-go v0.28.1' repo: kubernetes repo_link: https://github.com/kubernetes/kubernetes report: true rerun_command: /test check-dependency-stats type: presubmit status: build_id: "2073021025599098880" completionTime: "2026-07-03T12:29:38Z" description: Job succeeded. pendingTime: "2026-07-03T12:28:22Z" pod_name: 93c6a84f-cd5d-4948-9456-89878d2739e7 prev_report_states: gcsk8sreporter: success gcsreporter: success github-reporter: success startTime: "2026-07-03T12:28:21Z" state: success url: https://prow.k8s.io/view/gs/kubernetes-ci-logs/pr-logs/pull/140205/check-dependency-stats/2073021025599098880