在工作中使用 jenkins 做持续集成,已经将近3年了。按照我的性格,用一样东西,就想了解它的源码实现。期间看过不少 jenkins 插件的代码,却一直没有看过 jenkins core 的源码。主要原因,是第一眼看代码的时候,感觉 jenkins 当初从 hudson 分出来,背负了不少历史包袱,代码结构有点混乱。

不过最近心血来潮,又开始想研究 jenkins core 的源码,在公司里面使用 jenkins,大多是用来实现自动打包部署,和自动化测试。这些 job 的实现,查看文档,使用几个插件就能完成。不了解源码,已经不能满足我的好奇心了。

学习源码,第一步要做的,就是能够编译运行,并且debug。jenkins 使用 maven 作为构建系统,编译和运行,都非常简单。不过依赖非常多,在 maven 下载依赖的时候,在这里写博客。算是挖个坑,督促自己把坑填了。:D

源码

jenkins 的源码,目前放在 github 上面,clone 下来即可。

$ git clone https://github.com/jenkinsci/jenkins.git

编译

编译 jenkins,需要 JDK 和 maven,按照 官方文档 操作即可。不过默认的构建命令,会跑单元测试,由于环境原因,测试用例或许会失败。为了先简单体验一下,我们可以跳过部分测试。这里我用了源码目录里,BUILDING.TXT 文件介绍的命令。

$ mvn clean install -pl war -am -DskipTests

这一步执行后,maven 需要在源里下载很多依赖包,由于国内的网络环境,需要花不少时间。如果等不及,可以使用国内的 maven 源。不过我在使用 oschina 提供的源时,提示缺少依赖,可能是还没同步过来,乖乖换回了官方的源。

如果一切顺利,就能在 war/target/ 目录下面,找到 jenkins.war 文件。在我这边就不顺利,由于网络不好,光是下载依赖就花了几个小时,哈哈。

运行

在使用方面,jenkins非常友好。所有代码、依赖,都在 jenkins.war 文件里面,所有数据,默认都在 $HOME/.jenkins 目录下面。在升级版本,或者备份、迁移数据的时候,都很舒服。

上面我们已经得到 jenkins.war 文件,运行之。

$ java -jar jenkins.war

用浏览器访问 http://localhost:8080 ,即可以访问我们从源码编译出来的 jenkins 版本了。

Debug

成功编译运行后,最简单、原始的方法,就是在自己不懂的地方,打日志,重新编译运行啦。IDE 我用的是 Intellij IDEA,因为可以通过直接打开 maven 的 pom 文件,来导入一个 Project。

如果更习惯使用 debugger 来单步调试,也是支持的。根据文档,在源码目录,执行以下命令即可。

$ cd war
$ mvnDebug jenkins-dev:run

这样子跑起来的 jenkins 实例,会额外监听 8000 端口(jdwp端口),用 IDE 提供的 remote debug 功能连上去即可。