物联网架构成长之路(29)-Jenkins环境搭建

0. 说明html

  哈哈,前面中间插入了一篇Eclipse增长Git插件,在此以前真的没有用过GIT。java

 

1. 运行Jenkinsdocker

  这里为了方便,仍是用Docker方式安装,因为这个是标准的war报,不对Docker Image进行过多的干预,直接使用官方的Jenkins便可apache

docker pull jenkins/jenkins:lts

  写一份docker-compose.ymljson

1 version: '3'
2 services:
3     jenkins:
4         image: registry.cn-shenzhen.aliyuncs.com/wunaozai/jenkins
5         ports:
6             - 8080:8080
7             - 50000:50000
8         volumes:
9             - /root/workspace/docker/jenkins/data:/var/jenkins_home

 

2. 运行jenkins服务器

  docker-compose启动容器app

  而后访问宿主机,开始Jenkins安装和配置,安装就很少说了,就是下一步下一步。还有以前的博客也简单的讲解的Jenkins的搭建及使用。安装插件就使用官方默认的就能够了,之后有须要还能够在管理界面上增长。 遇到网速很差的,等一下重试一下就能够了。eclipse

  Ps: 安装后,若是刷新页面,没有出现登陆界面的,重启一下jenkins
  进入欢迎界面工具

 

3. 本地eclipse关联GitLab仓库、利用Spring Cloud的Eureka测试自动构建测试

  物联网服务注册中心 global-service-eureka

  GlobalServiceEurekaApplication.java

1 @EnableEurekaServer
2 @SpringBootApplication
3 public class GlobalServiceEurekaApplication {
4     public static void main(String[] args) {
5         SpringApplication.run(GlobalServiceEurekaApplication.class, args);
6     }
7 }

  application.yml

1 server:
2   port: 8761
3 eureka:
4   client:
5     register-with-eureka: false
6     fetch-registry: false
7     service-url:
8       defaultZone: http://localhost:8761/eureka/

  在GitLab上建立项目

  Eclipse关联项目到GitLab这一步就不作过多说明

 

4. Jenkins 系统配置

  建立前,先标准插件安装,而后咱们还须要安装几个插件,在系统管理-插件管理

  因为咱们使用Maven构建Spring Cloud项目,因此须要增长对应的Maven Plugin。咱们还使用了GitLab做为代码版本管理,所以须要安装Gitlab Hook Plugin用来使用提交代码,触发自动构建行为。最后还须要把自动构建的结果经过邮件返回给相关人员,这里又须要Email Extension Plugin。

  这一步须要配置Maven,默认的Jenkins Docker Image是有包含了JDK和GIT,因此咱们只须要配置Maven。在系统管理-全局工具配置 这个界面,只须要配置Maven工具,使用自动安装。

  配置一下GIT账号密码,在Jenkins-凭证-系统-全局凭证-新增


  配置邮件 在Jenkins-系统管理-系统设置
  配置Jenkins Locaion

  配置E-mail Notification,填入SMTP服务器、邮件后缀,用户名、密码。有些服务器要求SSL、SSL端口有58七、465两种,好像能够不填,JavaMail包会自动选择。而后就能够测试发送了。

  因为默认的E-mail Notificaion功能比较弱,所以,须要Email Extension Plugin,对应的配置以下

 

5. Jenkins 任务

  建立一个任务、构建一个Maven项目

  配置源码管理Git方式,输入对应Repo URL、选择对应的认证凭证,这个在签名一步已经配置了,这里选择就能够。分支就选默认主分支的。

  构建触发器,采用Git上有人提交时触发构建

  这里将 GitLab Webhook URL,复制到GitLab对应的项目上。注意这里的URL,必须GitLab所在的服务器要能访问到。

  下面这个,根据实际构建Goals及Options进行配置,之后可能会经过Maven 直接构建成 Docker Image

  下面这个是配置构建成功后,对应执行的操做,之后可能会经过这个脚本,构建成docker Image而后上传到Aliyun Repo

  下面这个是配置自定义构建后,把结果发邮件到指定人,最前面的 Project From 要填前面配置的管理,下面的Recipient List能够写邮件接收人

  下面的高级,注意下面这个配置才是实际要发送的邮件内容。咱们先默认的发送一份邮件测试一下。

  一切完成后,点击保存

 

