DevOps 之 Jenkins 安装、配置、美化、插件及常见错误处理

继续上一篇的话题,既然已经搭建了 GitLab 的代码仓库,那么现在就可以开始进行下一步持续集成环境的搭建了。公司准备利用 Jenkins CI 进行持续集成,本文记录了 Jenkins 的安装、基础配置、界面美化、常用插件及常见错误处理。

安装Jenkins

准备工作

  1. 安装 JDK,并配置环境变量

  2. 安装 maven

  3. 配置阿里云的 maven 镜像源地址,vim /usr/share/maven/conf/settings.xml 将👇内容添加进 mirrors 节点

    1
    2
    3
    4
    5
    6
    7
    <mirror>
    <!--This sends everything else to /public -->
    <id>nexus-aliyun</id>
    <mirrorOf>*</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
  4. 安装 git

配置镜像源地址

1
2
3
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

修改访问 IP 和 端口号

  1. vim /etc/sysconfig/jenkins
  2. JENKINS_PORT="10080"

配置 JDK 路径到 Jenkins 中

  1. vim /etc/init.d/jenkins

  2. 将自己的 java 目录加入到 candidates

    1
    2
    3
    4
    5
    6
    7
    8
    9
    candidates="
    /etc/alternatives/java
    /usr/lib/jvm/java-1.8.0/bin/java
    /usr/lib/jvm/jre-1.8.0/bin/java
    /usr/lib/jvm/java-1.7.0/bin/java
    /usr/lib/jvm/jre-1.7.0/bin/java
    /usr/bin/java
    /opt/jdk1.8.0_144/bin/java
    "

安装完毕后启动

1
sudo service jenkins start # 启动jenkins服务

配置 Jenkins

  1. 初始化密码

    cat /var/lib/jenkins/secrets/initialAdminPassword

  2. 安装插件

    选择左侧推荐的插件安装即可

  3. 配置管理员账号密码

  4. 配置 JDK、Maven、Git、Docker

    系统管理 → 全局工具配置(尽量在服务器本地安装,然后输入安装路径,不推荐使用在线安装,因为在线安装有些资源都在国外,下载速度极慢)

  5. 配置邮件服务器信息

    系统管理 → 系统设置,①Jenkins Location→系统管理员邮件地址②Extended E-mail Notification③邮件通知。

    其中Extended E-mail Notification的两个地方可以做个性化配置:

    • Default Content Type 邮件的内容类型,改为HTML(text/html)

    • Default Subject 邮件的标题,改为构建通知:$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!

    • Default Content 邮件的内容,改为👇内容。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="UTF-8">
      <title>${PROJECT_NAME}-第${BUILD_NUMBER}次构建日志</title>
      </head>
      <body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0">
      <table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
      <tr>
      <td>(本邮件是程序自动下发的,请勿回复!)</td>
      </tr>
      <tr>
      <td><h2>
      <font color="#0000FF">构建结果 - ${BUILD_STATUS}</font>
      </h2></td>
      </tr>
      <tr>
      <td><br />
      <b><font color="#0B610B">构建信息</font></b>
      <hr size="2" width="100%" align="center" /></td>
      </tr>
      <tr>
      <td>
      <ul>
      <li>项目名称: ${PROJECT_NAME}</li>
      <li>构建编号: 第${BUILD_NUMBER}次构建</li>
      <li>触发原因: ${CAUSE}</li>
      <li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
      <li>构建Url: <a href="${BUILD_URL}">${BUILD_URL}</a></li>
      <li>工作目录: <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
      <li>项目Url: <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
      </ul>
      </td>
      </tr>
      <tr>
      <td><b><font color="#0B610B">Changes Since Last Successful Build:</font></b>
      <hr size="2" width="100%" align="center" /></td>
      </tr>
      <tr>
      <td>
      <ul>
      <li>历史变更记录 : <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li>
      </ul> ${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="Changes for Build #%n:<br />%c<br />",showPaths=true,changesFormat="<pre>[%a]<br />%m</pre>",pathFormat=" %p"}
      </td>
      </tr>
      <tr>
      <td><b>Test Informations</b>
      <hr size="2" width="100%" align="center" /></td>
      </tr>
      <tr>
      <td><pre style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">Total:${TEST_COUNTS,var="total"},Pass:${TEST_COUNTS,var="pass"},Failed:${TEST_COUNTS,var="fail"},Skiped:${TEST_COUNTS,var="skip"}</pre>
      <br /></td>
      </tr>
      <tr>
      <td><b><font color="#0B610B">构建日志 (最后 100行):</font></b>
      <hr size="2" width="100%" align="center" /></td>
      </tr>
      <tr>
      <td><textarea cols="80" rows="30" readonly="readonly" style="font-family: Courier New">${BUILD_LOG, maxLines=100}</textarea>
      </td>
      </tr>
      </table>
      </body>
      </html>
    • 勾选上 Enable Debug Mode、Require Administrator for Template Testing、Enable watching for jobs、Allow sending to unregistered users

美化 Jenkins

安利一款material风格的主题:http://afonsof.com/jenkins-material-theme/ ,支持使用 CDN,也支持自定义公司 logo 等等。

常用插件

  1. Maven Integration plugin:用于构建 Maven 项目
  2. Gitlab Hook Plugin:用于触发 GitLab 的一些 WebHooks 来构建项目
  3. Simple Theme Plugin:配合上面的美化 Jenkins 使用
  4. FireLine Plugin:代码规范检查,已经集成了阿里巴巴的代码规约(P3C)检查
  5. HTML Publisher plugin:将一些测试结果变成 HTML 文档
  6. JUnit Plugin:JUnit 测试
  7. Checkstyle Plug-in:检测代码风格
  8. FindBugs Plug-in:检测构建出来的 class 文件是否安全
  9. Static Analysis Collector Plug-in:对7、8两个插件检测出来的结果进行汇总
  10. Extended E-mail Notification:个性化邮件模板
  11. Dingding[钉钉] Plugin:钉钉通知插件

常见错误解决

添加镜像源的时候出现如下错误:

1
2
3
Resolving pkg.jenkins-ci.org (pkg.jenkins-ci.org)... failed: Temporary failure in name resolution.
wget: unable to resolve host address ‘pkg.jenkins-ci.org’

解决方法:

vim /etc/resolv.conf 添加一行 nameserver 8.8.8.8

HTML Publisher Plugin 插件在新的Jenkins版本中,打开生成的网页中无法加载CSS、无法点击按钮等情况:

由于 CSP(Content Security Policy)所致,可在 系统管理→脚本命令行 中执行:

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP","")

o(╯□╰)o我只要一毛钱的鼓励~~