背景:最近经理要求前端新项目在Jenkins使用docker镜像来临时编译打包,本来是没有问题的;但Jenkins是在Ubuntu系统上二进制包安装的,使用的普通用户devops部署的,docker镜像内部是用的root用户,这就导致打包之后在.jenkins/workspace中产生的dist及node_modoules权限变成了root权限,在jenkins执最后一步清理工作空间时会提示 Operation not permitted,即无权限清理。
- 先看jenkinsfile
node {......stage('部署') {if (env.target == 'prod') {sh "rsync -zcav -e ssh dist/* test:/data/www/web/dist"sh "sudo chown -R devops:devops `pwd`"}}stage('清理'){deleteDir()}
}
一开始的想法修改workspace产生的目录权限,但由于jenkins所在服务器使用的用户devops设置了密码,单独使用sudo命令会提示
sudo: no tty present and no askpass program specified
。
解决办法
- 方法1.将devops用户在sudo组中设置为免密码
sudo vim /etc/sudoersdevops ALL=(ALL:ALL) NOPASSWD:ALL
- 方法2. 在使用sudo命令的时候将密码传入过去
echo PASSWROD | sudo -S chown -R devops:devops `pwd`
改后jenkinsfile如下
node {......stage('部署') {if (env.target == 'prod') {sh "rsync -zcav -e ssh dist/* test:/data/www/web/dist"sh "echo PASSWROD | sudo -S chown -R devops:devops `pwd`"}}stage('清理'){deleteDir()}
}