Mic*_*ihs 8 shell groovy jenkins docker jenkins-pipeline
我在运行简单方面遇到了麻烦Jenkinsfile- 例如
pipeline {
agent { label 'ssh-slave' }
stages {
stage('Shell Test') {
steps {
sh 'echo "Hello World"'
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
主服务器上Jenkins的日志文件显示容器已成功启动,但构建作业因类似消息而崩溃
sh: 1: /home/jenkins/workspace/pipeline@tmp/durable-34c21b81/script.sh: Permission denied
Run Code Online (Sandbox Code Playgroud)
以下是我们配置/计算出的一些其他内容:
我们正在使用RHEL在VM上运行代理
我们使用Jenkins 的Docker插件在单独的Jenkins代理上启动/管理容器
我们使用Connect with sshJenkins插件中的方法旋转Docker容器并使用jenkinsci/ssh-slave Docker镜像
Jenkins正在使用rootDocker容器中的用户(至少所有文件/home/jenkins/...都是以root身份创建的
当我们sleep向管道添加一个步骤并docker exec...进入正在运行的容器时,如果我们尝试运行它./script.sh(即使我们之前设置了正确的文件模式chmod +x script.sh),我们也无法以root身份执行简单的shell脚本- 我们也得到了sh: 1: permission denied.但是如果我们使用的话,我们可以运行脚本sh script.sh
rootDocker容器中的用户有一个bash- 而Jenkins正在尝试运行脚本sh.
无论我们是否检查run privilegedDocker插件的模板配置中的标志,都会发生错误
我们已经尝试过但没有奏效的事情
将rootDocker容器中用户的登录shell更改为/bin/sh
在sh步骤中提供一个shebang ,àla
sh '''#!/bin/sh echo "hello world" '''
将shell执行程序设置为/bin/shJenkins全局配置
改变Dockerfile这样的ssh的-从码头工人形象ENTRYPOINT不运行bash脚本,但运行/bin/sh在年底
任何帮助表示赞赏!
问题是/home/jenkins容器中安装有noexec:
$ mount
/dev/mapper/rhel-var on /home/jenkins type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,noquota)
Run Code Online (Sandbox Code Playgroud)
根本问题是/var底层主机上的挂载noexec(/var是所有容器文件所在的位置...):
$ mount
/dev/mapper/rhel-var on /var type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,noquota)
Run Code Online (Sandbox Code Playgroud)
/var所以这个问题的解决方案是通过以下方式在主机上挂载为可执行文件
sudo mount -o remount,exec /var
Run Code Online (Sandbox Code Playgroud)
这为我们解决了这个问题。