{
  "_class" : "hudson.model.FreeStyleBuild",
  "actions" : [
    {
      "_class" : "hudson.model.CauseAction",
      "causes" : [
        {
          "_class" : "com.cloudbees.jenkins.GitHubPushCause",
          "shortDescription" : "Started by GitHub push by ti-chi-bot[bot]"
        },
        {
          "_class" : "com.cloudbees.jenkins.GitHubPushCause",
          "shortDescription" : "Started by GitHub push by ti-chi-bot[bot]"
        }
      ]
    },
    {
      
    },
    {
      "_class" : "jenkins.metrics.impl.TimeInQueueAction",
      "blockedDurationMillis" : 0,
      "blockedTimeMillis" : 0,
      "buildableDurationMillis" : 25363,
      "buildableTimeMillis" : 25363,
      "buildingDurationMillis" : 43925,
      "executingTimeMillis" : 43925,
      "executorUtilization" : 1.0,
      "subTaskCount" : 0,
      "waitingDurationMillis" : 9576,
      "waitingTimeMillis" : 9576
    },
    {
      "_class" : "hudson.plugins.git.util.BuildData",
      "buildsByBranchName" : {
        "origin/main" : {
          "_class" : "hudson.plugins.git.util.Build",
          "buildNumber" : 1628,
          "buildResult" : null,
          "marked" : {
            "SHA1" : "5a6b44c85a4a37a83027975092ab283a389d6fe2",
            "branch" : [
              {
                "SHA1" : "5a6b44c85a4a37a83027975092ab283a389d6fe2",
                "name" : "origin/main"
              }
            ]
          },
          "revision" : {
            "SHA1" : "5a6b44c85a4a37a83027975092ab283a389d6fe2",
            "branch" : [
              {
                "SHA1" : "5a6b44c85a4a37a83027975092ab283a389d6fe2",
                "name" : "origin/main"
              }
            ]
          }
        }
      },
      "lastBuiltRevision" : {
        "SHA1" : "5a6b44c85a4a37a83027975092ab283a389d6fe2",
        "branch" : [
          {
            "SHA1" : "5a6b44c85a4a37a83027975092ab283a389d6fe2",
            "name" : "origin/main"
          }
        ]
      },
      "remoteUrls" : [
        "https://github.com/PingCAP-QE/ci.git"
      ],
      "scmName" : ""
    },
    {
      
    },
    {
      
    },
    {
      
    },
    {
      
    },
    {
      
    },
    {
      
    },
    {
      "_class" : "org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction"
    }
  ],
  "artifacts" : [
    
  ],
  "building" : false,
  "description" : null,
  "displayName" : "#1628",
  "duration" : 43925,
  "estimatedDuration" : 43022,
  "executor" : null,
  "fullDisplayName" : "seed #1628",
  "id" : "1628",
  "inProgress" : false,
  "keepLog" : false,
  "number" : 1628,
  "queueId" : 3669346,
  "result" : "SUCCESS",
  "timestamp" : 1776312717379,
  "url" : "https://do.pingcap.net/jenkins/job/seed/1628/",
  "builtOn" : "default-v5n4g",
  "changeSet" : {
    "_class" : "hudson.plugins.git.GitChangeSetList",
    "items" : [
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "prow-jobs/pingcap-qe/ci/presubmits.yaml",
          ".ci/verify-k8s-pod-yaml.sh",
          "docs/guides/CI.md",
          "pipelines/ti-community-infra/test-prod/pod-prow_debug.yaml"
        ],
        "commitId" : "5a6b44c85a4a37a83027975092ab283a389d6fe2",
        "timestamp" : 1776312678000,
        "author" : {
          "absoluteUrl" : "https://do.pingcap.net/jenkins/user/noreply",
          "fullName" : "noreply"
        },
        "authorEmail" : "noreply@github.com",
        "comment" : "ci: verify pipeline pod YAML volumes blocks (#4526)\u000a\u000a## Summary\u000a- keep the non-Python `sh + yq` structural validation for pipeline Pod\u000aYAML files\u000a- add supplemental `kubectl --dry-run=client` and `kubectl\u000a--dry-run=server` validation paths when the presubmit runs with\u000ain-cluster Kubernetes API access\u000a- inject a synthetic test `metadata.name` before calling `kubectl`,\u000abecause Jenkins pod templates usually omit pod names\u000a- fix one real invalid Pod manifest already present on `main`:\u000a`pipelines/ti-community-infra/test-prod/pod-prow_debug.yaml`\u000a\u000a## What is checked\u000a- YAML must parse successfully\u000a- `apiVersion` must be `v1`\u000a- `kind` must be `Pod`\u000a- `spec` must be a map\u000a- `spec.containers` must be a non-empty sequence\u000a- explicit null nodes are rejected anywhere in the Pod manifest\u000a- when in-cluster API access is available, `kubectl` also validates the\u000arendered manifest after injecting a test pod name and namespace:\u000a  - `kubectl apply --dry-run=client --validate=strict`\u000a  - `kubectl apply --dry-run=server --validate=strict`\u000a\u000a## Why this shape\u000a- plain schema validation alone is not enough for the repo-specific\u000anull-node cases we found\u000a- `kubectl` validation is useful as extra Kubernetes-side verification,\u000abut Jenkins pod templates need a synthetic test name before it can run\u000acleanly\u000a- so the PR keeps the deterministic structural guardrail, and adds\u000a`kubectl` validation opportunistically when the presubmit environment\u000asupports it\u000a\u000a## Findings from this follow-up\u000a- `pipelines/pingcap/tidb/latest/pod-ghpr_mysql_test.yaml` is already\u000aclean on current `main`\u000a- current `main` did still contain another real invalid case:\u000a`pipelines/ti-community-infra/test-prod/pod-prow_debug.yaml` with\u000a`spec.containers: null`\u000a- this PR fixes that file and adds a dedicated presubmit guardrail\u000a\u000a## Validation\u000a- `sh .ci/verify-k8s-pod-yaml.sh`\u000a- stubbed `kubectl` validation locally to verify the script injects\u000a`metadata.name=ci-pod-yaml-validate`, injects the test namespace, and\u000acalls both client/server dry-run paths\u000a- `sh .ci/verify-k8s-pod-yaml.sh /tmp/invalid-null-volumes.yaml` ->\u000afails as expected\u000a- `sh .ci/verify-k8s-pod-yaml.sh /tmp/invalid-null-containers.yaml` ->\u000afails as expected\u000a- YAML parse for `prow-jobs/pingcap-qe/ci/presubmits.yaml` and\u000a`pipelines/ti-community-infra/test-prod/pod-prow_debug.yaml` ->\u000a`yaml-ok`\u000a- `.ci/update-prow-job-kustomization.sh`\u000a",
        "date" : "2026-04-16 04:11:18 +0000",
        "id" : "5a6b44c85a4a37a83027975092ab283a389d6fe2",
        "msg" : "ci: verify pipeline pod YAML volumes blocks (#4526)",
        "paths" : [
          {
            "editType" : "add",
            "file" : ".ci/verify-k8s-pod-yaml.sh"
          },
          {
            "editType" : "edit",
            "file" : "prow-jobs/pingcap-qe/ci/presubmits.yaml"
          },
          {
            "editType" : "edit",
            "file" : "pipelines/ti-community-infra/test-prod/pod-prow_debug.yaml"
          },
          {
            "editType" : "edit",
            "file" : "docs/guides/CI.md"
          }
        ]
      }
    ],
    "kind" : "git"
  },
  "culprits" : [
    {
      "absoluteUrl" : "https://do.pingcap.net/jenkins/user/noreply",
      "fullName" : "noreply"
    }
  ]
}