在 openshift 上搭建专属 jenkins

申请 openshift 帐户

之前的文章说过, openshift 的免费账户非常给力, 512M 内存的容器, 免费赠送 3 个, 很是适合作为 jenkins 的 master 来使用. 

那么第一步, 肯定是申请 openshift 帐户了.

访问 https://www.openshift.com/ , 右上角有个 SIGN UP FOR FREE.   填写相关的资料之后就可以开通 openshift 帐户了, 过程非常简单, 基本不会碰到什么问题.

我申请了两个帐户, 一个是 free 帐户, 一个我提升到了 Bronze 帐户 (实际还是免费地用着, 后面 "帐户提升" 的章节会再次说明).


创建 应用

第一次进入自己的帐户之后, 显示如下图, 点击 Create your first application now


在列出的应用类型中, 选择类型 Jenkins Server


接下来, 填写自己中意的域名, 其他按照默认的来就可以.


jenkins 设置

我们在 openshift app 列表中选择并安装的 jenkins 版本有点儿老, 不过毕竟是 openshift 官方提供的, 稳定性和兼容性更值得信赖一些.

安装完成之后, 页面会显示 jenkins 的访问地址, 以及用户名和密码.

登录自己的 jenkins 之后, 第一件事情, 一定是修改密码, 或者把页面上的密码给保存起来!!!

管理用户名密码的位置在: 登录后 -> 系统管理 -> 管理用户 -> 用户列表中点击 admin 一行, 最后的修改按钮 -> 修改密码, 用户名, 邮箱等各项内容. 修改完之后, 一定要拖到页面最下方, 点击应用或者保存.

如果说不及时修改, 这个随机密码找不到了的话就登不上系统, 无法操作了. (好吧, 实际上还是有办法的, 通过修改容器文件中的 jenkins config, 但是比较麻烦, 你一定不希望遇到这样的麻烦的对不对??)


对于 Jenkins 这个系统本身的使用, 在此不多做展开, 因为不管是不是使用 openshift 容器, jenkins 的使用都没太大区别.

有一点, 我们可以在 openshift 上创建另外一个 app, 例如一个 php+mysql 的 app, 然后将这个 app 用我们的这个 jenkins 服务器来驱动持续集成, 不过我也没太用过这个功能, 而是自己买了一台 vps 作为 slave, 接入了 openshift 上的 jenkins master.


那么在 openshift 上搭建 jenkins, 还需要配置什么呢?

对于我来说, 我需要经常使用 jenkins 的定时触发功能, 但是在我配置了任务之后, 发现 jenkins 默认使用的时区是 NewYork 的, 可我是 GMT+8. 看起来是小问题, 但是解决不了也很麻烦. 比如我想每天早上 6 点去更新一些服务器的线上词典, 可是配置了 H 6 * * * 的任务之后, 会发现 jenkins 按照 NewYork 的时间来给我算 6 点了, 丧心病狂啊.



然后为了修改这个 timezone, 确实费了老鼻子劲, 网上搜了之后没有发现任何有价值的信息, 阅读了 openshift 的官方文档之后, 觉得可能可以通过修改环境变量的方式来进行.

一番周折之后, 找到了 openshift 的开源代码.

https://github.com/openshift/origin-server/tree/master/cartridges/openshift-origin-cartridge-jenkins

这是 openshift 用于管理 jenkins 环境的脚本, 在这里找到 bin/control 文件, 其中有一段是这样子的:

  JENKINS_CMD="${JENKINS_CMD} ${JENKINS_OPTS} -DJENKINS_HOME=$OPENSHIFT_DATA_DIR \
      -Dhudson.slaves.NodeProvisioner.recurrencePeriod=500 \
      -Dhudson.slaves.NodeProvisioner.initialDelay=100 \
      -Dhudson.slaves.NodeProvisioner.MARGIN=100 \
      -Dhudson.model.UpdateCenter.never=true \
      -Dhudson.DNSMultiCast.disabled=true \
      -jar ${JENKINS_WAR_PATH} \
      --ajp13Port=-1 \
      --controlPort=-1 \
      --logfile=/dev/stdout \
      --httpPort=8080 \
      --handlerCountMax=45 \
      --handlerCountMaxIdle=20 \
      --httpListenAddress=$OPENSHIFT_JENKINS_IP"

