我有一个现有的构建盒,它使用cronjobs来执行本地Ansible剧本。这些Ansible剧本执行另一个团队提供的构建脚本。
我需要的一切都在构建盒上。我的目标是启动Jenkins,挂载当前运行一切的目录,并让Jenkins触发作业而不是cronjob。
我已经成功地配置了一个Dockerfile和casc.yaml来启动Jenkins容器。Jenkins当前设置为以root身份运行,稍后我将更改此设置。我需要在特定服务帐户***thebuilder***下运行构建作业,该帐户已经在系统上,这样我就不需要在当前管道中浪费时间。奇怪的是,当我***sudo-u user-l***和执行带有***~***的命令输出始终引用根主目录。
到目前为止,对于我的测试来说,我只运行了几个初始命令,直到它工作为止,然后我将实现其余的命令。
Jenkins启动命令:
sudo docker run --name jenkins_dev --rm -v /opt/home/thebuilder/p4:/opt/home/thebuilder/p4 -p 8080:8080 jenkins:jenkins_dev
- 我的脚本:**
pipeline {
agent any
stages {
stage ('Account: Create thebuilder user') {
steps {
sh "grep thebuilder /etc/passwd || useradd -m -d /opt/home/thebuilder thebuilder"
}
}
stage ('Check dir') {
steps {
sh "sudo -u thebuilder -i ls ~"
}
}
stage ('P4 Login') {
steps {
sh "sudo -u thebuilder -i export P4CONFIG=~/.p4settings-builds; sudo -u thebuilder -i /bin/p4 login < ~/.p4p"
}
}
}
}
- 输出:**
Started by user Doe, John
Running as Doe, John
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /var/jenkins_home/jobs/Builds/jobs/Builds2022/workspace
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Account: Create thebuilder user)
[Pipeline] sh
+ grep thebuilder /etc/passwd
thebuilder:x:1001:1001::/opt/home/thebuilder:/bin/bash
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Check dir)
[Pipeline] sh
+ sudo -u thebuilder -i ls /root
ls: cannot open directory /root: Permission denied
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (P4 Login)
Stage "P4 Login" skipped due to earlier failure(s)
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 2
Finished: FAILURE
我也尝试过使用完整的home路径***/opt/home/thebuilder***而不是***~***,但这没有什么区别。
我已经搜索了互联网,但我不断登陆运行Jenkins下的另一个用途,而不是一个特定的工作。
我遇到了3个可能的解决方案:
1.我使用sudo,它似乎不起作用
1.我使用构建用户vars插件,我不知道如何将其插入我的脚本
1.我使用Jenkins代理在所需用户下运行/ssh,我还没有尝试过
我应该指出,我创建了一个自由式作业,它指向同一目录中的Ansible剧本,它执行得很好,所以挂载和权限不是问题。
1条答案
按热度按时间omhiaaxx1#
在相应用户的目标计算机上运行jenkins作业。希望这对您有所帮助。参考:https://plugins.jenkins.io/ssh-agent/