专栏首页Jenkins关于 Jenkins master 共享 JENKINS_HOME 目录的实验

关于 Jenkins master 共享 JENKINS_HOME 目录的实验

审校:王冬辉,linuxsuren

Jenkins master 的高可用是个老大难的问题。和很多人一样,笔者也想过两个 Jenkins master 共享同一个 JENKINS_HOME 的方案。了解 Jenkins 原理的人,都会觉得这个方案不可行。但是真的不可行吗?

由于工作原因,笔者需要亲自验证以上猜想。

JENKINS_HOME 介绍

Jenkins 所有状态数据都存放文件系统的目录中,这个目录被称为 JENKINS_HOME 目录。

实验环境介绍

笔者通过 Docker compose 启动两个独立的 Jenkins master,分别为 jenkins-a 和 jenkins-b。它们共用同一个 JENKINS_HOME 目录。相应的代码仓库的链接放在文章底部。

将代码克隆到本地后,进入仓库,执行 docker-compose up -d 即可启动实验环境。启动完成,在浏览器中输入 http://localhost:7088 可访问 jenkins-a,jenkins-b 的地址是 http://localhost:7089 。但是你会发现它们启动后的界面显示是不一样的。

jenkins-b 的界面如下图所示:

而 jenkins-a 的界面如下图所示:

这时,将 jenkins-a 日志中的解锁密码(Unlock password)输入到 jenkins-b 的页面中,会得到报错信息:

ERROR: The password entered is incorrect, please check the file for the correct password

这时,再次 jenkins-b 日志中的解锁密码(Unlock password)输入到表单中即可进入下一步。接下来就是按照提示一步步完成了。在 jenkins-b 安装步骤的最后一步,我们设置了管理员的用户名密码:admin/admin。然后就算完成任务了。

然后我们再在 jenkins-a 使用 admin/admin 进行登录,登录是报错的:用户密码不正确。

接下来,执行 docker-compose restart jenkins-a 命令重启 jenkins-a。再次使用 admin/admin 就可以登录成功了。

当两个 Jenkins 启动完成后,接下来开始做实验。

实验1:创建任务

在 jenkins-a 创建任务 x,刷新 jenkins-b 的页面,jenkins-b 上会不会显示出任务 x ?

结果:jenkins-b 不会出现任务 x。重启 jenkins-b 后,任务 x 出现在任务列表中。

实验2:任务结果可见性

jenkins-a 上任务执行,jenkins-b 上能否看到任务执行结果?

jenkins-a 执行任务 x,并且执行成功。刷新 jenkins-b 看不到任何执行记录。重启 jenkins-b 后,可看到执行记录。

实验3:两 master 同时执行同一任务

分别在两个 Jenkins master 上(几乎)开始同一个任务 x。其中一个任务的 build number 会更新,但是另一个不会。

其中 jenkins-a 任务 x 的 build number 会升到 2,而 jenkins-b 保持的是 1。这时,单独执行 jenkins-b 的任务 x,日志会出现错误:

jenkins-b_1  | WARNING: A new build could not be created in job x
jenkins-b_1  | java.lang.IllegalStateException: JENKINS-23152: /var/jenkins_home/jobs/x/builds/2 already existed; will not overwrite with x #2

实验4:编辑任务

jenkins-a 上设置任务 x 定时执行,刷新 jenkins-b 页面,任务 x 中并没有定时执行的设置。重启 jenkins-b 后,任务 x 更新。

实验5:定时任务的结果是什么?

如果 jenkins-a 和 jenkins-b 两个任务均为定时任务,而且都生效了。它们运行结果是什么的呢?

看到的现象是,两个任务都会按时执行,但是只有一个任务能将运行结果写入到磁盘中。界面如下图:

另,从日志中,可以确认 jenkins-a 和 jenkins-b 确实按时执行了。如下图日志中,看出 jenkins-a 定时执行 #6 次构建时报错,因为 jenkins-b 已经执行过 #6 次构建了:

小结

可以确认的是,当两个 Jenkins 进程共用同一个 JENKINS_HOME 目录时,其中一个 Jenkins 进程更新了 JENKINS_HOME 的内容,另一个是不会实时更新的。所以,同时启动两个 Jenkins master 共用同一个 JENKINS_HOME 的方案是不可行的。我们不能在 jenkins-a 挂了后,直接将流量切到 jenkins-b。因为 jenkins-b 必须重启。

最后结论:多个 Jenkins master 共享同一个 JENKINS_HOME 的方案是无法使用 Jenkins master 的高可用。

附录

  • Jenkins standby 实验环境:https://github.com/zacker330/jenkins-standby-experiment

本文分享自微信公众号 - Jenkins(Jenkins-Community),作者:翟志军

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Docker Hub 上的官方 Jenkins 镜像

    目前,在 Docker Hub 上有三个不同的仓库正(或曾经)被当作“官方” Jenkins 镜像。本文是为了申明哪个是当前的官方镜像(截至2018年12月).

    LinuxSuRen
  • 使用 Zabbix 监控 Jenkins

    笔者最近的工作涉及到使用 Zabbix 监控 Jenkins。在谷歌上搜索到的文章非常少,能操作的就更少了。所以决定写一篇文章介绍如何使用 Zabbix 监控 ...

    LinuxSuRen
  • 使用 Docker 全自动构建 Java 应用

    我们会在 Docker 容器里运行 Jenkins,再使用 Jenkins 启动一个 Maven 容器,用来编译我们的代码,接着在另一个 Maven 容器中运行...

    LinuxSuRen
  • jenkins 入门教程(下)

    接上回继续学习jenkins,这次主要来看一些疑难杂症: 一、yum install安装方式 除了直接java -jar jenkins.war方式,还可以用y...

    菩提树下的杨过
  • jenkins学习1-docker快速搭建jenkins环境

    jenkins的环境搭建方法有很多,本篇使用docker快速搭建一个jenkins环境。 环境准备:

    上海-悠悠
  • Helm部署和体验jenkins

    下图来自rancher官方博客,在kubernetes环境下,jenkins任务被交给各个pod执行,这些pod在需要时被创建,任务结束后被销毁,这样既能合理利...

    程序员欣宸
  • docker安装jenkins

    -p 5555:8080 -p 50000:50000 进行端口映射 --privileged=true 在CentOS7中的安全模块selinux把权限禁掉了...

    似水的流年
  • 让自动化工作流解放你的双手

    相信很多小伙伴和我目前的现状是一样的,公司的前端部署测试和上线都是通过人工去操作,当我们本地开发完成之后,在本地进行打包,然后将打包后的 dist 文件上传到服...

    石燕平
  • 【Kubernetes系列】第8篇 CI/CD之组件部署

    应对敏捷开发的需求,对CI(持续集成))/CD(持续交付)的提出了更高的标准,今天来讨论下,如何基于开源组件(gitlab/jenkins/harbor/kub...

    HankerCloud
  • centos下搭建Jenkins持续集成环境(安装jenkins)

    如果不能安装就到官网下载jenkis的rmp包,官网地址(http://pkg.jenkins-ci.org/redhat-stable/)

    拓荒者

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动