更改 Jenkins 构建工件文件所有权

Posted

技术标签:

【中文标题】更改 Jenkins 构建工件文件所有权【英文标题】:Changing Jenkins build artifacts file ownership 【发布时间】:2015-11-30 14:55:23 【问题描述】:

我有一个构建 Maven 项目的 Jenkins 服务器。 Jenkins 构建这个项目时,$WORKSPACE 下的所有构建工件都具有文件权限jenkins:jenkins

发布步骤中,这些构建工件将被复制到/srv/myproject/,Tomcat 实例从该处为构建工件提供服务。 /srv/myproject/tomcat7/tomcat7 所有。

此发布步骤失败,Jenkins 报告 Failed to copy $WORKSPACE/somefile to /srv/myproject/somefile due to java.io.FileNotFoundException /srv/myproject/somefile (Permission denied) — Linux 用户 jenkins 不允许修改 Linux 用户 tomcat7 拥有的文件。

如何更改 Jenkins 构建工件的所有权?我正在寻找考虑到安全性的解决方案,例如给予jenkins sudoer 权限似乎并不明智。此外,将srv/myproject/** 的所有权更改为jenkins:jenkins 感觉更像是一种解决方法。

【问题讨论】:

jenkins 和 tomcat7 是否都属于一个名为 ci_build 的共享组?我不确定它是否提供了比您已经建议的安全性更高的安全性(只是让事情更清楚一些 - “为什么 Tomcat 文件归詹金斯所有?”)。 在 'srv/myproject' 的用户组中添加用户 'jenkins' 怎么样? 【参考方案1】:

您可以考虑为这两个用户创建一个组,我们称之为ftp

您可以将/srv/myproject/ 文件夹的所有权更改为ftp 组:

sudo chown -R :ftp /srv/myproject

将用户 jenkinstomcat7 添加到 ftp 组:

sudo usermod -a -G ftp jenkins
sudo usermod -a -G ftp tomcat7

现在jenkinstomcat7 两个用户都应该能够访问/srv/myproject

【讨论】:

【参考方案2】:

也许您应该尝试将具有正确所有权的所有必需文件存档(zip、rar 等)并保存到具有完全权限的文件中(例如,具有 777 权限的 archive.zip 文件),这样当您取消存档时您将获得文件的正确所有权。

【讨论】:

【参考方案3】:

将文件部署到服务中并不是 Jenkins 的真正用途。如果这是目前最适合您的解决方案,那么您可能应该以 tomcat 用户身份运行部署脚本;也就是说,在您的 Jenkins shell 脚本中使用“sudo”或等效项。

您应该考虑更好的解决方案。

如果您计划在未来显着扩展,使用 Puppet、Vagrant、Chef、Powershell DSC 或任何数量的替代方案的声明式环境配置都是不错的选择。 如果您确信自己永远不需要多次部署(例如,共享开发环境、验收测试环境、staging x2、生产 x2 等等...),那么 Jenkins 工作应该构建一个安装程序某种类型的(dpkg、yum 文件、ZIP 文件、msi...),并且可以围绕它构建一个小的可自动化、可重复和可控的过程。它甚至可以由 Jenkins 触发!

【讨论】:

【参考方案4】:

如果必须作为本地操作进行复制,则使用 cmets 中已经描述的 linux 用户/组/ACL。

如果可以不进行本地复制,那么您可以为 tomcat 用户启用 ssh 访问,并使用 sftp/rsync 上传工件并设置权限规则。性能损失不会那么大,但您将能够移除本地环境锁定,并能够在未来上传到任何环境。

【讨论】:

以上是关于更改 Jenkins 构建工件文件所有权的主要内容,如果未能解决你的问题,请参考以下文章

詹金斯从工件加载文件时出错

从 nexus 获取最新的构建工件

不应该使用 Artifactory 来捕获 Jenkins 生成的构建工件吗?

在 Jenkins 中使 SBT 缓存的工件本地化到工作区

在 Jenkins 插件中读取构建工件

是否将“仅在构建成功时存档工件”设置为 true 意味着,如果构建失败,任何工件都不会在 Jenkins 中创建?