可以看到, 在 openshift 上, jenkins 的启动命令是固定格式的, 唯一可以自定义的就在 JENKINS_OPTS 这个变量上了.


所以思路就很清晰了, 通过修改容器的环境变量, 让 jenkins 启动的时候设置时区.


那么修改环境变量要怎么做呢?

第一步是要 follow openshift 上面的介绍, 将本地的 ssh public key 设置进去. 参见下面的两张图, 点击 add an SSH public key.


接下来就是设置 public key, 这个public key 是哪里来的呢?

在 linux/mac 上, 可以在命令行里面直接生成, 如果是 windows 的话, 推荐安装 git bash, 运行之后, 和 linux/mac 下一样, 运行以下命令:

ssh-keygen -t rsa, 一路回车

linux/mac 在~/.ssh 目录下会生成 id_rsa.pub, 这就是我们需要的 key. 而在 windows 上, 路径是在 c:\Documents and Settings\ 当前用户名 \.ssh 目录下

总之, 生成之后, 将 public key 粘贴到下图的输入框中, 点击 create 即可.


接下来, 在 Applications 的界面, 右面点击 Want to log in to application? ssh 地址就会显示出来. 直接 ssh 即可. 如果在 windows 下使用 securecrt 的话, 可能会提示要求从本地选取 key, 选择上面步骤中生成的 id_rsa.pub 即可.


登录之后, cd .env/user_vars, 创建 3 个文件, 分别叫做 JENKINS_OPTS, JAVA_OPTS, JAVA_OPTS_EXT, 内容设置为

-Duser.timezone=GMT+08

这就表示设置 3 个环境变量, 值就是文件中的内容.



再然后, 通过 openshift 的 rhc 命令, 重启 app, 

rhc app-restart  应用名 --namespace 空间后缀名称

rhc 的安装请参见: http://my.oschina.net/xoyo/blog/173649


再次查看 jenkins 的系统信息, 就会发现它的时区已经变成了 GMT+8.


还有一个问题是, 搭建的 jenkins 只能通过 https 方式访问, 这一点我也查了好久资料, 一直没有解决, 所以也无法绑定自己的域名, 或者是通过国内的加速器来访问. 通过上面阅读 jenkins 的 control 代码, 发现它的启动端口是 8080, 而不是我们访问到的 80 端口, 所以应该是通过反向代理的机制来对外提供服务的, 而这个对外提供服务的, 可能是 nginx 或者 apache 之类, 我们可能无法直接进行操作来控制使用 http 而非 https.

至于是否真是如此, 我也不得而知. 大家如果有兴趣的话, 可以再研究研究.


毕竟, openshift 提供的 docker 服务, 确实已经是我目前发现的最大方最稳定的免费容器了, 值得深挖它的价值.



户提升

前面有说过, 我申请了两个 openshift 帐户, 一个免费帐户, 一个是 bronze(铜牌)帐户. 原因在于, 普通的免费帐户, 使用上有个最大的限制, 搭建的服务, 如果 3 天内没有访问, 就会自动暂停.

而我搭建 jenkins, 只是为了当成一个 master 来进行任务调度的, 不一定每天都看, 更何况有的时候放假之类的, 没有时间看, 那岂不是动不动就要被暂停?


所以在这里提供 2 个方案:

1. 帐户提升. 提升至 Bronze 帐户, 实际只需要绑定一张信用卡即可, 国内信用卡也有效. 只要不选择更大内存 /cpu 规模的容器, 并且不超过免费的 3 个容器额度, 照样还是免费的, 不会乱扣费.

2. 如果不放心信用卡做绑定, 还有一个 (我假想中应该没有问题, 但是实际没有试验过的) 方案: 我们搭建的就是 jenkins 服务嘛, 上面就设置一个定时任务好了, 用 curl 的方式来模拟 jenkins 首页的访问. 为了防止 openshift 自己再做一些规则校验(例如流量来源), 可以接入一台 slave 来执行任务, 再通过 curl 参数的方式传入 UA, referer 等信息, 每天执行一次就好.

本文链接:https://www.poisonbian.com/post/5024.html 转载需授权!

分享到:
原文链接:,转发请注明来源!
「在 openshift 上搭建专属 jenkins」评论列表

发表评论