有没有办法将 Hudson / Jenkins 配置文件保存在源代码控制中?

Posted

技术标签:

【中文标题】有没有办法将 Hudson / Jenkins 配置文件保存在源代码控制中?【英文标题】:Is there a way to keep Hudson / Jenkins configuration files in source control? 【发布时间】:2011-01-06 10:13:52 【问题描述】:

我是 Hudson / Jenkins 的新手,想知道是否有办法将 Hudson 的配置文件签入源代码控制。

理想情况下,我希望能够单击 UI 中显示“保存配置”的某个按钮,并将 Hudson 配置文件签入源代码管理。

【问题讨论】:

或者您可以根据需要将这些信息存储在 Git 存储库中:请参阅 my answer below 另见:Can I store Jenkins configuration in the project repo (like Travis)? 检查:HUDSON_HOME directory 了解 Jenkins 文件的结构。 @kenorb 链接已失效。 另见SE DevOps: How do you back up Jenkins jobs & master configs?。 【参考方案1】:

最有帮助的答案

有一个插件叫SCM Sync configuration plugin。


原答案

查看my answer 的类似问题。基本思想是使用filesystem-scm-plugin 来检测对xml 文件的更改。您的第二部分是将更改提交到 SVN。

编辑:如果您找到确定更改用户的方法,请告诉我们。

EDIT 2011-01-10 同时有一个新插件:SCM Sync configuration plugin。目前它仅适用于 subversion 和 git,但计划支持更多存储库。我从 0.0.3 版开始使用它,到目前为止效果很好。

【讨论】:

我不同意:如果您使用 git 并在复杂环境中操作,该插件有一些主要弱点:'如果您使用 Git,那么您应该使用默认名称的 SSH 密钥。它是“id_rsa”。 SCM Sync 没有指定 ssh 密钥路径的选项。 SCM Sync 使用 .ssh/id_rsa 来自 jenkins 进程所有者的主目录。来自 [wiki.jenkins-ci.org/display/JENKINS/… SCM 同步配置插件与 Subversion 插件不兼容 >=2.0 (per issues.jenkins-ci.org/browse/JENKINS-21640)。 我不推荐使用这个特定的插件,安装后 jenkins 没有出现。这个插件中似乎有很多错误,并且它不会太频繁地升级/修复。避免使用“SCM Sync 配置插件” @vikramvi,你提出的替代方案是什么? SCM Sync 插件已弃用【参考方案2】:

请注意,Vogella 最近(2014 年 1 月,与 OP 2010 年 1 月的问题相比)对此有不同的看法。 考虑到SCM Sync configuration plugin 可以生成很多次提交。 因此,他不再依赖插件和自动化流程,而是手动管理相同的功能:

Storing the Job information of Jenkins in Git

我发现提交的数量有点庞大,所以我决定手动控制提交,只保存 Job 信息而不保存 Jenkins 配置。 为此切换到您的 Jenkins 作业目录(Ubuntu:/var/lib/jenkins/jobs)并执行“git init”命令。

我创建了以下 .gitignore 文件来仅存储 Git 作业信息:

builds/
workspace/
lastStable
lastSuccessful
nextBuildNumber
modules/
*.log

现在您可以根据自己的意愿添加和提交更改。 如果您将另一个远程服务器添加到您的 Git 存储库,您可以将您的配置推送到另一个服务器。

Alberto 实际上也建议添加(在$JENKINS_HOME):

