Jenkins动态阶段实现独立Kaniko Agent执行构建的求助
环境配置
- Kubernetes v1.27 (EKS)
- 通过helm chart安装Jenkins
- 使用shared libraries通过代码配置Jenkins(CaaC)
Jenkins共享库配置
所有文件位于var目录下
pipelineTemplate.groovy
#!/usr/bin/env groovy def call() { pipeline { agent { kubernetes { yaml kaniko() } } stages { stage ('1. Build') { steps { kanikoBuild() } } } } }
kaniko.groovy
#!/usr/bin/env groovy def call(){ agent = """ apiVersion: v1 kind: Pod metadata: labels: role: agent name: jenkins-build namespace: jenkins spec: serviceAccountName: jenkins-agent imagePullSecrets: - name: kaniko-docker containers: - name: kaniko image: gcr.io/kaniko-project/executor:v1.10.0-debug imagePullPolicy: Always command: - /busybox/cat tty: true volumeMounts: - name: kaniko-docker mountPath: /kaniko/.docker resources: requests: cpu: 3 memory: 5Gi restartPolicy: Never volumes: - name: kaniko-docker projected: sources: - secret: name: kaniko-docker items: - key: .dockerconfigjson path: config.json """ return agent }
kanikoBuild.groovy
#!/usr/bin/env groovy def generateStage(job) { return { stage("Build ${job}") { sh """ executor \ -f `pwd`/Dockerfile-${job} \ -c `pwd` \ --cache=true \ --cache-repo=mydocker/${job} \ --destination=mydocker/${job}:${env.GIT_COMMIT} """ } } } def call() { container('kaniko') { def stagesList = [:] def parallelStagesMap = '' stagesList = [ "app1", "app2" ] parallelStagesMap = stagesList.collectEntries {["${it}" : generateStage(it)]} parallelStagesMap.failFast = false parallel parallelStagesMap } }
当前正常功能
向stagesList添加新项时,会动态创建新的阶段,只需更新一处即可,无需重复复制Kaniko执行器代码,十分便捷。
存在的问题
由于Kaniko设计为单个Pod仅能运行一个执行器,当前流水线因并行阶段共用同一个Kaniko Pod而失败;此外,无法为不同应用配置差异化资源(如app1需5CPU、app2需2CPU)。
期望实现目标
希望每个动态生成的流水线阶段能运行在独立的执行器上,即stagesList中定义的每个应用都启动独立的Kaniko Pod来执行构建。
曾尝试在generateStage函数中添加Pod定义,但未成功。
恳请各位提供帮助。
内容的提问来源于stack exchange,提问作者Michał Lewndowski
相关产品推荐
相关产品推荐

