背景:最近经理要求前端新项目在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/sudoers
devops 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()
}
}