You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins Kubernetes:如何从控制器Pod使用自定义Agent Pod规格?

解决方案1:正确配置Helm Chart的agent.podTemplates并结合流水线参数传递

首先排查Helm values.yaml中agent.podTemplates的配置规范,Kubernetes插件要求Pod模板必须包含明确标签、容器定义,且支持参数化占位符:

agent:
  podTemplates:
    - name: multi-container-agent
      label: multi-container-agent
      containers:
        - name: build-container
          image: "{{ buildImage }}"
          command: "sleep"
          args: "infinity"
        - name: test-container
          image: "{{ testImage }}"
          command: "sleep"
          args: "infinity"
      envVars:
        - key: BRANCH_NAME
          value: "${BRANCH_NAME}"

在Jenkinsfile的声明式流水线中,通过标签调用模板,并通过流水线环境变量动态传递分支相关的镜像参数:

pipeline {
  agent {
    kubernetes {
      label 'multi-container-agent'
      inheritFrom 'multi-container-agent'
      envVars {
        envVar(key: 'buildImage', value: "${env.BRANCH_NAME == 'main' ? 'registry/main-build:latest' : 'registry/dev-build:latest'}")
        envVar(key: 'testImage', value: "${env.BRANCH_NAME == 'main' ? 'registry/main-test:latest' : 'registry/dev-test:latest'}")
      }
    }
  }
  stages {
    stage('Build') {
      steps {
        container('build-container') {
          sh 'echo Building with branch-specific image'
        }
      }
    }
  }
}

注意:部分Helm Chart版本需在controller.JCasC.configScripts中额外配置Kubernetes插件的Pod模板自动加载逻辑,确保模板能被Jenkins识别。

解决方案2:用ConfigMap存储模板化Pod YAML,流水线动态渲染
  1. 创建包含模板化Pod配置的ConfigMap,将分支相关内容替换为占位符:
apiVersion: v1
kind: ConfigMap
metadata:
  name: jenkins-agent-template
  namespace: jenkins
data:
  agent-template.yaml: |
    apiVersion: v1
    kind: Pod
    spec:
      containers:
        - name: build-container
          image: ${BUILD_IMAGE}
          command: ["sleep", "infinity"]
        - name: test-container
          image: ${TEST_IMAGE}
          command: ["sleep", "infinity"]
  1. 配置Helm Chart将该ConfigMap挂载到Jenkins控制器:
controller:
  volumes:
    - name: agent-template-config
      configMap:
        name: jenkins-agent-template
  mounts:
    - mountPath: /var/jenkins_home/configs
      name: agent-template-config
      readOnly: true
  1. 在Jenkinsfile中读取模板文件,动态替换分支变量:
pipeline {
  agent none
  stages {
    stage('Run Multi-Container Agent') {
      agent {
        kubernetes {
          yaml readFile('/var/jenkins_home/configs/agent-template.yaml')
            .replace('${BUILD_IMAGE}', env.BRANCH_NAME == 'main' ? 'registry/main-build:latest' : 'registry/dev-build:latest')
            .replace('${TEST_IMAGE}', env.BRANCH_NAME == 'main' ? 'registry/main-test:latest' : 'registry/dev-test:latest')
        }
      }
      steps {
        container('build-container') {
          sh 'execute build commands'
        }
        container('test-container') {
          sh 'execute test commands'
        }
      }
    }
  }
}

此方案将模板集中托管在K8s ConfigMap,无需修改代码仓库,分支变量在流水线中动态注入。

解决方案3:用Jenkins共享库封装Agent模板逻辑

将分支变量判断、Pod模板定义封装到共享库,实现逻辑统一维护:

  1. 在共享库vars目录下创建multiContainerAgent.groovy:
def call(Map args = [:]) {
  def branchName = args.branchName ?: env.BRANCH_NAME
  def buildImage = branchName == 'main' ? 'registry/main-build:latest' : 'registry/dev-build:latest'
  def testImage = branchName == 'main' ? 'registry/main-test:latest' : 'registry/dev-test:latest'

  return """
    apiVersion: v1
    kind: Pod
    spec:
      containers:
        - name: build-container
          image: ${buildImage}
          command: ["sleep", "infinity"]
        - name: test-container
          image: ${testImage}
          command: ["sleep", "infinity"]
  """.stripIndent()
}
  1. 在Jenkinsfile中引用共享库并调用模板方法:
@Library('jenkins-shared-library') _

pipeline {
  agent {
    kubernetes {
      yaml multiContainerAgent(branchName: env.BRANCH_NAME)
    }
  }
  stages {
    // 流水线执行阶段
  }
}

该方案将模板逻辑与业务代码解耦,代码仓库的Jenkinsfile仅需调用共享库方法,分支规则统一维护,降低出错概率。

内容的提问来源于stack exchange,提问作者barmanthewise

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 09:25:25