如何将 Jenkins 从一台 PC 移动到另一台 PC
Posted
技术标签:
【中文标题】如何将 Jenkins 从一台 PC 移动到另一台 PC【英文标题】:How to move Jenkins from one PC to another 【发布时间】:2012-02-02 05:46:37 【问题描述】:我目前在我的开发 PC 上使用 Jenkins。我将它安装在我的开发 PC 上,因为我对这个工具的了解有限;所以我在我的开发PC上对其进行了测试。现在,我对 Jenkins 作为我在构建过程中的长期“合作伙伴”感到满意,并希望将此 Jenkins “移动”到专用服务器。
在此之前,我已经完成了一些构建,并从每个构建中存档了工件。特别是,内部版本号对我来说对于版本控制非常重要。
如何将所有 Jenkins 信息从我当前的 PC 导出到我的新服务器?
【问题讨论】:
我刚做了这个。我按照 Cédric Julien 的回答中的步骤进行操作,但我发现在 Windows 上,我必须先运行修复安装,然后 Jenkins 才能在移动后成功启动。修复后一切正常。 【参考方案1】:假设我们正在将 Jenkins LTS 从 PC1 迁移到 PC2(LTS 版本与升级相同)。 使用ThinBackUp插件实现Jenkins版本的迁移或升级,非常方便。
第 1 步:准备 PC1 进行迁移
管理 Jenkins -> ThinbackUp -> 设置 选择正确的选项和目录进行备份 如果您需要作业历史记录并且需要添加工件,请同时选择“Back build results”选项。 返回点击立即备份。注意:此 Thinbackup 还将采用可选的插件备份。
检查 ThinbackUp 文件夹必须有一个包含当前日期和时间戳的文件夹。 (等待几分钟,可能需要一些时间。) 您已准备就绪,将其压缩并复制到 PC2 中的 PARTICULAR(将是“备份目录”)目录。 解压 ThinbackUp 压缩文件夹。 停止 PC1 中的 Jenkins 服务。第二步: 在 PC2 中安装 Jenkins(使用 .war 文件或粘贴存档版本安装)。
使用命令sc create <Jenkins_PC2Servicename> binPath="<Path_to_Jenkinsexe>/jenkins.exe"
创建 Jenkins 服务
如果需要,在 PC2 中修改 JENKINS_HOME/jenkins.xml。
在 PC2 中运行 windows 服务 注意:如果您在 Jenkins 作业中使用 SCM 的数据库设置,那么您需要格外小心,因为所有 SCM 插件不支持借助 ThinbackUp 插件进行数据库设置。 例如如果您正在使用 PTC Integrity SCM 插件,并且某些 Jenkins 作业正在使用使用 Integrity 的数据库,那么它将创建一个目录 JENKINS_Home/IntegritySCM,ThinbackUp 在备份时不会包含此数据库。
解决方案:直接将这个JENKINS_Home/IntegritySCM文件夹从PC1复制到PC2。
【讨论】:
【参考方案2】:如果您的 JENKINS_HOME 目录太大而无法复制,而您只需要设置相同的作业、Jenkins 插件和 Jenkins 配置(并且不需要旧的作业工件和报告),那么你可以使用ThinBackup Plugin:
在源和目标 Jenkins 服务器上安装 ThinBackup
在两者上配置备份目录(在 Manage Jenkins → ThinBackup → Settings)
在源 Jenkins 上,转到 ThinBackup → 立即备份
从Jenkins源备份目录复制到Jenkins目标备份目录
在目标 Jenkins 上,进入 ThinBackup → Restore,然后重启 Jenkins 服务。
如果缺少某些插件或作业,请将备份内容直接复制到目标 JENKINS_HOME。
如果您在源 Jenkins 上进行了用户身份验证,但现在锁定在目标 Jenkins 上,则编辑 Jenkins config.xml,将 <useSecurity>
设置为 false,然后重新启动 Jenkins。
【讨论】:
为什么 JENKINS_HOME 目录太大而无法复制?我们在谈论什么样的尺寸? 我的 jenkins_home 是 100Gb 左右,不想将它复制到新服务器,因为它大多是扔掉的东西 我的 Jenkins_home 约为 4TB,因此仅包含配置且没有构建历史记录或 /usercontent 的精简副本是有用的。 感谢 @halfer 指出这一点,但我相信 SO 最初是为技术答案而设计的。只要我的答案是明确的(代表点表明它是) - 在没有技术改进的情况下修复语法,即使不是滥用也是一件麻烦事。 我将它回滚到固定版本。它进行了许多非装饰性的修复并提高了可读性。请不要在没有充分理由重新引入错别字的情况下回滚。谢谢。【参考方案3】:有时我们可能无法访问 Jenkins 机器来将文件夹直接复制到另一个 Jenkins 实例中。所以我编写了一个菜单驱动的实用程序,它使用 Jenkins REST API 调用将插件和作业从一个 Jenkins 实例安装到另一个实例。
插件迁移:
-
GET 请求:
SOURCE_JENKINS_SERVER/pluginManager/api/json?depth=1
将为您提供与其版本一起安装的插件列表。
您可以发送带有以下参数的 POST 请求来安装这些插件。
final_url=`DESTINATION_JENKINS_SERVER/pluginManager/installNecessaryPlugins`
data=`<jenkins><install plugin="PLUGIN_NAME@latest"/></jenkins>` (where, latest will fetch the latest version of the plugin_name)
auth=`(destination_jenkins_username, destination_jenkins_password)`
header=`crumb_field:crumb_value,"Content-Type":"application/xml”` (where crumb_field=Jenkins-Crumb and get crumb value using API call DESTINATION_JENKINS_SERVER/crumbIssuer/api/json
对于工作迁移:
-
您可以使用 REST 调用
SOURCE_JENKINS_URL/view/All/api/json
获取安装在 SOURCE_JENKINS_URL 上的作业列表
然后您可以使用作业 URL SOURCE_JENKINS_URL/job/JOB_NAME
从 SOURCE_JENKINS_URL 上的作业中获取每个作业 config.xml 文件。
使用此 config.xml 文件在 DESTINATION_JENKINS_URL 上发布 XML 文件的内容,这将在 DESTINATION_JENKINS_URL 上创建一个作业。
我在 Python 中创建了一个菜单驱动的实用程序,它要求用户启动插件或 Jenkins 迁移并使用 Jenkins REST API 调用来执行此操作。
您可以从此网址引用JenkinsMigration.docx jenkinsjenkinsmigrationjenkinsrestapi
【讨论】:
虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生变化,Link-only 的答案可能会失效。【参考方案4】:Jenkins 服务器自动化:
第 1 步:
设置一个存储库以将 Jenkins 主页(作业、配置、插件等)存储在 GitLab 本地或 GitHub 私有存储库中,并通过推送对 Jenkins 作业、插件等的任何新更改来定期更新。
第 2 步:
为 Jenkins 配置一个 Puppet 主机组/角色,可用于启动新的 Jenkins 服务器。在 Puppet 配方中进行所有基本配置,并确保它安装最新版本的 Jenkins 并为 JENKINS_HOME
设置单独的目录/挂载。
第 3 步:
使用上面的 Jenkins-puppet 配置启动一台新机器。安装完所有内容后,将 Jenkins 配置从 Git 存储库抓取/克隆到 Jenkins 主目录并重新启动 Jenkins。
第 4 步:
转到 Jenkins URL,Manage Jenkins → Manage Plugins 并更新所有需要更新的插件。
完成
您可以使用Docker Swarm 或Kubernetes 来自动扩展从节点。
【讨论】:
【参考方案5】:按照Jenkins wiki,您必须:
在新服务器上安装新的 Jenkins 实例 确保新旧 Jenkins 实例均已停止 归档旧 Jenkins 实例的 JENKINS_HOME 的所有内容 将存档解压到新的 JENKINS_HOME 目录中 启动新的 Jenkins 实例 不要忘记将文档/链接更改为新的 Jenkins 实例 :) 不要忘记更改新 Jenkins 文件的所有者:chown -R jenkins:jenkins $JENKINS_HOME
JENKINS_HOME 在 Linux 安装中默认位于 ~/.jenkins
,但要准确找到它的位置,请转到 http://your_jenkins_url/configure 页面并检查第一个参数的值:Home directory
;这是 JENKINS_HOME。
【讨论】:
当我启动我的新 jenkins 时,我的节点显示出来了,这是正确的。但是当我点击某个节点时,那里的 URL 指向旧 jenkins,如下所示: 从从属命令行运行:javaws old-jenkins-server:8080/computer/slaveMachine1/slave-agent.jnlp 或者如果从属是无头的:java -jar slave.jar -jnlpUrl old-jenkins-server:8080/computer/slaveMachine1/slave-agent.jnlp 现在我应该怎么做让每个节点的这些 URL 指向 new-jenkins-server? 得到了我之前评论中提到的问题的解决方案:转到管理 Jenkins > 配置系统。在“Jenkins 位置”部分的“Jenkins URL”字段下,更改 URL 以将其指向新的 jenkins 服务器。 确保也复制隐藏文件夹! 哈哈 +1 “不要忘记更改文档/链接到您的新 Jenkins 实例” 我在正确的文件权限和所有权方面遇到了问题,为了解决这个问题,我使用了这个 docker 脚本(设置所有权/权限的部分):hub.docker.com/r/appcontainers/jenkins/~/dockerfile【参考方案6】:这对我从 Ubuntu 12.04(Jenkins 版本 1.628)迁移到 Ubuntu 16.04(Jenkins 版本 1.651.2)很有帮助。我先installed Jenkins from the repositories。
-
Stop both Jenkins servers
将JENKINS_HOME
(例如/var/lib/jenkins)从旧服务器复制到新服务器。从新服务器中的控制台:
rsync -av username@old-server-IP:/var/lib/jenkins/ /var/lib/jenkins/
Start your new Jenkins server
你可能不需要这个,但我必须
Manage Jenkins
和 Reload Configuration from Disk
。
断开并重新连接所有从站。
检查Configure System > Jenkins Location
中的Jenkins URL
是否已正确分配给新的Jenkins 服务器。
【讨论】:
新的 Jenkins 和旧的版本一样吗? @JakubCzaplicki - 两个 Jenkins 都是 1.6,但版本不完全相同。答案已更新。然后我将 Ubuntu 16.04 更新为 Jenkins 2.6,替换了 jenkins.war 文件,它运行良好。 ***.com/questions/11062335/… 完成上述操作并访问/configureSecurity
我得到java.lang.AssertionError: InstanceIdentity is missing its singleton
@maxisme,迟到了,但这个帖子表明你提到的问题与 java 版本有关。 issues.jenkins-ci.org/browse/JENKINS-46182以上是关于如何将 Jenkins 从一台 PC 移动到另一台 PC的主要内容,如果未能解决你的问题,请参考以下文章