Jenkins Pipeline中sed未替换deployment.yml内IMAGE_VERSION的问题
问题根因
替换失效的核心原因是你在sed命令前多余加了sudo,触发了sudo的执行上下文切换问题。整个流程里你下载kubectl、加执行权限、读文件、写文件都没加sudo,说明Jenkins执行用户本身对当前工作空间有完整读写权限,完全不需要提权。
加sudo后大概率触发了sudo配置里的always_set_home规则,sudo启动的sed进程工作目录被切到/root下,如果/root下恰好存了一份和你当前工作空间内容一致的deployment.yml残留文件,sed就会直接读取这份文件做处理,匹配不到替换规则就原样输出,整个执行过程没有语法错误、没有文件不存在错误,所以任务全程无报错,但输出的内容和你预期要修改的当前工作目录下的文件完全对不上。
修复方法
直接删掉sed命令前的sudo即可,修正后的代码片段:
stage('Deploy to K8S'){ withKubeConfig(credentialsId: "kubeconfig", namespace: 'dev'){ sh 'curl -LO "https://storage.googleapis.com/kubernetes-release/release/v1.20.5/bin/linux/amd64/kubectl"' sh 'chmod u+x ./kubectl' sh "sed 's/IMAGE_VERSION/${env.BUILD_ID}/g' deployment.yml > output.yaml" sh 'cat output.yaml' sh './kubectl apply -f output.yaml' sh 'rm output.yaml' } }
额外避坑
如果后续确实需要用sudo执行带重定向的命令,不要直接写sudo 命令 > 文件,因为重定向操作是当前普通用户的shell执行的,遇到root权限的文件会报权限错,正确写法是把整个命令(包括重定向)放到sudo的shell上下文里跑:sh "sudo sh -c 'sed 's/IMAGE_VERSION/${env.BUILD_ID}/g' deployment.yml > output.yaml'"
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

