导语:今天用jenkins发布更新helm的时候报错field is immutable
报错如图
除了其他job 更新都没问题,只有更新k8s的job类型的服务的时候helm会报错。发现是由于指定-f values.yaml 引起的。
# 修改前
helm --kubeconfig="/srv/kubeconfig/k8s_cluster.yaml" upgrade -f /data/cluster-deploy/${NameSpace}/values.yaml ${NameSpace} /data/cluster-deploy/${NameSpace} -n ${NameSpace}
# 修改后
helm --kubeconfig="/srv/kubeconfig/k8s_cluster.yaml" upgrade ${NameSpace} /data/cluster-deploy/${NameSpace} -n ${NameSpace}
虽然流水线执行helm upgrade之前会删除对应的job名称,但是job类型的特性就是只执行一次 不能被更改。因此不能指定-f values.yaml
去upgrade,虽然这个values其实就是他自己当前使用的values文件,这里helm是应该判断为一个新文件,认为job类型在原有的values上又-f指定了一个values,有更新。 把对应的-f /data/cluster-deploy/${NameSpace}/values.yaml
去掉就可以执行,不会报错了。
修改对应流水线如下
stage('deploy') {
agent {
label "10.10.3.245"
}
steps {
script {
def code = sh (
script: "kubectl --kubeconfig /srv/kubeconfig/k8s_cluster.yaml delete job/pacsserver-migration -n ${NameSpace}",
returnStatus: true // 注意得加上这个, 不然 sh 执行 不返回 状态 ,jenkins 执行到这里 如果 grep 还是 找不到 东西的话 又会报 Error : script returned exit code 1 的错
)
// code 为0 代表 grep 找到 了 react-app 相关 的 container
if (code==0){
echo "镜像名称包含job名称"
}else{
echo "镜像名称未包含job名称 请检查镜像"
}
sh """
###echo "{images: {migration_pacsserver: harbor.deepwise.com/dev/${JOB_NAME}:${Tag}}}" > ${WORKSPACE}/values.yaml
sed -i "s# migration_pacsserver: h.*# migration_pacsserver: harbor.deepwise.com/dev/${JOB_NAME}:${Tag}#g" /data/cluster-deploy/${NameSpace}/values.yaml
cat /data/cluster-deploy/${NameSpace}/values.yaml
kubectl --kubeconfig=/srv/kubeconfig/k8s_cluster.yaml get job -n ${NameSpace}
helm --kubeconfig="/srv/kubeconfig/k8s_cluster.yaml" upgrade ${NameSpace} /data/cluster-deploy/${NameSpace} -n ${NameSpace}
"""
}
}
}