申请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等信息, 每天执行一次就好.