jenkins 自己的配置 (config.xml), jenkins 插件配置 (hudson*.xml) 和 用户配置 (users/*/config.xml)

【讨论】:

不会存储用户配置在其config.xml 中公开明文 API 令牌吗? @Boon 实际上我不知道,因为我最近不必使用 API 令牌。这可能是一个很好的问题。 经过一番研究,发现API令牌在XML中是加密的,所以这不会造成安全风险。【参考方案3】:

要使用 Git 手动管理您的配置,以下 .gitignore 文件可能会有所帮助。

# Miscellaneous Hudson litter
*.log
*.tmp
*.old
*.bak
*.jar
*.json

# Generated Hudson state
/.owner
/secret.key
/queue.xml
/fingerprints/
/shelvedProjects/
/updates/

# Tools that Hudson manages
/tools/

# Extracted plugins
/plugins/*/

# Job state
builds/
workspace/
lastStable
lastSuccessful
nextBuildNumber

有关详细信息,请参阅 this GitHub Gist 和 this blog post。

【讨论】:

caches 目录呢,有理由不忽略它吗?【参考方案4】:

有一个新的SCM Sync Configuration plug-in 完全符合您的要求。

SCM 同步配置 Hudson 插件 针对 2 个主要功能:

与您的 config.xml(和其他资源)hudson 文件保持同步 SCM 存储库 使用提交消息跟踪对每个文件所做的更改(和作者)

我还没有真正尝试过,但看起来很有希望。

【讨论】:

我对使用 Git 的 SCM Sync Configuration 插件的工作配置感兴趣,我尝试了几种配置,但我根本无法使其工作(并且日志中的错误消息是充其量没有帮助)。 SCM Sync Configuration plugin 已弃用:“一般来说,这意味着此插件要么已过时,不再开发,要么可能不再工作。”。跨度> 【参考方案5】:

您可以在Jenkins home folder(例如/var/lib/jenkins)中找到配置文件。

要将它们保留在 VCS 中,首先以 Jenkins (sudo su - jenkins) 身份登录并创建其 git 凭据:

git config --global user.name "Jenkins"
git config --global user.email "jenkins@example.com"

然后初始化、添加、提交基本文件如:

git init
git add config.xml jobs/ .gitconfig
git commit -m'Adds Jenkins config files' -a

还可以考虑创建 .gitignore 并忽略以下文件(根据需要自定义):

# Git untracked files to ignore.

# Cache.
.cache/

# Fingerprint records.
fingerprints/

# Working directories.
workspace/

# Secret files.
secrets/
secret.*
*.enc
*.key
users/
id_rsa

# Plugins.
plugins/

# State files.
*.state

# Job state files.
builds/
lastStable
lastSuccessful
nextBuildNumber

# Updates.
updates/

# Hidden files.
.*
# Except git config files.
!.git*
!.ssh/

# User content.
userContent/

# Log files.
logs/
*.log

# Miscellaneous litter
*.tmp
*.old
*.bak
*.jar
*.json
*.lastExecVersion

然后添加:git add .gitignore

完成后,您可以添加作业配置文件,例如

shopt -s globstar
git add **/config.xml
git commit -m'Added job config files' -a

如果需要,最后添加并提交任何其他文件,然后将其推送到要保留配置文件的远程存储库。


当 Jenkins 文件更新时,您需要重新加载它们(从磁盘重新加载配置)或从 Jenkins CLI 运行 reload-configuration

【讨论】:

为什么站点范围的配置被排除在外?我看到其他答案确实包括它们。 @kenorb 我会再次排除它。 *.xml 上方的注释行不会更改规则,并且 git 会忽略 所有 xml 文件,包括来自 jobs 目录的 config.xmlgit status 在此默默地忽略任何 new 项目。【参考方案6】:

一个更准确的.gitignore,灵感来自nepa的回复:

*
!.gitignore
!/jobs/
!/jobs/*/
/jobs/*/*
!/jobs/*/config.xml
!/users/
!/users/*/
/users/*/*
!/users/*/config.xml
!/*.xml

它会忽略除.xml 配置文件和.gitignore 本身之外的所有内容。 (与nepa 的.gitignore 的区别在于它不会像logs/cache/ 等那样“忽略”所有***目录(!*/

【讨论】:

【参考方案7】:

我更喜欢的方式是排除 Jenkins 主文件夹中的所有内容除了您真正希望在 VCS 中的配置文件。这是我使用的.gitignore 文件:

*
!.gitignore
!/jobs/*/*.xml
!/*.xml
!/users/*/config.xml
!*/

这会忽略除 (!) .gitignore 本身、作业/项目、插件和其他重要的用户配置文件之外的所有内容 (*)。

还值得考虑包含plugins 文件夹。烦人的更新插件应该包括在内...

基本上,此解决方案使将来的 Jenkins/Hudson 更新更容易,因为新文件不会自动在范围内。您只需在屏幕上显示您真正想要的内容。

【讨论】:

【参考方案8】:

Mark (https://***.com/a/4066654/142207) 的回答应该适用于 SVN 和 Git(尽管 Git 配置不适用于我)。

但如果您需要它来使用 Mercurial 存储库,请使用以下脚本创建作业:

hg remove -A || true
hg add ../../config.xml
hg add ../../*/config.xml
if [ ! -z "`hg status -admrn`" ]; then
    hg commit -m "Scheduled commit" -u fill_in_the@blank.com
    hg push
fi

【讨论】:

【参考方案9】:

我有written a plugin,可让您将 Jenkins 指令检查到源代码控制中。只需添加一个包含内容的.jenkins.yml 文件:

script:
    - make
    - make test

詹金斯会这样做:

【讨论】:

【参考方案10】:

我完全签入了哈德森,您可以以此为起点https://github.com/morkeleb/continuous-delivery-with-hudson

将整个 hudson 保存在 git 中是有好处的。所有配置更改都会记录下来,您可以在一台机器上轻松测试测试,然后使用 git pull 更新另一台机器。

我们将其用作工作中 hudson 持续交付设置的样板。

问候 莫腾

【讨论】:

以上是关于有没有办法将 Hudson / Jenkins 配置文件保存在源代码控制中?的主要内容,如果未能解决你的问题,请参考以下文章

jenkins配置权限不对导致无法登陆或者空白页面解决办法

Jenkins/Hudson 上传到 Testflight

如何从 Jenkins/Hudson 上传 APK 到 Play 商店?

Ansible 可以替代像 Hudson/Jenkins 这样的 CI 工具吗?

如何从 Jenkins (Hudson) 卸载插件?

Hudson不让用户登录。如何解决此问题?