{"id":"ac9e8217-c439-4922-ba1c-23e25416d009","shortId":"gWQDJU","kind":"skill","title":"kubesphere-devops-pipeline","tagline":"Use when creating, running, or managing CI/CD pipelines in KubeSphere DevOps, including pipeline API operations and run monitoring","description":"# KubeSphere DevOps Pipeline Management\n\n## Overview\n\nPipelines in KubeSphere DevOps are Kubernetes custom resources that integrate with Jenkins. KubeSphere uses a cloud-native, object-reconcile approach where Kubernetes resources are the source of truth.\n\n## When to Use\n\n- Creating or updating CI/CD pipelines\n- Triggering pipeline runs\n- Monitoring pipeline execution\n- Retrieving pipeline logs and artifacts\n- Troubleshooting failed pipeline runs\n\n## Architecture Mapping\n\nKubeSphere DevOps maps Kubernetes resources to Jenkins objects:\n\n| KubeSphere Resource | K8s Resource | Jenkins Resource |\n|---------------------|--------------|------------------|\n| DevOpsProject | DevOpsProject CR + Namespace | Folder |\n| Pipeline | Pipeline CR | WorkflowJob |\n| PipelineRun | PipelineRun CR | Build Run |\n| Workspace | Workspace CR | (authorization context) |\n\n```\nKubeSphere          Kubernetes                Jenkins\n─────────────────────────────────────────────────────────────\nWorkspace demo\n└── DevOpsProject   → demo-project NS          → Folder demo-project\n    └── Pipeline    → Pipeline CR              → WorkflowJob\n        └── Run     → PipelineRun CR           → Build #1\n```\n\n## Triggering Pipeline Runs (Recommended: Object-Reconcile)\n\n> **CRITICAL: ALWAYS Check for Parameters First!**\n> \n> Before triggering ANY pipeline (regular or multi-branch), you MUST check if the pipeline has parameters defined.\n> Triggering a pipeline without required parameters will cause the build to fail or use incorrect defaults.\n> \n> **For Multi-Branch Pipelines:** Query `/branches/{branch}` endpoint to get `.parameters` array\n> **For Regular Pipelines:** Query the Pipeline CR and check `.spec.pipeline.jenkinsfile` for `parameters {}` directive\n\n**Preferred Approach:** Create a `PipelineRun` custom resource. KubeSphere watches for these resources and triggers the corresponding Jenkins build.\n\n### Create a PipelineRun\n\n```yaml\napiVersion: devops.kubesphere.io/v1alpha3\nkind: PipelineRun\nmetadata:\n  name: my-pipeline-run-001\n  namespace: demo-project\nspec:\n  pipelineRef:\n    name: my-pipeline\n  parameters:\n    - name: BRANCH\n      value: \"main\"\n```\n\nApply with kubectl:\n```bash\nkubectl apply -f pipelinerun.yaml\n```\n\n### Check PipelineRun Status\n\n```bash\n# List all runs\nkubectl get pipelineruns -n demo-project\n\n# Get specific run status\nkubectl get pipelinerun my-pipeline-run-001 -n demo-project -o yaml\n\n# Watch run progress\nkubectl get pipelineruns -n demo-project -w\n```\n\n### PipelineRun Status Fields\n\n| Field | Description |\n|-------|-------------|\n| `status.phase` | Current state (Pending, Running, Succeeded, Failed, Unknown) |\n| `status.conditions` | Detailed conditions (Succeeded, Ready) |\n| `status.completionTime` | When run finished |\n| `status.startTime` | When run started |\n\n### Delete a PipelineRun\n\n```bash\nkubectl delete pipelinerun my-pipeline-run-001 -n demo-project\n```\n\n## Working Pipeline Example\n\nHere's a complete, working pipeline that builds a Go application:\n\n```yaml\napiVersion: devops.kubesphere.io/v1alpha3\nkind: Pipeline\nmetadata:\n  name: go-demo-pipeline\n  namespace: demo-project\nspec:\n  type: pipeline\n  pipeline:\n    name: go-demo-pipeline\n    description: \"Build and test Go application\"\n    jenkinsfile: |\n      pipeline {\n        agent any\n\n        stages {\n          stage('Build, Test and Archive') {\n            agent {\n              kubernetes {\n                yaml '''\n                  apiVersion: v1\n                  kind: Pod\n                  spec:\n                    containers:\n                    - name: golang\n                      image: golang:1.21\n                      command: [\"sleep\"]\n                      args: [\"99d\"]\n                '''\n              }\n            }\n            steps {\n              container('golang') {\n                sh '''\n                  export GO111MODULE=on\n                  git clone https://github.com/kubesphere-sigs/demo-go-http.git .\n                  go mod download\n                  go test ./... -v\n                  go build -o service main.go\n                '''\n              }\n              archiveArtifacts artifacts: 'service', followSymlinks: false\n            }\n          }\n        }\n      }\n```\n\n**Key Points:**\n- Uses `agent { kubernetes { yaml ... } }` to define a custom pod with Go container\n- The `archiveArtifacts` step must be in the same stage as the build (same workspace)\n- Container name in `container('golang')` must match the container name in the YAML\n\n## Pipeline Resource\n\n```yaml\napiVersion: devops.kubesphere.io/v1alpha3\nkind: Pipeline\nmetadata:\n  name: my-pipeline\n  namespace: demo-project\nspec:\n  type: pipeline\n  pipeline:\n    name: my-pipeline\n    description: \"Build and deploy app\"\n    jenkinsfile: |-\n      pipeline {\n        agent any\n        stages {\n          stage('Build') {\n            steps {\n              sh 'make build'\n            }\n          }\n        }\n      }\n```\n\n### Tenant-Created Resources: Creator Annotation\n\nWhen creating pipelines as a **tenant** (not cluster-admin), you **MUST** include the `kubesphere.io/creator` annotation to properly track ownership:\n\n```yaml\napiVersion: devops.kubesphere.io/v1alpha3\nkind: Pipeline\nmetadata:\n  name: my-pipeline\n  namespace: demo-project\n  annotations:\n    kubesphere.io/creator: \"stone-ns-admin\"  # Required for tenant-created resources\nspec:\n  type: pipeline\n  pipeline:\n    name: my-pipeline\n    description: \"Pipeline created by tenant\"\n    jenkinsfile: |-\n      pipeline {\n        agent any\n        stages {\n          stage('Build') {\n            steps {\n              sh 'echo Building...'\n            }\n          }\n        }\n      }\n```\n\n**Why this matters:**\n- KubeSphere uses this annotation for ownership tracking\n- UI displays creator information\n- Required for proper RBAC enforcement\n- **CRITICAL: Always set this annotation when creating ANY pipeline via API (both regular and multi-branch)**\n\n**Example API call with creator annotation for regular pipeline:**\n```bash\ncurl -s -X POST \"${KUBESPHERE_API}/kapis/devops.kubesphere.io/v1alpha3/namespaces/demo-project/pipelines\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"apiVersion\": \"devops.kubesphere.io/v1alpha3\",\n    \"kind\": \"Pipeline\",\n    \"metadata\": {\n      \"name\": \"my-pipeline\",\n      \"namespace\": \"demo-project\",\n      \"annotations\": {\n        \"kubesphere.io/creator\": \"'${USERNAME}'\"\n      }\n    },\n    \"spec\": {\n      \"type\": \"pipeline\",\n      \"pipeline\": {\n        \"name\": \"my-pipeline\",\n        \"description\": \"Tenant-created pipeline\",\n        \"jenkinsfile\": \"pipeline { agent any; stages { stage(\\\"Build\\\") { steps { sh \\\"echo hello\\\" } } } }\"\n      }\n    }\n  }'\n```\n\n## Multi-Branch Pipeline\n\nMulti-branch pipelines automatically discover branches from SCM and create jobs for each branch. The Jenkinsfile is loaded from the repository.\n\n> ⚠️ **CRITICAL: Always Check Repository Type First**\n> \n> Before creating a multi-branch pipeline, you **MUST** ask the user:\n> > \"Is this a private repository?\"\n> \n> **If YES (Private Repo):**\n> 1. Ask if they want to use an existing credential or create a new one\n> 2. Create a DevOps credential (`basic-auth` type with GitHub PAT) if needed\n> 3. Reference the credential in `git_source.credential_id`\n> 4. (Optional) Create a GitRepository CR for additional metadata\n> \n> **If NO (Public Repo):**\n> - Set `credential_id: \"\"` (empty string)\n> \n> Never assume repository type - always confirm with the user first.\n\n### Create Multi-Branch Pipeline\n\n**Step 1: Check Repository Type**\n- Ask user: \"Is the repository private?\"\n- If yes, proceed with credential creation\n\n**Step 2: Create Credential (For Private Repos Only)**\n\n```bash\n# Create GitHub credential\nexport GITHUB_PAT=\"ghp_xxxxxxxxxxxxxxxxxxxx\"\n\ncurl -s -X POST \"${KUBESPHERE_API}/clusters/${CLUSTER}/kapis/devops.kubesphere.io/v1alpha3/namespaces/${DEVOPS_PROJECT}/credentials\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"apiVersion\": \"v1\",\n    \"kind\": \"Secret\",\n    \"metadata\": {\n      \"name\": \"github-token\",\n      \"namespace\": \"'${DEVOPS_PROJECT}'\",\n      \"annotations\": {\n        \"kubesphere.io/creator\": \"'${USERNAME}'\",\n        \"credential.devops.kubesphere.io/type\": \"basic-auth\"\n      }\n    },\n    \"stringData\": {\n      \"username\": \"git\",\n      \"password\": \"'${GITHUB_PAT}'\"\n    },\n    \"type\": \"credential.devops.kubesphere.io/basic-auth\"\n  }'\n```\n\n**Step 3a: For Public Repository:**\n```yaml\napiVersion: devops.kubesphere.io/v1alpha3\nkind: Pipeline\nmetadata:\n  name: demo-jenkinsfiles-go\n  namespace: demo-project\n  annotations:\n    kubesphere.io/creator: \"stone-ns-admin\"  # Required for tenant-created resources\nspec:\n  type: multi-branch-pipeline\n  multi_branch_pipeline:\n    name: demo-jenkinsfiles-go\n    description: \"Multi-branch Go pipeline\"\n    source_type: git\n    git_source:\n      url: https://github.com/kubesphere/demo-jenkinsfiles\n      credential_id: \"\"  # Empty for public repos\n      discover_branches: true\n      discover_tags: false\n    script_path: go/Jenkinsfile  # Path to Jenkinsfile in repo\n```\n\n**Step 3b: For Private Repository (with credential):\n```yaml\napiVersion: devops.kubesphere.io/v1alpha3\nkind: Pipeline\nmetadata:\n  name: private-repo-pipeline\n  namespace: demo-project\n  annotations:\n    kubesphere.io/creator: \"stone-ns-admin\"\nspec:\n  type: multi-branch-pipeline\n  multi_branch_pipeline:\n    name: private-repo-pipeline\n    description: \"Pipeline for private repository\"\n    source_type: git\n    git_source:\n      url: https://github.com/org/private-repo.git\n      credential_id: \"github-token\"  # Reference to DevOps credential\n      discover_branches: true\n      discover_tags: false\n    script_path: Jenkinsfile\n```\n\n**Complete Flow for Private Repo:**\n1. **Ask user** if repository is private (ALWAYS do this first)\n2. **Create credential** (`basic-auth` type with GitHub PAT)\n3. **(Optional) Create GitRepository** CR (with `provider` and `secret` fields)\n4. **Create multi-branch pipeline** referencing the credential in `git_source.credential_id`\n\n**Important:** Never use `GITHUB_` env vars directly in the pipeline spec. Always create proper DevOps credentials.\n\n**SCM Source Types:**\n\n| Type | Field | Use Case |\n|------|-------|----------|\n| Git | `git_source` | Generic Git repositories |\n| GitHub | `github_source` | GitHub.com or GitHub Enterprise |\n| GitLab | `gitlab_source` | GitLab.com or self-hosted GitLab |\n| SVN | `svn_source` | Subversion repositories |\n\n### Trigger Multi-Branch Pipeline Run\n\n```yaml\napiVersion: devops.kubesphere.io/v1alpha3\nkind: PipelineRun\nmetadata:\n  name: demo-jenkinsfiles-go-main-run\n  namespace: demo-project\nspec:\n  pipelineRef:\n    name: demo-jenkinsfiles-go\n  scm:\n    refName: main    # Branch name\n    refType: branch  # or 'tag'\n```\n\n### Check Discovered Branches\n\n**Via v1alpha3 API (preferred):**\n```bash\ncurl -s \"${KUBESPHERE_API}/clusters/${CLUSTER}/kapis/devops.kubesphere.io/v1alpha3/namespaces/${DEVOPS_PROJECT}/pipelines/${PIPELINE_NAME}/branches?filter=origin&page=1&limit=10\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\" \\\n  -H \"Content-Type: application/json\" | jq -r '.items[] | \"- Branch: \\(.name) | Latest Run: \\(.latestRun.id // \"N/A\") | Status: \\(.latestRun.result // \"N/A\")\"'\n```\n\n**Via Jenkins (admin only):**\n```bash\nkubectl run curl-jenkins --rm -i --restart=Never --image=curlimages/curl \\\n  -- \"http://admin:${TOKEN}@devops-jenkins.kubesphere-devops-system:80/job/demo-project/job/demo-jenkinsfiles-go/api/json\"\n```\n\n### Trigger Repository Scanning\n\n> **Note**: Repository scanning uses **v1alpha2** API (not v1alpha3). This is an exception to the general rule of preferring v1alpha3.\n\n**Step 1: Trigger Scan**\n```bash\ncurl -X POST \"${KUBESPHERE_API}/clusters/${CLUSTER}/kapis/devops.kubesphere.io/v1alpha2/namespaces/${DEVOPS_PROJECT}/pipelines/${PIPELINE_NAME}/scan\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'\n```\n\n**Step 2: Fetch Scanning Log**\n```bash\ncurl -s \"${KUBESPHERE_API}/clusters/${CLUSTER}/kapis/devops.kubesphere.io/v1alpha2/namespaces/${DEVOPS_PROJECT}/pipelines/${PIPELINE_NAME}/consolelog\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\"\n```\n\n**When to use:**\n- Force immediate repository re-scan\n- Discover new branches that aren't showing up\n- Troubleshoot branch detection issues\n\n**Example scanning log output:**\n```\nStarted by user admin\nStarting branch indexing...\n > git ls-remote --symref -- https://github.com/org/repo.git\nChecking branches:\n  Checking branch main ✓\n      'Jenkinsfile' found\n    Met criteria\n  Checking branch feature-x ✓\n      'Jenkinsfile' found\n    Met criteria\n  Checking branch old-branch\n      'Jenkinsfile' not found\n    Does not meet criteria\nProcessed 3 branches\nFinished branch indexing. Indexing took 3 sec\nFinished: SUCCESS\n```\n\n### Complete Private Repo Setup Example\n\n**Scenario:** Create a multi-branch pipeline for a private GitHub repository with proper authentication.\n\n**Step 1: Ask User About Repository Type**\n```\nQuestion: \"Is https://github.com/stoneshi-yunify/jenkinsfiles a private repository?\"\nUser Answer: \"Yes\"\n```\n\n**Step 2: Create GitHub Credential**\n```bash\nexport KUBESPHERE_API=\"http://kubesphere-apiserver:80\"\nexport API_TOKEN=\"<tenant-oauth-token>\"\nexport DEVOPS_PROJECT=\"devopstestc2nj7\"\nexport USERNAME=\"stone-ns-admin\"\nexport GITHUB_PAT=\"ghp_xxxxxxxxxxxxxxxxxxxx\"\n\ncurl -s -X POST \"${KUBESPHERE_API}/clusters/member-1/kapis/devops.kubesphere.io/v1alpha3/namespaces/${DEVOPS_PROJECT}/credentials\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"apiVersion\": \"v1\",\n    \"kind\": \"Secret\",\n    \"metadata\": {\n      \"name\": \"github-token\",\n      \"namespace\": \"'${DEVOPS_PROJECT}'\",\n      \"annotations\": {\n        \"kubesphere.io/creator\": \"'${USERNAME}'\",\n        \"credential.devops.kubesphere.io/type\": \"basic-auth\"\n      }\n    },\n    \"stringData\": {\n      \"username\": \"git\",\n      \"password\": \"'${GITHUB_PAT}'\"\n    },\n    \"type\": \"credential.devops.kubesphere.io/basic-auth\"\n  }'\n```\n\n**Step 3: Create Multi-Branch Pipeline with Credential**\n```bash\ncurl -s -X POST \"${KUBESPHERE_API}/clusters/member-1/kapis/devops.kubesphere.io/v1alpha3/namespaces/${DEVOPS_PROJECT}/pipelines\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"apiVersion\": \"devops.kubesphere.io/v1alpha3\",\n    \"kind\": \"Pipeline\",\n    \"metadata\": {\n      \"name\": \"echo-jenkinsfile-pipeline\",\n      \"namespace\": \"'${DEVOPS_PROJECT}'\",\n      \"annotations\": {\n        \"kubesphere.io/creator\": \"'${USERNAME}'\"\n      }\n    },\n    \"spec\": {\n      \"type\": \"multi-branch-pipeline\",\n      \"multi_branch_pipeline\": {\n        \"name\": \"echo-jenkinsfile-pipeline\",\n        \"description\": \"Multi-branch pipeline with GitHub auth\",\n        \"source_type\": \"git\",\n        \"git_source\": {\n          \"url\": \"https://github.com/stoneshi-yunify/jenkinsfiles.git\",\n          \"credential_id\": \"github-token\",\n          \"discover_branches\": true,\n          \"discover_tags\": false\n        },\n        \"script_path\": \"echo/Jenkinsfile\"\n      }\n    }\n  }'\n```\n\n**Note:** The `kubesphere.io/creator` annotation is **required** for all pipelines (both regular and multi-branch). Without it, the pipeline may not appear correctly in the KubeSphere UI.\n\n**Step 4: Verify Creation**\n```bash\ncurl -s \"${KUBESPHERE_API}/clusters/member-1/kapis/devops.kubesphere.io/v1alpha3/namespaces/${DEVOPS_PROJECT}/pipelines/echo-jenkinsfile-pipeline\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\" | jq -r '{\n    name: .metadata.name,\n    syncStatus: .metadata.annotations.\"pipeline.devops.kubesphere.io/syncstatus\",\n    credential: .spec.multi_branch_pipeline.git_source.credential_id\n  }'\n```\n\nExpected output:\n```json\n{\n  \"name\": \"echo-jenkinsfile-pipeline\",\n  \"syncStatus\": \"successful\",\n  \"credential\": \"github-token\"\n}\n```\n\n---\n\n### Complete Multi-Branch Workflow Example\n\n**Scenario:** Trigger build, monitor, retrieve logs, and download artifacts.\n\n**Step 1: Check Pipeline Exists**\n```bash\nkubectl get pipelines -n demo-project\n# NAME                   TYPE                    AGE\n# demo-jenkinsfiles-go   multi-branch-pipeline   12d\n```\n\n**Step 2: Trigger Build via Jenkins API**\n```bash\n# Get token\nTOKEN=$(kubectl -n kubesphere-devops-system get secret devops-jenkins -o jsonpath='{.data.jenkins-admin-token}' | base64 -d)\n\n# Trigger main branch build\nkubectl run curl-trigger --rm -i --restart=Never --image=curlimages/curl \\\n  -- \"http://admin:${TOKEN}@devops-jenkins.kubesphere-devops-system:80/job/demo-project/job/demo-jenkinsfiles-go/job/main/build\" \\\n  -X POST -w \"\\nHTTP Status: %{http_code}\\n\"\n\n# Expected: HTTP Status: 201\n```\n\n**Step 3: Monitor Build Status**\n```bash\n# Check PipelineRun created\nkubectl get pipelineruns -n demo-project --sort-by=.metadata.creationTimestamp | tail -3\n\n# Example output:\n# demo-jenkinsfiles-go-vf8p5       3     Succeeded   2m\n\n# Get detailed status\n# Or check via Jenkins API\nkubectl run curl-status --rm -i --restart=Never --image=curlimages/curl \\\n  -- \"http://admin:${TOKEN}@devops-jenkins.kubesphere-devops-system:80/job/demo-project/job/demo-jenkinsfiles-go/job/main/3/api/json\" \\\n  | grep -E '\"result\"|\"building\"|\"duration\"'\n```\n\n**Step 4: Retrieve Console Log**\n```bash\n# Get full console log from build #3\nkubectl run curl-log --rm -i --restart=Never --image=curlimages/curl \\\n  -- \"http://admin:${TOKEN}@devops-jenkins.kubesphere-devops-system:80/job/demo-project/job/demo-jenkinsfiles-go/job/main/3/consoleText\"\n\n# Look for:\n# [Pipeline] Start of Pipeline\n# [Pipeline] { (Clone Repository)\n# [Pipeline] { (Run Tests)\n# === RUN   TestHello\n# --- PASS: TestHello (0.00s)\n# [Pipeline] End of Pipeline\n# Finished: SUCCESS\n```\n\n**Step 5: Download Build Artifacts**\n\nFor binary artifacts, use pod-based download:\n\n```bash\n# Create download pod\nkubectl run artifact-downloader --image=curlimages/curl -- sleep 300\nkubectl wait --for=condition=Ready pod/artifact-downloader --timeout=60s\n\n# Download artifact inside pod\nTOKEN=$(kubectl -n kubesphere-devops-system get secret devops-jenkins -o jsonpath='{.data.jenkins-admin-token}' | base64 -d)\nkubectl exec artifact-downloader -- sh -c \\\n  \"curl -s -o /tmp/service 'http://admin:${TOKEN}@devops-jenkins.kubesphere-devops-system:80/job/demo-project/job/demo-jenkinsfiles-go/job/main/3/artifact/service'\"\n\n# Copy to local\nkubectl cp artifact-downloader:/tmp/service /tmp/service\n\n# Clean up\nkubectl delete pod artifact-downloader --force\n```\n\n**Step 6: Verify Downloaded Artifact**\n```bash\n# Check file details\nls -lh /tmp/service\nfile /tmp/service\n\n# Expected output:\n# /tmp/service: ELF 64-bit LSB executable, x86-64...\n\n# Make executable and test\nchmod +x /tmp/service\n/tmp/service --help\n```\n\n**Build Summary Example:**\n```\nBuild #3 Summary:\n- Status: SUCCESS\n- Duration: ~54 seconds\n- Test Results: 1/1 passed\n- Artifact: service (8.0 MB Go binary)\n- Stages: Checkout → Clone → Dependencies → Test → Build → Archive\n```\n\n### Multi-Branch vs Regular Pipeline\n\n| Feature | Regular Pipeline | Multi-Branch Pipeline |\n|---------|------------------|----------------------|\n| Type | `pipeline` | `multi-branch-pipeline` |\n| Jenkinsfile | Inline in CRD | From SCM (`script_path`) |\n| Branches | Single | Auto-discovered |\n| SCM Config | Manual checkout | Automatic |\n| Trigger | PipelineRun/API | Branch indexing + webhooks |\n| Get Parameters | From `.spec.pipeline.jenkinsfile` | From `/branches/{branch}` endpoint |\n\n## Triggering Regular Pipeline Runs with Parameters (v1alpha3 API)\n\nFor regular pipelines, use this **two-step procedure** to handle parameters:\n\n### Step 1: Get Pipeline Definition and Extract Parameters\n\nUnlike multi-branch pipelines, regular pipelines don't have a dedicated `/parameters` endpoint. Instead, retrieve the Pipeline CR and extract parameters from the Jenkinsfile:\n\n```bash\n# Get the pipeline definition\ncurl -s \"${KUBESPHERE_API}/clusters/${CLUSTER}/kapis/devops.kubesphere.io/v1alpha3/namespaces/${DEVOPS_PROJECT}/pipelines/${PIPELINE_NAME}\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\" \\\n  -H \"Content-Type: application/json\" | jq -r '.spec.pipeline.jenkinsfile'\n```\n\n**Look for the `parameters {}` directive in the Jenkinsfile:**\n\n```groovy\npipeline {\n  agent any\n  stages {\n    stage('Example') {\n      steps {\n        echo \"Hello ${params.PERSON}\"\n      }\n    }\n  }\n  \n  parameters {\n    string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')\n    booleanParam(name: 'TOGGLE', defaultValue: true, description: 'Toggle this value')\n    choice(name: 'CHOICE', choices: ['One', 'Two', 'Three'], description: 'Pick something')\n  }\n}\n```\n\n**Parameter Types in Jenkinsfile:**\n\n| Directive | Type | Example |\n|-----------|------|---------|\n| `string()` | Single-line text | `string(name: 'VAR', defaultValue: 'default', description: '...')` |\n| `text()` | Multi-line text | `text(name: 'VAR', defaultValue: '', description: '...')` |\n| `booleanParam()` | True/false | `booleanParam(name: 'FLAG', defaultValue: true, description: '...')` |\n| `choice()` | Dropdown | `choice(name: 'ENV', choices: ['dev', 'prod'], description: '...')` |\n| `password()` | Hidden value | `password(name: 'SECRET', defaultValue: '', description: '...')` |\n\n### Step 2: Trigger Pipeline with Parameters\n\nUse the `/pipelineruns` endpoint to create a new run with parameters:\n\n```bash\n# Trigger with parameters\ncurl -s -X POST \"${KUBESPHERE_API}/clusters/${CLUSTER}/kapis/devops.kubesphere.io/v1alpha3/namespaces/${DEVOPS_PROJECT}/pipelines/${PIPELINE_NAME}/pipelineruns\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"parameters\": [\n      {\"name\": \"PERSON\", \"value\": \"John Doe\"},\n      {\"name\": \"TOGGLE\", \"value\": \"true\"},\n      {\"name\": \"CHOICE\", \"value\": \"Two\"}\n    ]\n  }' | jq -r '.metadata.name'\n```\n\n**Key Points:**\n- No branch query parameter needed (regular pipelines have no branches)\n- Parameters are passed in the request body as a JSON array\n- Boolean values must be strings: `\"true\"` or `\"false\"`\n- The response includes the created PipelineRun resource with your parameters\n\n### Complete Example for Regular Pipelines\n\n```bash\n#!/bin/bash\nexport KUBESPHERE_API=\"http://kubesphere-apiserver:80\"\nexport API_TOKEN=\"<tenant-oauth-token>\"\nexport DEVOPS_PROJECT=\"devopstestc2nj7\"\nexport PIPELINE_NAME=\"my-regular-pipeline\"\n\n# Step 1: Get pipeline definition and check for parameters\necho \"Checking for parameters in pipeline...\"\nJENKINSFILE=$(curl -s \"${KUBESPHERE_API}/clusters/${CLUSTER}/kapis/devops.kubesphere.io/v1alpha3/namespaces/${DEVOPS_PROJECT}/pipelines/${PIPELINE_NAME}\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\" | jq -r '.spec.pipeline.jenkinsfile')\n\n# Check if parameters exist\nif echo \"$JENKINSFILE\" | grep -q \"parameters {\"; then\n  echo \"Pipeline has parameters defined. Extracting...\"\n  # In practice, parse the Jenkinsfile to extract parameter names and defaults\n  echo \"$JENKINSFILE\" | grep -E \"(string|booleanParam|choice|password|text)\\(name:\"\nelse\n  echo \"No parameters found. Triggering without parameters.\"\nfi\n\n# Step 2: Trigger with parameters\necho \"Triggering pipeline with parameters...\"\ncurl -s -X POST \"${KUBESPHERE_API}/clusters/${CLUSTER}/kapis/devops.kubesphere.io/v1alpha3/namespaces/${DEVOPS_PROJECT}/pipelines/${PIPELINE_NAME}/pipelineruns\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"parameters\": [\n      {\"name\": \"PERSON\", \"value\": \"Test User\"},\n      {\"name\": \"TOGGLE\", \"value\": \"true\"},\n      {\"name\": \"CHOICE\", \"value\": \"Two\"},\n      {\"name\": \"BIOGRAPHY\", \"value\": \"Testing API\"},\n      {\"name\": \"PASSWORD\", \"value\": \"secret123\"}\n    ]\n  }' | jq -r '.metadata.name'\n```\n\n## Triggering Multi-Branch Pipeline Runs (v1alpha3 API)\n\n> ⚠️ **API Version Notice**: The `/kapis/devops.kubesphere.io/v1alpha2/` APIs are deprecated. Always prefer `v1alpha3` APIs when available.\n\nFor multi-branch pipelines, use this **three-step procedure** with v1alpha3 APIs:\n\n### Step 1: List Available Branches\n\n```bash\ncurl -s \"${KUBESPHERE_API}/clusters/${CLUSTER}/kapis/devops.kubesphere.io/v1alpha3/namespaces/${DEVOPS_PROJECT}/pipelines/${PIPELINE_NAME}/branches?filter=origin&page=1&limit=10\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\" \\\n  -H \"Content-Type: application/json\" | jq -r '.items[] | \"- Branch: \\(.name) | Latest Run: \\(.latestRun.id // \"N/A\") | Status: \\(.latestRun.result // \"N/A\")\"'\n```\n\nExample output:\n```\n- Branch: main | Latest Run: 2 | Status: SUCCESS\n- Branch: stone | Latest Run: 1 | Status: SUCCESS\n```\n\n### Step 2: Ask User Which Branch to Build\n\nPresent the available branches to the user and ask:\n> \"Which branch would you like to build?\"\n\n### Step 3: Trigger Build on Selected Branch\n\n```bash\nexport BRANCH=\"main\"  # User's selection\n\ncurl -s -X POST \"${KUBESPHERE_API}/clusters/${CLUSTER}/kapis/devops.kubesphere.io/v1alpha3/namespaces/${DEVOPS_PROJECT}/pipelines/${PIPELINE_NAME}/pipelineruns?branch=${BRANCH}\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"parameters\":[]}' | jq -r '.metadata.name'\n```\n\n**Key Points:**\n- Use `v1alpha3` endpoint (not v1alpha2)\n- Pass branch as query parameter `?branch=${BRANCH}`\n- Returns a PipelineRun resource (Kubernetes CRD format)\n- The PipelineRun name is auto-generated with the pipeline name as prefix\n\n### Triggering with Parameters\n\nWhen a pipeline has parameters defined in the Jenkinsfile, you can provide values when triggering a build. Follow this workflow:\n\n#### Step 1: Get Available Parameters\n\nQuery the branch to retrieve parameter definitions:\n\n```bash\ncurl -s \"${KUBESPHERE_API}/clusters/${CLUSTER}/kapis/devops.kubesphere.io/v1alpha3/namespaces/${DEVOPS_PROJECT}/pipelines/${PIPELINE_NAME}/branches/${BRANCH}\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\" \\\n  -H \"Content-Type: application/json\" | jq '.parameters'\n```\n\n**Example Response:**\n```json\n[\n  {\n    \"description\": \"Who should I say hello to?\",\n    \"name\": \"PERSON\",\n    \"type\": \"StringParameterDefinition\",\n    \"value\": \"\",\n    \"defaultParameterValue\": {\n      \"name\": \"PERSON\",\n      \"value\": \"Mr Jenkins\"\n    }\n  },\n  {\n    \"description\": \"Toggle this value\",\n    \"name\": \"TOGGLE\",\n    \"type\": \"BooleanParameterDefinition\",\n    \"value\": \"\",\n    \"defaultParameterValue\": {\n      \"name\": \"TOGGLE\",\n      \"value\": true\n    }\n  },\n  {\n    \"description\": \"Pick something\",\n    \"name\": \"CHOICE\",\n    \"type\": \"ChoiceParameterDefinition\",\n    \"value\": \"\",\n    \"defaultParameterValue\": {\n      \"name\": \"CHOICE\",\n      \"value\": \"One\"\n    },\n    \"choices\": [\"One\", \"Two\", \"Three\"]\n  }\n]\n```\n\n**Parameter Types:**\n\n| Type | Description | Value Format |\n|------|-------------|--------------|\n| `StringParameterDefinition` | Single-line text | `\"value\": \"text\"` |\n| `TextParameterDefinition` | Multi-line text | `\"value\": \"multi\\\\nline\"` |\n| `BooleanParameterDefinition` | True/false toggle | `\"value\": \"true\"` or `\"value\": \"false\"` |\n| `ChoiceParameterDefinition` | Predefined options | `\"value\": \"Option\"` (must match one of `choices`) |\n| `PasswordParameterDefinition` | Hidden value | `\"value\": \"secret\"` |\n\n#### Step 2: Build Parameters Array\n\nCreate the parameters JSON array with user-provided values:\n\n```bash\n# Example parameters\ncat > params.json << 'EOF'\n{\n  \"parameters\": [\n    {\"name\": \"PERSON\", \"value\": \"stone\"},\n    {\"name\": \"BIOGRAPHY\", \"value\": \"i'm a software engineer\"},\n    {\"name\": \"TOGGLE\", \"value\": \"true\"},\n    {\"name\": \"CHOICE\", \"value\": \"Two\"},\n    {\"name\": \"PASSWORD\", \"value\": \"secret123\"}\n  ]\n}\nEOF\n```\n\n**Important:**\n- Boolean values must be strings: `\"true\"` or `\"false\"`\n- Use the `name` field, not the description\n- Omit parameters to use their default values\n\n#### Step 3: Trigger Build with Parameters\n\n```bash\nexport BRANCH=\"main\"\n\n# Trigger with parameters\ncurl -s -X POST \"${KUBESPHERE_API}/clusters/${CLUSTER}/kapis/devops.kubesphere.io/v1alpha3/namespaces/${DEVOPS_PROJECT}/pipelines/${PIPELINE_NAME}/pipelineruns?branch=${BRANCH}\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d @params.json | jq -r '.metadata.name'\n```\n\n#### Complete Parameterized Build Example\n\n```bash\n#!/bin/bash\nexport KUBESPHERE_API=\"http://kubesphere-apiserver:80\"\nexport API_TOKEN=\"<tenant-oauth-token>\"\nexport DEVOPS_PROJECT=\"devopstestc2nj7\"\nexport PIPELINE_NAME=\"echo-jenkinsfile-pipeline\"\nexport BRANCH=\"main\"\n\n# Step 1: Get parameters\necho \"Fetching parameter definitions...\"\nPARAMS=$(curl -s \"${KUBESPHERE_API}/clusters/member-1/kapis/devops.kubesphere.io/v1alpha3/namespaces/${DEVOPS_PROJECT}/pipelines/${PIPELINE_NAME}/branches/${BRANCH}\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\")\n\necho \"Available parameters:\"\necho \"$PARAMS\" | jq -r '.parameters[] | \"- \\(.name) (\\(.type)): \\(.description // \"No description\") [Default: \\(.defaultParameterValue.value // \"(none)\")]\"'\n\n# Step 2: Ask user for values (or use defaults)\n# In practice, prompt user or read from input\n\n# Step 3: Build and trigger with parameters\necho \"Triggering build with parameters...\"\ncurl -s -X POST \"${KUBESPHERE_API}/clusters/member-1/kapis/devops.kubesphere.io/v1alpha3/namespaces/${DEVOPS_PROJECT}/pipelines/${PIPELINE_NAME}/pipelineruns?branch=${BRANCH}\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"parameters\": [\n      {\"name\": \"PERSON\", \"value\": \"stone\"},\n      {\"name\": \"BIOGRAPHY\", \"value\": \"software engineer\"},\n      {\"name\": \"TOGGLE\", \"value\": \"true\"},\n      {\"name\": \"CHOICE\", \"value\": \"Two\"},\n      {\"name\": \"PASSWORD\", \"value\": \"secret123\"}\n    ]\n  }' | jq -r '.metadata.name'\n```\n\n### Complete Working Example\n\n```bash\n#!/bin/bash\nexport KUBESPHERE_API=\"http://kubesphere-apiserver:80\"\nexport API_TOKEN=\"<oauth-token>\"\nexport DEVOPS_PROJECT=\"devopstestc2nj7\"\nexport PIPELINE_NAME=\"echo-jenkinsfile-pipeline\"\n\n# Step 1: List branches\necho \"Available branches:\"\ncurl -s \"${KUBESPHERE_API}/clusters/member-1/kapis/devops.kubesphere.io/v1alpha3/namespaces/${DEVOPS_PROJECT}/pipelines/${PIPELINE_NAME}/branches?filter=origin&page=1&limit=10\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\" \\\n  -H \"Content-Type: application/json\" | jq -r '.items[] | \"  - \\(.name)\"'\n\n# Step 2: User selects branch (example: main)\nBRANCH=\"main\"\n\n# Step 3: Trigger build\necho \"Triggering build on branch: ${BRANCH}\"\nPIPELINE_RUN=$(curl -s -X POST \"${KUBESPHERE_API}/clusters/member-1/kapis/devops.kubesphere.io/v1alpha3/namespaces/${DEVOPS_PROJECT}/pipelines/${PIPELINE_NAME}/pipelineruns?branch=${BRANCH}\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"parameters\":[]}')\n\nRUN_NAME=$(echo \"$PIPELINE_RUN\" | jq -r '.metadata.name')\necho \"PipelineRun created: ${RUN_NAME}\"\n```\n\n---\n\n## Alternative: API Endpoints (Deprecated v1alpha2)\n\n> ⚠️ **Deprecated**: The `/kapis/devops.kubesphere.io/v1alpha2/` APIs are deprecated. Use `v1alpha3` APIs shown above.\n\nUse APIs when you need programmatic access from external systems:\n\n### Pipeline CRUD Operations\n\n| Operation | Method | Endpoint | Status |\n|-----------|--------|----------|--------|\n| List Pipelines | GET | `/kapis/devops.kubesphere.io/v1alpha2/search?q=type:pipeline` | Deprecated |\n| Get Pipeline | GET | `/kapis/devops.kubesphere.io/v1alpha2/namespaces/{devops}/pipelines/{pipeline}` |\n| List Runs | GET | `/kapis/devops.kubesphere.io/v1alpha2/namespaces/{devops}/pipelines/{pipeline}/runs` |\n| Run Pipeline (API) | POST | `/kapis/devops.kubesphere.io/v1alpha2/namespaces/{devops}/pipelines/{pipeline}/runs` |\n| Get Run | GET | `/kapis/devops.kubesphere.io/v1alpha2/namespaces/{devops}/pipelines/{pipeline}/runs/{run}` |\n| Stop Run | POST | `/kapis/devops.kubesphere.io/v1alpha2/namespaces/{devops}/pipelines/{pipeline}/runs/{run}/stop` |\n| Get Log | GET | `/kapis/devops.kubesphere.io/v1alpha2/namespaces/{devops}/pipelines/{pipeline}/runs/{run}/log?start=0` | Use `?start=0` for tenant access |\n| Get Artifacts | GET | `/kapis/devops.kubesphere.io/v1alpha2/namespaces/{devops}/pipelines/{pipeline}/runs/{run}/artifacts` |\n\n### API Run Example\n\n```bash\ncurl -X POST \"https://kubesphere-api/kapis/devops.kubesphere.io/v1alpha2/namespaces/{devops}/pipelines/{pipeline}/runs\" \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"parameters\": [\n      {\"name\": \"BRANCH\", \"value\": \"main\"}\n    ]\n  }'\n```\n\n## Pipeline Run Flow\n\n```\n┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐\n│  Queue   │───▶│  Running │───▶│ Complete │───▶│  Success │\n└──────────┘    └──────────┘    └──────────┘    └──────────┘\n                      │                │\n                      ▼                ▼\n               ┌──────────┐     ┌──────────┐\n               │ Paused   │     │  Failed  │\n               │ (Input)  │     │          │\n               └──────────┘     └──────────┘\n```\n\n## Pipeline Status Values\n\n| Status | Meaning |\n|--------|---------|\n| **QUEUED** | Waiting for available agent |\n| **RUNNING** | Currently executing |\n| **PAUSED** | Waiting for user input |\n| **SUCCESS** | Completed successfully |\n| **FAILED** | Failed during execution |\n| **ABORTED** | Manually stopped |\n\n## Handling Paused Pipeline Steps with Input\n\nWhen a pipeline reaches an `input` step (e.g., approval gates), it enters the **PAUSED** state and waits for user interaction. Tenants can approve or reject these steps via the KubeSphere API.\n\n### Step 1: Get Node Details to Find Input Step\n\nUse the `nodedetails` endpoint to identify the paused step with input:\n\n```bash\n# Get node details for the pipeline run\ncurl -s \"${KUBESPHERE_API}/clusters/${CLUSTER}/kapis/devops.kubesphere.io/v1alpha3/namespaces/${DEVOPS_PROJECT}/pipelineruns/${PIPELINE_RUN_NAME}/nodedetails\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\" \\\n  -H \"Content-Type: application/json\" | jq '.[-1]'\n```\n\n**Look for steps with `approvable: true`:**\n\n```json\n{\n  \"displayName\": \"Build Binary\",\n  \"id\": \"38\",\n  \"state\": \"PAUSED\",\n  \"steps\": [\n    {\n      \"id\": \"41\",\n      \"displayName\": \"Wait for interactive input\",\n      \"state\": \"PAUSED\",\n      \"input\": {\n        \"id\": \"Build-binary-confirm\",\n        \"message\": \"Build binary now?\",\n        \"ok\": \"Proceed\"\n      },\n      \"approvable\": true\n    }\n  ]\n}\n```\n\n**Key Fields:**\n| Field | Description |\n|-------|-------------|\n| `steps[].id` | Step ID (e.g., \"41\") |\n| `steps[].input.id` | Input action ID (e.g., \"Build-binary-confirm\") |\n| `steps[].approvable` | `true` if this step can be approved/rejected |\n\n### Step 2: Approve or Reject the Input Step\n\nUse the v1alpha2 API to submit your decision:\n\n**Approve (Proceed):**\n```bash\ncurl -s -X POST \"${KUBESPHERE_API}/clusters/${CLUSTER}/kapis/devops.kubesphere.io/v1alpha2/namespaces/${DEVOPS_PROJECT}/pipelines/${PIPELINE_NAME}/branches/${BRANCH}/runs/${JENKINS_RUN_ID}/nodes/${NODE_ID}/steps/${STEP_ID}/\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"id\":\"${INPUT_ID}\",\"abort\":false}'\n```\n\n**Reject (Abort):**\n```bash\ncurl -s -X POST \"${KUBESPHERE_API}/clusters/${CLUSTER}/kapis/devops.kubesphere.io/v1alpha2/namespaces/${DEVOPS_PROJECT}/pipelines/${PIPELINE_NAME}/branches/${BRANCH}/runs/${JENKINS_RUN_ID}/nodes/${NODE_ID}/steps/${STEP_ID}/\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"id\":\"${INPUT_ID}\",\"abort\":true}'\n```\n\n**Parameters:**\n| Parameter | Description | Example |\n|-----------|-------------|---------|\n| `JENKINS_RUN_ID` | Jenkins build number | `9` |\n| `NODE_ID` | Stage/node ID from nodedetails | `38` |\n| `STEP_ID` | Step ID from nodedetails | `41` |\n| `INPUT_ID` | Input ID from the `input` object | `Build-binary-confirm` |\n| `abort` | `false` to proceed, `true` to abort | `false` |\n\n### Complete Example\n\n```bash\nexport KUBESPHERE_API=\"http://kubesphere-apiserver:80\"\nexport API_TOKEN=\"<tenant-oauth-token>\"\nexport DEVOPS_PROJECT=\"devopstestc2nj7\"\nexport PIPELINE_NAME=\"echo-jenkinsfile-pipeline\"\nexport BRANCH=\"main\"\nexport PIPELINE_RUN_NAME=\"echo-jenkinsfile-pipeline-ndrkn\"\n\n# Step 1: Get nodedetails and extract input information\nNODES=$(curl -s \"${KUBESPHERE_API}/clusters/member-1/kapis/devops.kubesphere.io/v1alpha3/namespaces/${DEVOPS_PROJECT}/pipelineruns/${PIPELINE_RUN_NAME}/nodedetails\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\")\n\n# Extract the last node (current stage) and find approvable step\nNODE_ID=$(echo \"$NODES\" | jq -r '.[-1].id')\nSTEP_ID=$(echo \"$NODES\" | jq -r '.[-1].steps[] | select(.approvable == true) | .id')\nINPUT_ID=$(echo \"$NODES\" | jq -r '.[-1].steps[] | select(.approvable == true) | .input.id')\nJENKINS_RUN_ID=$(echo \"$NODES\" | jq -r '.[-1].steps[] | select(.approvable == true) | .jenkinsRunId // \"9\"')\n\necho \"Approving step ${STEP_ID} in node ${NODE_ID}\"\necho \"Input ID: ${INPUT_ID}\"\n\n# Step 2: Approve the step\ncurl -s -X POST \"${KUBESPHERE_API}/clusters/member-1/kapis/devops.kubesphere.io/v1alpha2/namespaces/${DEVOPS_PROJECT}/pipelines/${PIPELINE_NAME}/branches/${BRANCH}/runs/${JENKINS_RUN_ID}/nodes/${NODE_ID}/steps/${STEP_ID}/\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d \"{\\\"id\\\":\\\"${INPUT_ID}\\\",\\\"abort\\\":false}\"\n\n# Step 3: Verify the pipeline continues\necho \"Pipeline resumed. Check status...\"\n```\n\n**Important Notes:**\n- This approach works for **tenants** (no cluster-admin access required)\n- Uses **v1alpha2** API for the approval action (not available in v1alpha3)\n- The trailing slash `/` in the URL is required\n- Empty response usually indicates success (HTTP 200)\n\n## Retrieving Build Logs via KubeSphere API\n\nTo retrieve build logs through the KubeSphere API (recommended for tenants):\n\n### Step 1: Get Jenkins PipelineRun ID\n\nFirst, get the Jenkins PipelineRun ID from the PipelineRun CR annotation:\n\n```bash\n# Get fresh token\nTOKEN_RESPONSE=$(curl -s -X POST \"${KUBESPHERE_API}/oauth/token\" \\\n  -H \"Content-Type: application/x-www-form-urlencoded\" \\\n  --data-urlencode 'grant_type=password' \\\n  --data-urlencode \"username=${USERNAME}\" \\\n  --data-urlencode \"password=${PASSWORD}\" \\\n  --data-urlencode 'client_id=kubesphere' \\\n  --data-urlencode 'client_secret=kubesphere')\n\nexport API_TOKEN=$(echo \"$TOKEN_RESPONSE\" | jq -r '.access_token')\n\n# Get Jenkins PipelineRun ID from annotation\nJENKINS_ID=$(curl -s \"${KUBESPHERE_API}/clusters/${CLUSTER}/kapis/devops.kubesphere.io/v1alpha3/namespaces/${DEVOPS_PROJECT}/pipelineruns/${PIPELINE_RUN_NAME}\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\" \\\n  | jq -r '.metadata.annotations.\"devops.kubesphere.io/jenkins-pipelinerun-id\"')\n\necho \"Jenkins Run ID: $JENKINS_ID\"\n```\n\n### Step 2: Fetch Logs\n\nUse the v1alpha2 API to fetch logs. **Note:** The `?start=0` parameter is required for tenant access:\n\n```bash\n# For multi-branch pipelines\ncurl -s \"${KUBESPHERE_API}/clusters/${CLUSTER}/kapis/devops.kubesphere.io/v1alpha2/namespaces/${DEVOPS_PROJECT}/pipelines/${PIPELINE_NAME}/branches/${BRANCH}/runs/${JENKINS_ID}/log/?start=0\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\"\n\n# Example:\ncurl -s \"${KUBESPHERE_API}/clusters/member-1/kapis/devops.kubesphere.io/v1alpha2/namespaces/devopstestc2nj7/pipelines/echo-jenkinsfile-pipeline/branches/main/runs/5/log/?start=0\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\"\n```\n\n**Key Points:**\n- Use the `jenkins-pipelinerun-id` annotation (not the Kubernetes PipelineRun name)\n- For multi-branch pipelines: include `/branches/{branch}/` in the path\n- **CRITICAL:** Include `?start=0` query parameter - required for tenant access\n- The trailing slash `/` at the end of the URL path is required\n- Works with tenant credentials (no cluster-admin access needed)\n\n## Retrieving Build Artifacts via KubeSphere API\n\nTo query and download build artifacts through the KubeSphere API:\n\n### Step 1: List Artifacts\n\nQuery artifacts for a specific run:\n\n```bash\ncurl -s \"${KUBESPHERE_API}/clusters/${CLUSTER}/kapis/devops.kubesphere.io/v1alpha2/namespaces/${DEVOPS_PROJECT}/pipelines/${PIPELINE_NAME}/branches/${BRANCH}/runs/${JENKINS_ID}/artifacts/?start=0&limit=10\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\"\n```\n\n**Example Response:**\n```json\n[\n  {\n    \"name\": \"service\",\n    \"path\": \"service\",\n    \"size\": 8344228,\n    \"downloadable\": true,\n    \"url\": \"/job/devopstestc2nj7/job/go-pipeline/job/main/2/artifact/service\"\n  }\n]\n```\n\n### Step 2: Download Artifact\n\nDownload a specific artifact by filename:\n\n```bash\ncurl -s -o service \"${KUBESPHERE_API}/kapis/clusters/${CLUSTER}/devops.kubesphere.io/v1alpha3/namespaces/${DEVOPS_PROJECT}/pipelineruns/${PIPELINE_RUN_NAME}/artifacts/download?filename=service\" \\\n  -H \"Authorization: Bearer ${API_TOKEN}\"\n```\n\n**Key Points:**\n- Use the **Kubernetes PipelineRun name** (not Jenkins ID) for the download endpoint\n- The filename must match exactly what's listed in the artifacts query\n- Supports pagination with `start` and `limit` parameters for listing\n- Works with tenant credentials (no cluster-admin access needed)\n\n## Querying Jenkins Directly\n\nFor debugging, you can query Jenkins directly using the admin token:\n\n```bash\n# Get Jenkins admin token\nTOKEN=$(kubectl -n kubesphere-devops-system get secret devops-jenkins -o jsonpath='{.data.jenkins-admin-token}' | base64 -d)\n\n# List all folders (maps to DevOpsProjects)\nkubectl run curl-jenkins --rm -i --restart=Never --image=curlimages/curl \\\n  -- \"http://admin:${TOKEN}@devops-jenkins.kubesphere-devops-system:80/api/json\" \\\n  -H \"Content-Type: application/json\"\n\n# List jobs in a specific folder\nkubectl run curl-jenkins --rm -i --restart=Never --image=curlimages/curl \\\n  -- \"http://admin:${TOKEN}@devops-jenkins.kubesphere-devops-system:80/job/demo-project/api/json\" \\\n  -H \"Content-Type: application/json\"\n```\n\n## Common Mistakes\n\n| Mistake | Fix |\n|---------|-----|\n| **PipelineRun not triggering** | Check Pipeline exists and is synced to Jenkins |\n| **Controller panic (getAgentInfo nil pointer)** | Known issue with PipelineRef; use Jenkins API directly as workaround |\n| **Agent label not found** | Check available labels: `kubectl run curl-jenkins --rm -i --restart=Never --image=curlimages/curl -- \"http://admin:${TOKEN}@devops-jenkins.kubesphere-devops-system:80/labelsdashboard/labelsData\"` |\n| **Go/Tool not found in agent** | Use `kubernetes { yaml ... }` agent with appropriate container image |\n| **Artifact not found** | Run `archiveArtifacts` in the same stage where the file was created (same workspace) |\n| **Permission denied** | Check DevOps project membership and RBAC |\n| **Pipeline shows in KubeSphere but not Jenkins** | Check sync status annotation: `pipeline.devops.kubesphere.io/syncstatus` |\n| **Run fails immediately** | Check controller logs: `kubectl logs -n kubesphere-devops-system deployment/devops-controller` |\n| **Escape characters in Jenkinsfile** | Don't use `\\$class` escape sequences in inline Jenkinsfile |\n\n### Debugging Steps\n\n1. **Check PipelineRun status:**\n   ```bash\n   kubectl get pipelinerun <name> -n <namespace> -o yaml\n   ```\n\n2. **Check Jenkins build directly:**\n   ```bash\n   # Get admin token\n   TOKEN=$(kubectl -n kubesphere-devops-system get secret devops-jenkins -o jsonpath='{.data.jenkins-admin-token}' | base64 -d)\n   \n   # Get console output\n   kubectl run curl-jenkins --rm -i --restart=Never --image=curlimages/curl \\\n     -- \"http://admin:${TOKEN}@devops-jenkins.kubesphere-devops-system:80/job/<project>/job/<pipeline>/<build>/consoleText\"\n   ```\n\n3. **List Jenkins agent labels:**\n   ```bash\n   kubectl run curl-jenkins --rm -i --restart=Never --image=curlimages/curl \\\n     -- \"http://admin:${TOKEN}@devops-jenkins.kubesphere-devops-system:80/labelsdashboard/labelsData\"\n   ```\n\n| Mistake | Fix |\n|---------|-----|\n| PipelineRun not triggering | Check Pipeline exists and is synced to Jenkins |\n| Agent not found | Verify Jenkins agent labels match pipeline's `agent { label 'xxx' }` |\n| Permission denied | Check DevOps project membership and RBAC |\n| Pipeline shows in KubeSphere but not Jenkins | Check sync status annotation: `pipeline.devops.kubesphere.io/syncstatus` |\n| Run fails immediately | Check controller logs: `kubectl logs -n kubesphere-devops-system deployment/devops-controller` |\n\n## Best Practices\n\n1. **Use PipelineRun CRDs** for triggering - it's the cloud-native approach\n2. **Check status via kubectl** rather than polling APIs\n3. **Use `kubectl logs`** on the PipelineRun controller for debugging\n4. **Verify sync status** - pipelines must sync to Jenkins before they can run\n\n## References\n\n- [DevOps API Swagger](/root/go/src/github.com/kubesphere/kse-extensions/devops/swagger.yaml)\n- [Jenkins Pipeline Syntax](https://www.jenkins.io/doc/book/pipeline/syntax/)","tags":["kubesphere","devops","pipeline","agent-skills","cloud-native","cncf","ebpf","hacktoberfest","kubernetes","llm","multi-cluster","multi-tenancy"],"capabilities":["skill","source-kubesphere","skill-kubesphere-devops-pipeline","topic-agent-skills","topic-cloud-native","topic-cncf","topic-devops","topic-ebpf","topic-hacktoberfest","topic-kubernetes","topic-kubesphere","topic-llm","topic-multi-cluster","topic-multi-tenancy","topic-observability"],"categories":["kubesphere"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/kubesphere/kubesphere/kubesphere-devops-pipeline","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add kubesphere/kubesphere","source_repo":"https://github.com/kubesphere/kubesphere","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 16920 github stars · SKILL.md body (44,577 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-03T00:52:29.795Z","embedding":null,"createdAt":"2026-04-18T21:53:15.272Z","updatedAt":"2026-05-03T00:52:29.795Z","lastSeenAt":"2026-05-03T00:52:29.795Z","tsv":"'-1':3683,3980,3988,4000,4013 '-3':1891 '-64':2106 '/artifacts':3524,4423 '/artifacts/download':4472 '/basic-auth':941,1596 '/bin/bash':2493,3141,3292 '/branches':192,1264,2191,2714,2911,3185,3331,3784,3829,4051,4296,4342,4418 '/clusters':892,1256,1348,1378,2256,2409,2535,2614,2706,2803,2903,3110,3662,3776,3821,4231,4288,4410 '/clusters/member-1/kapis/devops.kubesphere.io/v1alpha2/namespaces':4045 '/clusters/member-1/kapis/devops.kubesphere.io/v1alpha2/namespaces/devopstestc2nj7/pipelines/echo-jenkinsfile-pipeline/branches/main/runs/5/log':4314 '/clusters/member-1/kapis/devops.kubesphere.io/v1alpha3/namespaces':1549,1613,1731,3179,3243,3325,3379,3951 '/consolelog':1386 '/consoletext':4819 '/creator':562,704,924,1579,1646,1697 '/creator:':587,967,1054 '/credentials':897,1552 '/devops.kubesphere.io/v1alpha3/namespaces':4465 '/doc/book/pipeline/syntax/)':4963 '/jenkins-pipelinerun-id':4250 '/job':4818 '/job/devopstestc2nj7/job/go-pipeline/job/main/2/artifact/service':4445 '/kapis/clusters':4463 '/kapis/devops.kubesphere.io/v1alpha2':2672,3420 '/kapis/devops.kubesphere.io/v1alpha2/namespaces':1350,1380,3457,3464,3473,3481,3490,3500,3518,3535,3778,3823,4290,4412 '/kapis/devops.kubesphere.io/v1alpha2/search':3449 '/kapis/devops.kubesphere.io/v1alpha3/namespaces':894,1258,2258,2411,2537,2616,2708,2805,2905,3112,3664,4233 '/kapis/devops.kubesphere.io/v1alpha3/namespaces/demo-project/pipelines':674 '/kubesphere-sigs/demo-go-http.git':440 '/kubesphere/demo-jenkinsfiles':1006 '/log':3506,4301 '/nodedetails':3671,3958 '/nodes':3790,3835,4057 '/oauth/token':4175 '/org/private-repo.git':1086 '/org/repo.git':1431 '/parameters':2234 '/pipelineruns':2390,2417,2622,2811,3118,3249,3385,3667,3954,4236,4468 '/pipelines':1261,1353,1383,1616,2261,2414,2540,2619,2711,2808,2908,3115,3182,3246,3328,3382,3459,3466,3475,3483,3492,3502,3520,3537,3781,3826,4048,4293,4415 '/pipelines/echo-jenkinsfile-pipeline':1734 '/root/go/src/github.com/kubesphere/kse-extensions/devops/swagger.yaml':4957 '/runs':3468,3477,3485,3494,3504,3522,3539,3786,3831,4053,4298,4420 '/scan':1356 '/steps':3793,3838,4060 '/stoneshi-yunify/jenkinsfiles':1505 '/stoneshi-yunify/jenkinsfiles.git':1678 '/stop':3496 '/syncstatus':1748,4727,4891 '/tmp/service':2056,2072,2073,2094,2096,2099,2113,2114 '/type':928,1583 '/v1alpha3':237,373,504,572,689,951,1038,1213,1631 '0':3508,3511,4271,4303,4316,4350,4425 '0.00':1980 '001':246,295,350 '1':138,783,853,1110,1268,1339,1495,1782,2215,2516,2697,2718,2756,2887,3167,3315,3335,3631,3939,4147,4396,4757,4908 '1.21':424 '1/1':2129 '10':1270,2720,3337,4427 '12d':1805 '2':798,870,1121,1369,1513,1807,2383,2599,2749,2760,3022,3209,3353,3752,4035,4258,4447,4768,4921 '200':4128 '201':1869 '2m':1901 '3':812,1131,1463,1470,1598,1871,1899,1945,2120,2784,3092,3226,3362,4080,4820,4930 '300':2013 '38':3695,3874 '3a':943 '3b':1028 '4':819,1141,1723,1934,4940 '41':3700,3731,3881 '5':1989 '54':2125 '6':2084 '60s':2021 '64':2101 '8.0':2133 '80':1524,2500,3148,3299,3911 '80/api/json':4587 '80/job':4817 '80/job/demo-project/api/json':4616 '80/job/demo-project/job/demo-jenkinsfiles-go/api/json':1315 '80/job/demo-project/job/demo-jenkinsfiles-go/job/main/3/api/json':1927 '80/job/demo-project/job/demo-jenkinsfiles-go/job/main/3/artifact/service':2063 '80/job/demo-project/job/demo-jenkinsfiles-go/job/main/3/consoletext':1963 '80/job/demo-project/job/demo-jenkinsfiles-go/job/main/build':1857 '80/labelsdashboard/labelsdata':4676,4843 '8344228':4441 '9':3867,4019 '99d':428 'abort':3590,3810,3813,3855,3894,3900,4077 'access':3435,3514,4101,4217,4277,4356,4377,4523 'action':3735,4109 'addit':826 'admin':555,591,971,1058,1295,1309,1420,1537,1832,1851,1921,1957,2042,2057,4100,4376,4522,4537,4542,4560,4581,4610,4670,4775,4793,4811,4837 'admin-token':1831,2041,4559,4792 'age':1796 'agent':403,411,460,531,613,721,2287,3574,4652,4681,4685,4823,4857,4862,4867 'altern':3413 'alway':147,642,757,841,1117,1164,2676 'annot':545,563,584,628,645,663,701,921,964,1051,1576,1643,1698,4162,4224,4330,4724,4888 'answer':1510 'api':18,651,659,673,678,891,901,1249,1255,1274,1324,1347,1360,1377,1390,1520,1526,1548,1556,1612,1620,1730,1738,1812,1909,2201,2255,2267,2408,2421,2496,2502,2534,2546,2613,2626,2652,2667,2668,2673,2679,2695,2705,2724,2802,2817,2902,2916,3109,3124,3144,3150,3178,3190,3242,3255,3295,3301,3324,3341,3378,3391,3414,3421,3426,3430,3471,3525,3534,3629,3661,3675,3762,3775,3799,3820,3844,3907,3913,3950,3962,4044,4066,4105,4134,4142,4174,4210,4230,4243,4264,4287,4307,4313,4320,4384,4394,4409,4431,4462,4478,4648,4929,4955 'apiserv':1523,2499,3147,3298,3910 'apivers':234,370,414,501,569,686,909,948,1035,1210,1564,1628 'app':528 'appear':1716 'appli':262,267 'applic':368,400 'application/json':684,907,1280,1366,1562,1626,2273,2427,2632,2730,2823,2922,3130,3261,3347,3397,3548,3681,3805,3850,4072,4592,4621 'application/x-www-form-urlencoded':4180 'approach':49,213,4093,4920 'appropri':4687 'approv':3607,3621,3688,3720,3743,3753,3767,3972,3991,4003,4016,4021,4036,4108 'approved/rejected':3750 'architectur':81 'archiv':410,2143 'archiveartifact':452,472,4694 'aren':1405 'arg':427 'array':198,2468,3025,3030 'artifact':76,453,1780,1992,1995,2008,2023,2049,2070,2080,2087,2131,3516,4381,4390,4398,4400,4449,4453,4504,4690 'artifact-download':2007,2048,2069,2079 'ask':771,784,857,1111,1496,2761,2775,3210 'assum':838 'auth':805,931,1126,1586,1669 'authent':1493 'author':114,676,899,1272,1358,1388,1554,1618,1736,2265,2419,2544,2624,2722,2815,2914,3122,3188,3253,3339,3389,3541,3673,3797,3842,3960,4064,4241,4305,4318,4429,4476 'auto':2174,2855 'auto-discov':2173 'auto-gener':2854 'automat':738,2180 'avail':2681,2699,2769,2889,3193,3319,3573,4111,4657 'base':1999 'base64':1834,2044,4562,4795 'bash':265,273,342,667,877,1251,1297,1342,1373,1517,1606,1726,1786,1813,1875,1938,2001,2088,2247,2399,2492,2701,2790,2898,3036,3097,3140,3291,3528,3650,3769,3814,3904,4163,4278,4405,4456,4539,4761,4773,4825 'basic':804,930,1125,1585 'basic-auth':803,929,1124,1584 'bearer':677,900,1273,1359,1389,1555,1619,1737,2266,2420,2545,2625,2723,2816,2915,3123,3189,3254,3340,3390,3542,3674,3798,3843,3961,4065,4242,4306,4319,4430,4477 'best':4906 'binari':1994,2136,3693,3712,3716,3740,3892 'biographi':2649,3048,3269 'bit':2102 'bodi':2464 'boolean':2469,3069 'booleanparam':2310,2357,2359,2584 'booleanparameterdefinit':2953,2998 'branch':160,189,193,259,657,732,736,740,748,767,850,982,985,995,1014,1063,1066,1097,1145,1206,1238,1241,1246,1284,1403,1410,1422,1433,1435,1442,1451,1454,1464,1466,1484,1602,1652,1655,1665,1685,1709,1769,1803,1838,2146,2155,2161,2171,2183,2192,2225,2449,2457,2663,2685,2700,2734,2745,2752,2764,2770,2777,2789,2792,2812,2813,2837,2841,2842,2893,2912,3099,3119,3120,3164,3186,3250,3251,3317,3320,3356,3359,3369,3370,3386,3387,3552,3785,3830,3927,4052,4282,4297,4339,4343,4419 'build':109,137,179,229,365,396,407,448,482,525,535,539,617,621,725,1774,1809,1839,1873,1931,1944,1991,2116,2119,2142,2766,2782,2786,2882,3023,3094,3138,3227,3234,3364,3367,3692,3711,3715,3739,3865,3891,4130,4137,4380,4389,4771 'build-binary-confirm':3710,3738,3890 'c':2052 'call':660 'case':1175 'cat':3039 'caus':177 'charact':4743 'check':148,163,207,270,758,854,1244,1432,1434,1441,1450,1783,1876,1906,2089,2521,2525,2551,4088,4629,4656,4708,4721,4731,4758,4769,4849,4872,4885,4895,4922 'checkout':2138,2179 'chmod':2111 'choic':2319,2321,2322,2365,2367,2370,2440,2585,2645,2964,2970,2973,3015,3060,3278 'choiceparameterdefinit':2966,3006 'ci/cd':11,64 'class':4749 'clean':2074 'client':4200,4206 'clone':437,1971,2139 'cloud':44,4918 'cloud-nat':43,4917 'cluster':554,893,1257,1349,1379,2257,2410,2536,2615,2707,2804,2904,3111,3663,3777,3822,4099,4232,4289,4375,4411,4464,4521 'cluster-admin':553,4098,4374,4520 'code':1864 'command':425 'common':4622 'complet':361,1105,1474,1766,2487,3136,3288,3560,3584,3902 'condit':328,2017 'config':2177 'confirm':842,3713,3741,3893 'consol':1936,1941,4798 'contain':419,430,470,485,488,493,4688 'content':682,905,1278,1364,1560,1624,2271,2425,2630,2728,2821,2920,3128,3259,3345,3395,3546,3679,3803,3848,4070,4178,4590,4619 'content-typ':681,904,1277,1363,1559,1623,2270,2424,2629,2727,2820,2919,3127,3258,3344,3394,3545,3678,3802,3847,4069,4177,4589,4618 'context':115 'continu':4084 'control':4637,4732,4896,4937 'copi':2064 'correct':1717 'correspond':227 'cp':2068 'cr':99,104,108,113,132,136,205,824,1135,2240,4161 'crd':2166,2848 'crds':4911 'creat':7,61,214,230,542,547,596,608,647,717,744,763,794,799,821,847,871,878,976,1122,1133,1142,1165,1480,1514,1599,1878,2002,2393,2481,3026,3410,4703 'creation':868,1725 'creator':544,634,662 'credenti':792,802,815,833,867,872,880,1007,1033,1087,1095,1123,1149,1168,1516,1605,1679,1749,1762,4372,4518 'credential.devops.kubesphere.io':927,940,1582,1595 'credential.devops.kubesphere.io/basic-auth':939,1594 'credential.devops.kubesphere.io/type':926,1581 'criteria':1440,1449,1461 'critic':146,641,756,4347 'crud':3440 'curl':668,886,1252,1301,1343,1374,1543,1607,1727,1843,1913,1949,2053,2252,2403,2531,2608,2702,2797,2899,3104,3175,3237,3321,3373,3529,3658,3770,3815,3947,4039,4169,4227,4284,4310,4406,4457,4573,4602,4662,4803,4829 'curl-jenkin':1300,4572,4601,4661,4802,4828 'curl-log':1948 'curl-status':1912 'curl-trigg':1842 'curlimages/curl':1308,1850,1920,1956,2011,4580,4609,4669,4810,4836 'current':319,3576,3968 'custom':34,217,466 'd':685,908,1367,1563,1627,1835,2045,2428,2633,2824,3131,3262,3398,3549,3806,3851,4073,4563,4796 'data':4182,4188,4193,4198,4204 'data-urlencod':4181,4187,4192,4197,4203 'data.jenkins':1830,2040,4558,4791 'debug':4529,4755,4939 'decis':3766 'dedic':2233 'default':185,2345,2578,3089,3205,3216 'defaultparametervalu':2940,2955,2968 'defaultparametervalue.value':3206 'defaultvalu':2300,2313,2344,2355,2362,2380 'defin':169,464,2566,2871 'definit':2218,2251,2519,2897,3173 'delet':339,344,2077 'demo':120,123,128,249,282,298,310,353,380,384,393,514,582,699,957,962,989,1049,1219,1226,1232,1792,1798,1884,1895 'demo-jenkinsfiles-go':956,988,1231,1797 'demo-jenkinsfiles-go-main-run':1218 'demo-jenkinsfiles-go-vf8p5':1894 'demo-project':122,127,248,281,297,309,352,383,513,581,698,961,1048,1225,1791,1883 'deni':4707,4871 'depend':2140 'deploy':527 'deployment/devops-controller':4741,4905 'deprec':2675,3416,3418,3423,3453 'descript':317,395,524,606,714,992,1073,1662,2303,2315,2326,2346,2356,2364,2373,2381,2928,2946,2960,2980,3083,3202,3204,3725,3859 'detail':327,1903,2091,3634,3653 'detect':1411 'dev':2371 'devop':3,15,24,31,84,801,895,919,1094,1167,1259,1313,1351,1381,1529,1550,1574,1614,1641,1732,1821,1826,1855,1925,1961,2031,2036,2061,2259,2412,2505,2538,2617,2709,2806,2906,3113,3153,3180,3244,3304,3326,3380,3458,3465,3474,3482,3491,3501,3519,3536,3665,3779,3824,3916,3952,4046,4234,4291,4413,4466,4549,4554,4585,4614,4674,4709,4739,4782,4787,4815,4841,4873,4903,4954 'devops-jenkin':1825,2035,4553,4786 'devops-jenkins.kubesphere':1311,1853,1923,1959,2059,4583,4612,4672,4813,4839 'devops-system':1312,1854,1924,1960,2060,4584,4613,4673,4814,4840 'devops.kubesphere.io':236,372,503,571,688,950,1037,1212,1630,4249 'devops.kubesphere.io/jenkins-pipelinerun-id':4248 'devops.kubesphere.io/v1alpha3':235,371,502,570,687,949,1036,1211,1629 'devopsproject':97,98,121,4569 'devopstestc2nj7':1531,2507,3155,3306,3918 'direct':211,1159,2281,2333,4527,4534,4649,4772 'discov':739,1013,1016,1096,1099,1245,1401,1684,1687,2175 'display':633 'displaynam':3691,3701 'doe':2434 'download':443,1779,1990,2000,2003,2009,2022,2050,2071,2081,2086,4388,4442,4448,4450,4492 'dropdown':2366 'durat':1932,2124 'e':1929,2582 'e.g':3606,3730,3737 'echo':620,728,1637,1659,1757,2293,2524,2556,2562,2579,2590,2603,3160,3170,3192,3195,3232,3311,3318,3365,3402,3408,3923,3934,3976,3984,3996,4009,4020,4029,4085,4212,4251 'echo-jenkinsfile-pipelin':1636,1658,1756,3159,3310,3922 'echo-jenkinsfile-pipeline-ndrkn':3933 'echo/jenkinsfile':1692 'elf':2100 'els':2589 'empti':835,1009,4122 'end':1983,4362 'endpoint':194,2193,2235,2391,2833,3415,3444,3642,4493 'enforc':640 'engin':3054,3272 'enter':3610 'enterpris':1188 'env':1157,2369 'eof':3041,3067 'escap':4742,4750 'exact':4498 'exampl':357,658,1413,1478,1771,1892,2118,2291,2335,2488,2743,2925,3037,3139,3290,3357,3527,3860,3903,4309,4433 'except':1330 'exec':2047 'execut':71,2104,2108,3577,3589 'exist':791,1785,2554,4631,4851 'expect':1752,1866,2097 'export':433,881,1518,1525,1528,1532,1538,2494,2501,2504,2508,2791,3098,3142,3149,3152,3156,3163,3293,3300,3303,3307,3905,3912,3915,3919,3926,3929,4209 'extern':3437 'extract':2220,2242,2567,2574,3943,3964 'f':268 'fail':78,181,324,3563,3586,3587,4729,4893 'fals':456,1018,1101,1689,2476,3005,3076,3811,3895,3901,4078 'featur':1444,2150 'feature-x':1443 'fetch':1370,3171,4259,4266 'fi':2597 'field':315,316,1140,1173,3080,3723,3724 'file':2090,2095,4701 'filenam':4455,4473,4495 'filter':1265,2715,3332 'find':3636,3971 'finish':334,1465,1472,1986 'first':151,761,846,1120,4152 'fix':4625,4845 'flag':2361 'flow':1106,3557 'folder':101,126,4566,4598 'follow':2883 'followsymlink':455 'forc':1395,2082 'format':2849,2982 'found':1438,1447,1457,2593,4655,4679,4692,4859 'fresh':4165 'full':1940 'gate':3608 'general':1333 'generat':2856 'generic':1179 'get':196,278,284,289,306,1788,1814,1823,1880,1902,1939,2033,2186,2216,2248,2517,2888,3168,3448,3454,3456,3463,3478,3480,3497,3499,3515,3517,3632,3651,3940,4148,4153,4164,4219,4540,4551,4763,4774,4784,4797 'getagentinfo':4639 'ghp':884,1541 'git':436,934,1000,1001,1080,1081,1176,1177,1180,1424,1589,1672,1673 'git_source.credential':817,1151 'github':808,879,882,916,936,1090,1129,1156,1182,1183,1187,1489,1515,1539,1571,1591,1668,1682,1764 'github-token':915,1089,1570,1681,1763 'github.com':439,1005,1085,1185,1430,1504,1677 'github.com/kubesphere-sigs/demo-go-http.git':438 'github.com/kubesphere/demo-jenkinsfiles':1004 'github.com/org/private-repo.git':1084 'github.com/org/repo.git':1429 'github.com/stoneshi-yunify/jenkinsfiles':1503 'github.com/stoneshi-yunify/jenkinsfiles.git':1676 'gitlab':1189,1190,1197 'gitlab.com':1192 'gitrepositori':823,1134 'go':367,379,392,399,441,444,447,469,959,991,996,1221,1234,1800,1897,2135 'go-demo-pipelin':378,391 'go/jenkinsfile':1021 'go/tool':4677 'go111module':434 'golang':421,423,431,489 'grant':4184 'grep':1928,2558,2581 'groovi':2285 'h':675,680,898,903,1271,1276,1357,1362,1387,1553,1558,1617,1622,1735,2264,2269,2418,2423,2543,2623,2628,2721,2726,2814,2819,2913,2918,3121,3126,3187,3252,3257,3338,3343,3388,3393,3540,3544,3672,3677,3796,3801,3841,3846,3959,4063,4068,4176,4240,4304,4317,4428,4475,4588,4617 'handl':2212,3593 'hello':729,2294,2308,2933 'help':2115 'hidden':2375,3017 'host':1196 'http':1863,1867,4127 'id':818,834,1008,1088,1152,1680,1751,3694,3699,3709,3727,3729,3736,3789,3792,3795,3807,3809,3834,3837,3840,3852,3854,3863,3869,3871,3876,3878,3883,3885,3975,3981,3983,3993,3995,4008,4024,4028,4031,4033,4056,4059,4062,4074,4076,4151,4157,4201,4222,4226,4254,4256,4300,4329,4422,4489 'identifi':3644 'imag':422,1307,1849,1919,1955,2010,4579,4608,4668,4689,4809,4835 'immedi':1396,4730,4894 'import':1153,3068,4090 'includ':16,558,2479,4341,4348 'incorrect':184 'index':1423,1467,1468,2184 'indic':4125 'inform':635,3945 'inlin':2164,4753 'input':3224,3564,3582,3598,3604,3637,3649,3705,3708,3734,3757,3808,3853,3882,3884,3888,3944,3994,4030,4032,4075 'input.id':3733,4005 'insid':2024 'instead':2236 'integr':37 'interact':3618,3704 'issu':1412,4643 'item':1283,2733,3350 'jenkin':39,89,95,118,228,1294,1302,1811,1827,1908,2037,2302,2945,3787,3832,3861,3864,4006,4054,4149,4155,4220,4225,4252,4255,4299,4327,4421,4488,4526,4533,4541,4555,4574,4603,4636,4647,4663,4720,4770,4788,4804,4822,4830,4856,4861,4884,4948,4958 'jenkins-pipelinerun-id':4326 'jenkinsfil':401,529,611,719,750,958,990,1024,1104,1220,1233,1437,1446,1455,1638,1660,1758,1799,1896,2163,2246,2284,2332,2530,2557,2572,2580,2874,3161,3312,3924,3935,4745,4754 'jenkinsrunid':4018 'job':745,4594 'john':2433 'jq':1281,1740,2274,2443,2548,2657,2731,2826,2923,3133,3197,3285,3348,3405,3682,3978,3986,3998,4011,4215,4245 'json':1754,2467,2927,3029,3690,4435 'jsonpath':1829,2039,4557,4790 'k8s':93 'key':457,2446,2829,3722,4322,4480 'kind':238,374,416,505,573,690,911,952,1039,1214,1566,1632 'known':4642 'kubectl':264,266,277,288,305,343,1298,1787,1817,1840,1879,1910,1946,2005,2014,2027,2046,2067,2076,4545,4570,4599,4659,4734,4762,4778,4800,4826,4898,4925,4932 'kubernet':33,51,86,117,412,461,2847,4333,4484,4683 'kubespher':2,14,23,30,40,83,91,116,219,625,672,890,1254,1346,1376,1519,1522,1547,1611,1720,1729,1820,2030,2254,2407,2495,2498,2533,2612,2704,2801,2901,3108,3143,3146,3177,3241,3294,3297,3323,3377,3533,3628,3660,3774,3819,3906,3909,3949,4043,4133,4141,4173,4202,4208,4229,4286,4312,4383,4393,4408,4461,4548,4717,4738,4781,4881,4902 'kubesphere-api':3532 'kubesphere-apiserv':1521,2497,3145,3296,3908 'kubesphere-devops-pipelin':1 'kubesphere-devops-system':1819,2029,4547,4737,4780,4901 'kubesphere.io':561,586,703,923,966,1053,1578,1645,1696 'kubesphere.io/creator':560,702,922,1577,1644,1695 'kubesphere.io/creator:':585,965,1052 'label':4653,4658,4824,4863,4868 'last':3966 'latest':1286,2736,2747,2754 'latestrun.id':1288,2738 'latestrun.result':1291,2741 'lh':2093 'like':2780 'limit':1269,2719,3336,4426,4511 'line':2339,2350,2986,2993 'list':274,2698,3316,3446,3461,4397,4501,4514,4564,4593,4821 'load':752 'local':2066 'log':74,1372,1415,1777,1937,1942,1950,3498,4131,4138,4260,4267,4733,4735,4897,4899,4933 'look':1964,2277,3684 'ls':1426,2092 'ls-remot':1425 'lsb':2103 'm':3051 'main':261,1222,1237,1436,1837,2746,2793,3100,3165,3358,3360,3554,3928 'main.go':451 'make':538,2107 'manag':10,26 'manual':2178,3591 'map':82,85,4567 'match':491,3012,4497,4864 'matter':624 'may':1714 'mb':2134 'mean':3569 'meet':1460 'membership':4711,4875 'messag':3714 'met':1439,1448 'metadata':240,376,507,575,692,827,913,954,1041,1216,1568,1634 'metadata.annotations':1745,4247 'metadata.creationtimestamp':1889 'metadata.name':1743,2445,2659,2828,3135,3287,3407 'method':3443 'mistak':4623,4624,4844 'mod':442 'monitor':22,69,1775,1872 'mr':2301,2944 'multi':159,188,656,731,735,766,849,981,984,994,1062,1065,1144,1205,1483,1601,1651,1654,1664,1708,1768,1802,2145,2154,2160,2224,2349,2662,2684,2992,2996,4281,4338 'multi-branch':158,187,655,730,734,765,848,993,1143,1204,1482,1600,1663,1707,1767,2144,2153,2223,2661,2683,4280,4337 'multi-branch-pipelin':980,1061,1650,1801,2159 'multi-lin':2348,2991 'must':162,474,490,557,770,2471,3011,3071,4496,4945 'my-pipelin':254,509,521,577,603,694,711 'my-pipeline-run':242,291,346 'my-regular-pipelin':2511 'n':280,296,308,351,1790,1818,1865,1882,2028,4546,4736,4765,4779,4900 'n/a':1289,1292,2739,2742 'name':241,253,258,377,390,420,486,494,508,520,576,602,693,710,914,955,987,1042,1068,1217,1230,1239,1263,1285,1355,1385,1569,1635,1657,1742,1755,1794,2263,2298,2311,2320,2342,2353,2360,2368,2378,2416,2430,2435,2439,2510,2542,2576,2588,2621,2635,2640,2644,2648,2653,2713,2735,2810,2852,2860,2910,2935,2941,2950,2956,2963,2969,3043,3047,3055,3059,3063,3079,3117,3158,3184,3200,3248,3264,3268,3273,3277,3281,3309,3330,3351,3384,3401,3412,3551,3670,3783,3828,3921,3932,3957,4050,4239,4295,4335,4417,4436,4471,4486 'namespac':100,247,382,512,580,697,918,960,1047,1224,1573,1640 'nativ':45,4919 'ndrkn':3937 'need':811,2452,3433,4378,4524 'never':837,1154,1306,1848,1918,1954,4578,4607,4667,4808,4834 'new':796,1402,2395 'nhttp':1861 'nil':4640 'nline':2997 'node':3633,3652,3791,3836,3868,3946,3967,3974,3977,3985,3997,4010,4026,4027,4058 'nodedetail':3641,3873,3880,3941 'none':3207 'note':1319,1693,4091,4268 'notic':2670 'ns':125,590,970,1057,1536 'number':3866 'o':300,449,1828,2038,2055,4459,4556,4766,4789 'object':47,90,144,3889 'object-reconcil':46,143 'ok':3718 'old':1453 'old-branch':1452 'omit':3084 'one':797,2323,2972,2974,3013 'oper':19,3441,3442 'option':820,1132,3008,3010 'origin':1266,2716,3333 'output':1416,1753,1893,2098,2744,4799 'overview':27 'ownership':567,630 'page':1267,2717,3334 'pagin':4507 'panic':4638 'param':3174,3196 'paramet':150,168,175,197,210,257,2187,2199,2213,2221,2243,2280,2296,2329,2387,2398,2402,2429,2451,2458,2486,2523,2527,2553,2560,2565,2575,2592,2596,2602,2607,2634,2825,2840,2865,2870,2890,2896,2924,2977,3024,3028,3038,3042,3085,3096,3103,3169,3172,3194,3199,3231,3236,3263,3399,3550,3857,3858,4272,4352,4512 'parameter':3137 'params.json':3040,3132 'params.person':2295 'pars':2570 'pass':1978,2130,2460,2836 'password':935,1590,2374,2377,2586,2654,3064,3282,4186,4195,4196 'passwordparameterdefinit':3016 'pat':809,883,937,1130,1540,1592 'path':1020,1022,1103,1691,2170,4346,4366,4438 'paus':3562,3578,3594,3612,3646,3697,3707 'pend':321 'permiss':4706,4870 'person':2299,2431,2636,2936,2942,3044,3265 'pick':2327,2961 'pipelin':4,12,17,25,28,65,67,70,73,79,102,103,130,131,140,155,166,172,190,201,204,244,256,293,348,356,363,375,381,388,389,394,402,498,506,511,518,519,523,530,548,574,579,600,601,605,607,612,649,666,691,696,708,709,713,718,720,733,737,768,851,953,983,986,997,1040,1046,1064,1067,1072,1074,1146,1162,1207,1262,1354,1384,1485,1603,1633,1639,1653,1656,1661,1666,1703,1713,1759,1784,1789,1804,1966,1969,1970,1973,1982,1985,2149,2152,2156,2158,2162,2196,2204,2217,2226,2228,2239,2250,2262,2286,2385,2415,2454,2491,2509,2514,2518,2529,2541,2563,2605,2620,2664,2686,2712,2809,2859,2868,2909,3116,3157,3162,3183,3247,3308,3313,3329,3371,3383,3403,3439,3447,3452,3455,3460,3467,3470,3476,3484,3493,3503,3521,3538,3555,3565,3595,3601,3656,3668,3782,3827,3920,3925,3930,3936,3955,4049,4083,4086,4237,4283,4294,4340,4416,4469,4630,4714,4850,4865,4878,4944,4959 'pipeline.devops.kubesphere.io':1747,4726,4890 'pipeline.devops.kubesphere.io/syncstatus':1746,4725,4889 'pipelineref':252,1229,4645 'pipelinerun':106,107,135,216,232,239,271,279,290,307,313,341,345,1215,1877,1881,2482,2845,2851,3409,4150,4156,4160,4221,4328,4334,4485,4626,4759,4764,4846,4910,4936 'pipelinerun.yaml':269 'pipelinerun/api':2182 'pod':417,467,1998,2004,2025,2078 'pod-bas':1997 'pod/artifact-downloader':2019 'point':458,2447,2830,4323,4481 'pointer':4641 'poll':4928 'post':671,889,1345,1546,1610,1859,2406,2611,2800,3107,3240,3376,3472,3489,3531,3773,3818,4042,4172 'practic':2569,3218,4907 'predefin':3007 'prefer':212,1250,1336,2677 'prefix':2862 'present':2767 'privat':777,781,862,874,1030,1044,1070,1076,1108,1116,1475,1488,1507 'private-repo-pipelin':1043,1069 'procedur':2210,2692 'proceed':865,3719,3768,3897 'process':1462 'prod':2372 'programmat':3434 'progress':304 'project':124,129,250,283,299,311,354,385,515,583,700,896,920,963,1050,1227,1260,1352,1382,1530,1551,1575,1615,1642,1733,1793,1885,2260,2413,2506,2539,2618,2710,2807,2907,3114,3154,3181,3245,3305,3327,3381,3666,3780,3825,3917,3953,4047,4235,4292,4414,4467,4710,4874 'prompt':3219 'proper':565,638,1166,1492 'provid':1137,2877,3034 'public':830,945,1011 'q':2559,3450 'queri':191,202,2450,2839,2891,4351,4386,4399,4505,4525,4532 'question':1501 'queu':3570 'queue':3558 'r':1282,1741,2275,2444,2549,2658,2732,2827,3134,3198,3286,3349,3406,3979,3987,3999,4012,4216,4246 'rather':4926 'rbac':639,4713,4877 're':1399 're-scan':1398 'reach':3602 'read':3222 'readi':330,2018 'recommend':142,4143 'reconcil':48,145 'refer':813,1092,4953 'referenc':1147 'refnam':1236 'reftyp':1240 'regular':156,200,653,665,1705,2148,2151,2195,2203,2227,2453,2490,2513 'reject':3623,3755,3812 'remot':1427 'repo':782,831,875,1012,1026,1045,1071,1109,1476 'repositori':755,759,778,839,855,861,946,1031,1077,1114,1181,1202,1317,1320,1397,1490,1499,1508,1972 'request':2463 'requir':174,592,636,972,1700,4102,4121,4274,4353,4368 'resourc':35,52,87,92,94,96,218,223,499,543,597,977,2483,2846 'respons':2478,2926,4123,4168,4214,4434 'restart':1305,1847,1917,1953,4577,4606,4666,4807,4833 'result':1930,2128 'resum':4087 'retriev':72,1776,1935,2237,2895,4129,4136,4379 'return':2843 'rm':1303,1845,1915,1951,4575,4604,4664,4805,4831 'rule':1334 'run':8,21,68,80,110,134,141,245,276,286,294,303,322,333,337,349,1208,1223,1287,1299,1841,1911,1947,1974,1976,2006,2197,2396,2665,2737,2748,2755,3372,3400,3404,3411,3462,3469,3479,3486,3488,3495,3505,3523,3526,3556,3559,3575,3657,3669,3788,3833,3862,3931,3956,4007,4055,4238,4253,4404,4470,4571,4600,4660,4693,4728,4801,4827,4892,4952 'say':2307,2932 'scan':1318,1321,1341,1371,1400,1414 'scenario':1479,1772 'scm':742,1169,1235,2168,2176 'script':1019,1102,1690,2169 'sec':1471 'second':2126 'secret':912,1139,1567,1824,2034,2379,3020,4207,4552,4785 'secret123':2656,3066,3284 'select':2788,2796,3355,3990,4002,4015 'self':1195 'self-host':1194 'sequenc':4751 'servic':450,454,2132,4437,4439,4460,4474 'set':643,832 'setup':1477 'sh':432,537,619,727,2051 'show':1407,4715,4879 'shown':3427 'singl':2172,2338,2985 'single-lin':2337,2984 'size':4440 'skill' 'skill-kubesphere-devops-pipeline' 'slash':4116,4359 'sleep':426,2012 'softwar':3053,3271 'someth':2328,2962 'sort':1887 'sort-bi':1886 'sourc':55,998,1002,1078,1082,1170,1178,1184,1191,1200,1670,1674 'source-kubesphere' 'spec':251,386,418,516,598,706,978,1059,1163,1228,1648 'spec.multi_branch_pipeline.git_source.credential':1750 'spec.pipeline.jenkinsfile':208,2189,2276,2550 'specif':285,4403,4452,4597 'stage':405,406,479,533,534,615,616,723,724,2137,2289,2290,3969,4698 'stage/node':3870 'start':338,1417,1421,1967,3507,3510,4270,4302,4315,4349,4424,4509 'state':320,3613,3696,3706 'status':272,287,314,1290,1862,1868,1874,1904,1914,2122,2740,2750,2757,3445,3566,3568,4089,4723,4760,4887,4923,4943 'status.completiontime':331 'status.conditions':326 'status.phase':318 'status.starttime':335 'step':429,473,536,618,726,852,869,942,1027,1338,1368,1494,1512,1597,1722,1781,1806,1870,1933,1988,2083,2209,2214,2292,2382,2515,2598,2691,2696,2759,2783,2886,3021,3091,3166,3208,3225,3314,3352,3361,3596,3605,3625,3630,3638,3647,3686,3698,3726,3728,3732,3742,3747,3751,3758,3794,3839,3875,3877,3938,3973,3982,3989,4001,4014,4022,4023,4034,4038,4061,4079,4146,4257,4395,4446,4756 'stone':589,969,1056,1535,2753,3046,3267 'stone-ns-admin':588,968,1055,1534 'stop':3487,3592 'string':836,2297,2336,2341,2473,2583,3073 'stringdata':932,1587 'stringparameterdefinit':2938,2983 'submit':3764 'subvers':1201 'succeed':323,329,1900 'success':1473,1761,1987,2123,2751,2758,3561,3583,3585,4126 'summari':2117,2121 'support':4506 'svn':1198,1199 'swagger':4956 'symref':1428 'sync':4634,4722,4854,4886,4942,4946 'syncstatus':1744,1760 'syntax':4960 'system':1314,1822,1856,1926,1962,2032,2062,3438,4550,4586,4615,4675,4740,4783,4816,4842,4904 'tag':1017,1100,1243,1688 'tail':1890 'tenant':541,551,595,610,716,975,3513,3619,4096,4145,4276,4355,4371,4517 'tenant-cr':540,594,715,974 'test':398,408,445,1975,2110,2127,2141,2638,2651 'testhello':1977,1979 'text':2340,2347,2351,2352,2587,2987,2989,2994 'textparameterdefinit':2990 'three':2325,2690,2976 'three-step':2689 'timeout':2020 'toggl':2312,2316,2436,2641,2947,2951,2957,3000,3056,3274 'token':679,902,917,1091,1275,1310,1361,1391,1527,1557,1572,1621,1683,1739,1765,1815,1816,1833,1852,1922,1958,2026,2043,2058,2268,2422,2503,2547,2627,2725,2818,2917,3125,3151,3191,3256,3302,3342,3392,3543,3676,3800,3845,3914,3963,4067,4166,4167,4211,4213,4218,4244,4308,4321,4432,4479,4538,4543,4544,4561,4582,4611,4671,4776,4777,4794,4812,4838 'took':1469 'topic-agent-skills' 'topic-cloud-native' 'topic-cncf' 'topic-devops' 'topic-ebpf' 'topic-hacktoberfest' 'topic-kubernetes' 'topic-kubesphere' 'topic-llm' 'topic-multi-cluster' 'topic-multi-tenancy' 'topic-observability' 'track':566,631 'trail':4115,4358 'trigger':66,139,153,170,225,1203,1316,1340,1773,1808,1836,1844,2181,2194,2384,2400,2594,2600,2604,2660,2785,2863,2880,3093,3101,3229,3233,3363,3366,4628,4848,4913 'troubleshoot':77,1409 'true':1015,1098,1686,2314,2363,2438,2474,2643,2959,3002,3058,3074,3276,3689,3721,3744,3856,3898,3992,4004,4017,4443 'true/false':2358,2999 'truth':57 'two':2208,2324,2442,2647,2975,3062,3280 'two-step':2207 'type':387,517,599,683,707,760,806,840,856,906,938,979,999,1060,1079,1127,1171,1172,1279,1365,1500,1561,1593,1625,1649,1671,1795,2157,2272,2330,2334,2426,2631,2729,2822,2921,2937,2952,2965,2978,2979,3129,3201,3260,3346,3396,3451,3547,3680,3804,3849,4071,4179,4185,4591,4620 'ui':632,1721 'unknown':325 'unlik':2222 'updat':63 'url':1003,1083,1675,4119,4365,4444 'urlencod':4183,4189,4194,4199,4205 'use':5,41,60,183,459,626,789,1155,1174,1322,1394,1996,2205,2388,2687,2831,3077,3087,3215,3424,3429,3509,3639,3759,4103,4261,4324,4482,4535,4646,4682,4748,4909,4931 'user':773,845,858,1112,1419,1497,1509,2639,2762,2773,2794,3033,3211,3220,3354,3581,3617 'user-provid':3032 'usernam':705,925,933,1533,1580,1588,1647,4190,4191 'usual':4124 'v':446 'v1':415,910,1565 'v1alpha2':1323,2835,3417,3761,4104,4263 'v1alpha3':1248,1326,1337,2200,2666,2678,2694,2832,3425,4113 'valu':260,2318,2376,2432,2437,2441,2470,2637,2642,2646,2650,2655,2878,2939,2943,2949,2954,2958,2967,2971,2981,2988,2995,3001,3004,3009,3018,3019,3035,3045,3049,3057,3061,3065,3070,3090,3213,3266,3270,3275,3279,3283,3553,3567 'var':1158,2343,2354 'verifi':1724,2085,4081,4860,4941 'version':2669 'vf8p5':1898 'via':650,1247,1293,1810,1907,3626,4132,4382,4924 'vs':2147 'w':312,1860 'wait':2015,3571,3579,3615,3702 'want':787 'watch':220,302 'webhook':2185 'without':173,1710,2595 'work':355,362,3289,4094,4369,4515 'workaround':4651 'workflow':1770,2885 'workflowjob':105,133 'workspac':111,112,119,484,4705 'would':2778 'www.jenkins.io':4962 'www.jenkins.io/doc/book/pipeline/syntax/)':4961 'x':670,888,1344,1445,1545,1609,1858,2112,2405,2610,2799,3106,3239,3375,3530,3772,3817,4041,4171 'x86':2105 'xxx':4869 'xxxxxxxxxxxxxxxxxxxx':885,1542 'yaml':233,301,369,413,462,497,500,568,947,1034,1209,4684,4767 'yes':780,864,1511","prices":[{"id":"14571f5d-e963-44ec-98b0-2d4889156d7e","listingId":"ac9e8217-c439-4922-ba1c-23e25416d009","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"kubesphere","category":"kubesphere","install_from":"skills.sh"},"createdAt":"2026-04-18T21:53:15.272Z"}],"sources":[{"listingId":"ac9e8217-c439-4922-ba1c-23e25416d009","source":"github","sourceId":"kubesphere/kubesphere/kubesphere-devops-pipeline","sourceUrl":"https://github.com/kubesphere/kubesphere/tree/master/skills/kubesphere-devops-pipeline","isPrimary":false,"firstSeenAt":"2026-04-18T21:53:15.272Z","lastSeenAt":"2026-05-03T00:52:29.795Z"}],"details":{"listingId":"ac9e8217-c439-4922-ba1c-23e25416d009","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"kubesphere","slug":"kubesphere-devops-pipeline","github":{"repo":"kubesphere/kubesphere","stars":16920,"topics":["agent-skills","ai","cloud-native","cncf","devops","ebpf","hacktoberfest","kubernetes","kubesphere","llm","multi-cluster","multi-tenancy","observability","servicemesh","skills","skills-sh","skillsmp"],"license":"other","html_url":"https://github.com/kubesphere/kubesphere","pushed_at":"2026-04-27T06:10:27Z","description":"The container platform tailored for Kubernetes multi-cloud, datacenter, and edge management ⎈ 🖥 ☁️","skill_md_sha":"9b8f189eace33717c94456befc43a10edbe1d9a9","skill_md_path":"skills/kubesphere-devops-pipeline/SKILL.md","default_branch":"master","skill_tree_url":"https://github.com/kubesphere/kubesphere/tree/master/skills/kubesphere-devops-pipeline"},"layout":"multi","source":"github","category":"kubesphere","frontmatter":{"name":"kubesphere-devops-pipeline","description":"Use when creating, running, or managing CI/CD pipelines in KubeSphere DevOps, including pipeline API operations and run monitoring"},"skills_sh_url":"https://skills.sh/kubesphere/kubesphere/kubesphere-devops-pipeline"},"updatedAt":"2026-05-03T00:52:29.795Z"}}