澄清一下,这不是关于在Kubernetes中运行Jenkins的问题,而是关于从Jenkins部署到Kubernetess。
我最近决定使用Jenkins(以及工作流程/管道插件)来协调我们的交付流程。目前,我正在使用命令式样式进行部署,如下所示:
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
可能尚未通过测试。
我可以通过编程方式更改文件,但感觉相当笨重,并且无法帮助已签出文件的开发人员了解最新版本。
你做了什么来解决这个问题?我错过了一些明显的东西吗你使用什么工作流程?
答案 0 :(得分:2)
在我的yaml文件(server.origin.yml)中,我将图片设置为image-name:$BUILD_NUMBER
然后我跑:envsubst < ./server.origin.yml > ./server.yml
此命令将使用环境变量
$BUILD_NUMBER