About
Jenkins 源于 2004 年 Sun 公司的员工 Kohsuke Kawaguchi 的个人项目,最初叫 Hudson。后来 Sun 被 Oracle 收购,包括 Hudson 商标,之后开源社区又与 Oracle 产生分歧,就另外维护了一个开源的分支,叫做 Jenkins。Oracle 的版本依旧叫 Hudson。
Jenkins 是用 Java 开发的。
安装
WAR 包形式
这种方式运行在内嵌的 Servlet 容器中。
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
java -jar jenkins.war
CentOS 7
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum install jenkins
systemctl start jenkins
然后
访问:http://localhost:8080,按照页面指示一步步操作就可以了。
配置文件
/var/lib/jenkins/ # 这是通过服务启动的方式,如果是手动启动,配置文件路径是 ~/.jenkins
├── config.xml
├── hudson.model.UpdateCenter.xml
├── hudson.plugins.git.GitTool.xml
├── identity.key.enc
├── jenkins.install.InstallUtil.lastExecVersion
├── jenkins.install.UpgradeWizard.state
├── jobs/ # 工作目录
├── logs/
├── nodeMonitors.xml
├── nodes/
├── plugins/
├── queue.xml.bak
├── secret.key
├── secret.key.not-so-secret
├── secrets/
├── updates/ # 可用的插件更新
├── userContent/
├── users/
├── war/
└── workflow-libs/
/etc/sysconfig/jenkins # 配置文件
工作目录结构:
jobs/
├── builds
│ ├── 1 # build 目录
│ │ ├── build.xml # build 信息
│ │ └── log # <终端输出>
│ ├── 2
│ │ ├── build.xml
│ │ ├── changelog.xml
│ │ └── log
│ ├── 3
│ │ ├── build.xml
│ │ ├── changelog.xml
│ │ └── log
│ ├── lastFailedBuild -> 4
│ ├── lastStableBuild -> 6
│ ├── lastSuccessfulBuild -> 6
│ ├── lastUnstableBuild -> -1
│ ├── lastUnsuccessfulBuild -> 4
│ └── legacyIds
├── config.xml
├── lastStable -> builds/lastStableBuild
├── lastSuccessful -> builds/lastSuccessfulBuild
├── nextBuildNumber
└── workspace/
新建作业:Hello World
New Item -> Freestyle project ( test
)
- -> Build Triggers -> Trigger builds remotely -> Authentication Token (
123456
)
- -> Build -> Add build step -> Exceute shell(建两个)
## Build 1
#!/usr/bin/bash
echo "Hello Jenkins" > /tmp/hello.txt
## Build 2
#!/usr/bin/bash
echo "Task 2" >> /tmp/hello.txt
访问:http://localhost:8080/job/test/build?token=123456,然后就可以看到文件被创建了。
从首页点击任务链接进去后,可以看到任务执行历史。左边还有一个 Build now
按钮,点击就立即执行任务。
Git Hook + 单元测试
通过 Git Hook 监测用户 Commit,然后触发 Jenkins 去执行代码中的单元测试脚本。
-
创建 Freestyle project (unittest
)
-
选择 Source Code Management -> Git (file:///your/path/unittest
)
-
选择 Build Triggers -> Trigger builds remotely -> Authentication Token (123456
)
-
选择 Build -> Add build step -> Excute shell
#!/usr/bin/bash
python $WORKSPACE/test.py # 环境变量通过页面上的链接查看。它会克隆 Git 到这个目录下。
-
准备好 test.py
和 Hook:
$ git init unittest
$ cd unittest/
$ cat << EOF > test.py
import unittest
def div(m,n):
return m/n
class TestDiv(unittest.TestCase):
def setUp(self):
pass
def test_a(self):
self.assertEqual(div(4,2), 2)
def test_b(self):
self.assertEqual(div(0,2), 0)
if __name__ == '__main__':
unittest.main()
EOF
$ git add test.py; git commit -m "init"
$ cat << EOF > .git/hooks/post-commit
#!/usr/bin/bash
curl -u USER:PASSSWD http://localhost:8080/job/unittest/build?token=123456 # 修改用户名密码
$ chmod +x .git/hooks/post-commit
-
再提交一次即可触发。
Build 后触发另一个 Job
Build Triggers -> Build after other projects are built -> Projects to watch (填入 Project 名)
- Trigger only if build is stable
- Trigger even if the build is unstable
- Trigger even if the build fails
触发 Build 的方式
wget http://USER:PASSWD@JENKINS_URL/job/NAME/build?token=TOKEN
curl -u USER:PASSWD http://JENKINS_URL/job/NAME/build?token=TOKEN
环境变量
如果 Build 方式为 Excute shell,可能需要在脚本中用到一些环境变量。见 /env-vars.html
。
另外,shell 不一定是 bash,也可以是 Python 脚本之类的,加上 shebang (#!) 即可。
BRANCH_NAME
CHANGE_ID
CHANGE_URL
CHANGE_TITLE
CHANGE_AUTHOR
CHANGE_AUTHOR_DISPLAY_NAME
CHANGE_AUTHOR_EMAIL
CHANGE_TARGET
BUILD_NUMBER
BUILD_ID
BUILD_DISPLAY_NAME
JOB_NAME
JOB_BASE_NAME
BUILD_TAG
EXECUTOR_NUMBER
NODE_NAME
NODE_LABELS
WORKSPACE # 绝对路径。如果绑定了 Git,里面就是代码。
JENKINS_HOME
JENKINS_URL
BUILD_URL
JOB_URL
SVN_REVISION
SVN_URL
服务换端口、加前缀
通过参数手动启动:
java -jar jenkins.war --prefix=/jenkins --httpPort=8000 # 换端口
或者编辑 /etc/sysconfig/jenkins
:
JENKINS_PORT="8000"
JENKINS_ARGS="--prefix=/jenkins"
然后重启服务:
systemctl restart jenkins
访问:http://localhost:8000/jenkins
用 Apache 做反向代理
创建文件 /etc/httpd/conf.d/jenkins.conf
:
ProxyRequests Off
ProxyPass /jenkins http://localhost:8000/jenkins nocanon
ProxyPassReverse /jenkins http://localhost:8000/jenkins
AllowEncodedSlashes NoDecode
<Proxy http://localhost:8000/jenkins*>
Require all granted
</Proxy>
要关闭 SELinux,或者:
setsebool -P httpd_can_network_connect true
访问:http://localhost/jenkins