Jenkins

#自动化

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 去执行代码中的单元测试脚本。

  1. 创建 Freestyle project (unittest)

  2. 选择 Source Code Management -> Git (file:///your/path/unittest)

  3. 选择 Build Triggers -> Trigger builds remotely -> Authentication Token (123456)

  4. 选择 Build -> Add build step -> Excute shell

    #!/usr/bin/bash
    python $WORKSPACE/test.py           # 环境变量通过页面上的链接查看。它会克隆 Git 到这个目录下。
    
  5. 准备好 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
    
  6. 再提交一次即可触发。

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