6. 触发构建

  能够在GitLab的Web Hooks 点击 Test Hook 按钮,测试一下是否触发自动构建。

  看这里,自动触发构建、等构建完成,对应的邮箱就会收到构建结果。

 

  能够看到这个邮件已经收到了。结果也是显示在邮件里面

 

7. 自定义邮件格式

  初看邮件内容,感受有点Low,经过下面方式实现自定义邮件内容。在 $JENKINS_HOME 目录下建立 email-templates 文件,建立 wunaozai.html 文件,并写上如下内容,能够经过如下方式预览效果。

  wunaozai.html 内容

<STYLE>
BODY, TABLE, TD, TH, P {
    font-family:Verdana,Helvetica,sans serif;
    font-size:11px;
    color:black;
}
h1 { color:black; }
h2 { color:black; }
h3 { color:black; }
TD.bg1 { color:white; background-color:#0000C0; font-size:120% }
TD.bg2 { color:white; background-color:#4040FF; font-size:110% }
TD.bg3 { color:white; background-color:#8080FF; }
TD.test_passed { color:blue; }
TD.test_failed { color:red; }
TD.console { font-family:Courier New; }
</STYLE>
<BODY>

    <TABLE>
    <TR><TD align="right"><IMG SRC="${rooturl}static/e59dfe28/images/32x32/<%= (build.result == null || build.result.toString() == 'SUCCESS') ? "blue.gif" : build.result.toString() == 'FAILURE' ? 'red.gif' : 'yellow.gif' %>" />
    </TD><TD valign="center"><B style="font-size: 200%;">BUILD ${build.result ?: 'SUCCESSFUL'}</B></TD></TR>
    <TR><TD>URL</TD><TD><A href="${rooturl}${build.url}">${rooturl}${build.url}</A></TD></TR>
    <TR><TD>Project:</TD><TD>${project.name}</TD></TR>
    <TR><TD>Date:</TD><TD>${it.timestampString}</TD></TR>
    <TR><TD>Duration:</TD><TD>${build.durationString}</TD></TR>
    <TR><TD>Cause:</TD><TD><% build.causes.each() { cause -> %> ${cause.shortDescription} <%  } %></TD></TR>
    </TABLE>
    <BR/>

    <!-- CHANGE SET -->
    <% def changeSets = build.changeSets
            if(changeSets != null) {
            def hadChanges = false %>
            <TABLE width="100%">
                <TR><TD class="bg1" colspan="2"><B>CHANGES</B></TD></TR>
                <%  changeSets.each() { cs_list ->
                cs_list.each() { cs ->
                hadChanges = true %>
                <TR>
                <TD colspan="2" class="bg2">&nbsp;&nbsp;Revision <B><%= cs.metaClass.hasProperty('commitId') ? cs.commitId : cs.metaClass.hasProperty('revision') ? cs.revision :
            cs.metaClass.hasProperty('changeNumber') ? cs.changeNumber : "" %></B> by
        <B><%= cs.author %>: </B>
        <B>(${cs.msgAnnotated})</B>
                </TD>
                </TR>
                <%      cs.affectedFiles.each() { p -> %>
                <TR>
                <TD width="10%">&nbsp;&nbsp;${p.editType.name}</TD>
                <TD>${p.path}</TD>
                </TR>
                <%      }
    }
    }

    if(!hadChanges) { %>
    <TR><TD colspan="2">No Changes</TD></TR>
    <%  } %>
            </TABLE>
            <BR/>
            <% } %>

            <!-- ARTIFACTS -->
            <% def artifacts = build.artifacts
     if(artifacts != null && artifacts.size() > 0) { %>
     <TABLE width="100%">
         <TR><TD class="bg1"><B>BUILD ARTIFACTS</B></TD></TR>
         <TR>
         <TD>
             <%      artifacts.each() { f -> %>
             <li>
             <a href="${rooturl}${build.url}artifact/${f}">${f}</a>
             </li>
             <%      } %>
         </TD>
         </TR>
     </TABLE>
     <BR/>
     <% } %>

     <!-- MAVEN ARTIFACTS -->
     <%
       try {
       def mbuilds = build.moduleBuilds
       if(mbuilds != null) { %>
       <TABLE width="100%">
       <TR><TD class="bg1"><B>BUILD ARTIFACTS</B></TD></TR>
       <%
        try {
        mbuilds.each() { m -> %>
        <TR><TD class="bg2"><B>${m.key.displayName}</B></TD></TR>
        <%      m.value.each() { mvnbld ->
        def artifactz = mvnbld.artifacts
        if(artifactz != null && artifactz.size() > 0) { %>
        <TR>
        <TD>
            <%              artifactz.each() { f -> %>
            <li>
            <a href="${rooturl}${mvnbld.url}artifact/${f}">${f}</a>
            </li>
            <%              } %>
        </TD>
        </TR>
        <%          }
      }
      }
      } catch(e) {
      // we don't do anything
      }  %>
       </TABLE>
       <BR/>
       <% }

}catch(e) {
// we don't do anything
      }
      %>

      <!-- JUnit TEMPLATE -->

      <% def junitResultList = it.JUnitTestResult
      try {
      def cucumberTestResultAction = it.getAction("org.jenkinsci.plugins.cucumber.jsontestsupport.CucumberTestResultAction")
      junitResultList.add(cucumberTestResultAction.getResult())
      } catch(e) {
      //cucumberTestResultAction not exist in this build
      }
      if (junitResultList.size() > 0) { %>
      <TABLE width="100%">
      <TR><TD class="bg1" colspan="2"><B>${junitResultList.first().displayName}</B></TD></TR>
      <% junitResultList.each{
               junitResult -> %>
               <% junitResult.getChildren().each { packageResult -> %>
               <TR><TD class="bg2" colspan="2"> Name: ${packageResult.getName()} Failed: ${packageResult.getFailCount()} test(s), Passed: ${packageResult.getPassCount()} test(s), Skipped: ${packageResult.getSkipCount()} test(s), Total: ${packageResult.getPassCount()+packageResult.getFailCount()+packageResult.getSkipCount()} test(s)</TD></TR>
               <% packageResult.getFailedTests().each{ failed_test -> %>
               <TR bgcolor="white"><TD class="test_failed" colspan="2"><B><li>Failed: ${failed_test.getFullName()} </li></B></TD></TR>
               <% }
                             }
                             } %>
      </TABLE>
      <BR/>
      <%
                             } %>

                             <!-- CONSOLE OUTPUT -->
                             <% if(build.result==hudson.model.Result.FAILURE) { %>
                             <TABLE width="100%" cellpadding="0" cellspacing="0">
                             <TR><TD class="bg1"><B>CONSOLE OUTPUT</B></TD></TR>
                             <%  build.getLog(100).each() { line -> %>
                             <TR><TD class="console">${org.apache.commons.lang.StringEscapeUtils.escapeHtml(line)}</TD></TR>
                             <%  } %>
                             </TABLE>
                             <BR/>
                             <% } %>

</BODY>

  进入到项目任务的配置界面,配置一下自定义邮件格式,以下图所属,配置Content部分,最后的Attach build log 也加上

  下图就是通过自定义后的邮件格式

  哈哈,收到邮件,格式还行,还带构建日志。就这样吧。

 

8. 小结

  终于完了,发现这种截图式博客真的特别麻烦,应该是录视频好些。哈哈!!这一篇博客就讲到这里的。还有更多的功能,暂时没有讲到。Jenkins能够作的事情仍是不少的。经过写脚本,作任意想要作的事情。不过这个就是根据实际项目来实现了。之后有机会用到我再讲。

 

参考资料:

  https://blog.csdn.net/u013066244/article/details/78665075
  http://www.javashuo.com/article/p-unfsikmv-mm.html
  http://www.javashuo.com/article/p-xcrzdcta-dv.html
  http://www.javashuo.com/article/p-najcacmc-em.html
  http://www.javashuo.com/article/p-zqahrliw-gk.html

本文地址: http://www.javashuo.com/article/p-mcshuvik-ga.html

相关文章
相关标签/搜索