Jenkins Workflow CD 与 Kubernetes

Jenkins Workflow CD with Kubernetes

澄清一下,这不是关于 运行 Kubernetes 中的 Jenkins 的问题,而是关于从 Jenkins 部署到 Kubernetes 的问题。

我最近决定使用 Jenkins(和 workflow/pipeline 插件)来协调我们的交付过程。目前,我正在使用命令式样式按以下方式进行部署:

stage 'Deploy to Integ'
  // Clean up old releases
  sh "kubectl delete svc,deployment ${serviceName} || true"
    def cmd = """kubectl run ${serviceName} --image=${dockerRegistry}/${serviceName}:${env.BUILD_NUMBER} --replicas=2 --port=${containerPort} --expose --service-overrides='{ "spec": { "type": "LoadBalancer"  }}' """
    // execute shell for the command above
  sh cmd

这很好用,因为 ${env.BUILD_NUMBER} 通过管道持续存在,使我可以轻松确保我部署的版本在整个过程中都是相同的。我遇到的问题是我想使用声明式方法,因为它不可扩展,而且我想要 VCS 中的定义。

不幸的是,声明式方法带来了不利影响,需要在 yaml 中明确声明图像(要部署)的版本。解决此问题的一种方法可能是使用 latest 标记,但这也有其自身的风险。例如,假设我要将 latest 部署到生产环境,并且新版本被标记为 latest。新的 latest 可能还没有经过测试。

我可以通过编程方式更改文件,但这感觉相当笨拙,并且无助于签出文件以了解最新内容的开发人员。

你做了什么来解决这个问题?我错过了一些明显的东西吗?您使用的是什么工作流程?

在我的 yaml 文件 (server.origin.yml) 中,我将图像设置为 image-name:$BUILD_NUMBER

然后我运行:envsubst < ./server.origin.yml > ./server.yml
此命令会将字符串 $BUILD_NUMBER 替换为环境变量

的值