当前位置: 首页> 技术文章> Docker+Jenkins+Pipeline实现持续集成(二)java项目构建

Docker+Jenkins+Pipeline实现持续集成(二)java项目构建

upfile1601032229628.png

创建pipeline项目

在Jenkins首页点击“新建”进入项目的创建页面,输入任务名后,选择“流水线”(或"Pipeline"),点击“确定”,即可创建一个新的pipeline项目,如下图所示:

upfile1601032403742.png

编写pipeline脚本

在项目配置页面,找到"流水线"一项,选择"Pipeline script"即可编辑脚本
下面首先介绍脚本式pipeline的基本结构,以及如何使用Jenkins自带的语法生成器:

pipeline的基本结构

pipeline语法分为了脚本式pipeline和声明式pipeline,以下均为脚本式pipeline。脚本式Pipeline本质是一个groovy脚本,可以直接使用Groovy提供的大多数功能,执行的顺序是从顶部开始的顺序执行。整个Pipeline使用node块结构,每一个阶段的执行用stage表示,如下是Jenkins提供的GitHub+Maven的模板(在脚本右上方处try sample Pipeline选择GitHub+Maven即会自动生成):

      node {
       def mvnHome       stage('Preparation') { // for display purposes
          // Get some code from a GitHub repository
          git 'https://github.com/jglick/simple-maven-project-with-tests.git'
          // Get the Maven tool.
          // ** NOTE: This 'M3' Maven tool must be configured
          // **       in the global configuration.           
          mvnHome = tool 'M3'
       }
       stage('Build') {
          // Run the maven build
          if (isUnix()) {
             sh "'${mvnHome}/bin/mvn' -Dmaven.test.failure.ignore clean package"
          } else {
             bat(/"${mvnHome}\bin\mvn" -Dmaven.test.failure.ignore clean package/)
          }
       }
       stage('Results') {
          junit '**/target/surefire-reports/TEST-*.xml'
          archive 'target/*.jar'
       }
    }

语法生成

Jenkins提供了语法生成器,可以帮助我们编写pipeline流程。点击脚本下的Pipeline Syntax可进入pipiline-syntax页面,如下图所示:

upfile1601032446877.png

pipiline-syntax页面中选择需要执行的构建步骤,填写参数,然后点击“Generate Pipeline Script”即可生成需要的语法,如下图所示:

upfile1601032490062.png

点击pipeline-syntax页面右方的Global Variables Reference,页面会展示pipeline脚本中可直接使用的全局变量,有docker、env、currentBuild等。当需要在脚本中使用全局变量,则使用"."连接全局变量和属性/方法,例如,使用docker变量构建镜像的方法为docker.build(your_imagename),获取当前构建结果的属性为currentBuild.result

Java项目的pipeline编写

这里我们以java项目为例编写脚本式pipeline,这个pipeline进行了打包构建、生成docker镜像、并将镜像推送到docker仓库中,最后实现在Rancher上的自动服务部署)。

node {

    stage('Preparation') {
    }

    stage('Build') {
    }

    stage('DockerBuild') {
    }

    stage('Rancher') {
    }

}

gitlab代码拉取

Jenkins提供了有两种获取源代码的语法gitcheckout,推荐使用checkout的方式,因为其更强大,可以配置工作目录、选择是否使用钩子等等,如下为两种语法的使用模板:

upfile1601032574294.png

checkout的语法生成配置如下,需填写仓库url、branch等:

upfile1601032607238.png

可以看到上图中选择了拉取gitlab代码的认证权限为”demo-ssh“,该认证需要在Credentials中进行配置;如果没有,也可点击Add进行添加,如下图为配置ssh密钥(对应公钥已添加在git仓库中)

upfile1601032671081.png

此时仓库认证成功,点击下方的GeneratePipelineScript生成语法,如下:

upfile1601032711313.png

将该语法粘贴到Pipeline脚本中,如下:

stage('Preparation') {
    checkout([$class: 'GitSCM', branches: [[name: '*/jenkins-test']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'c26f36ef-031d-4dbd-9d71-95be6a59e0f6', url: 'git@****.git']]])}

maven构建

接下来需要添加代码构建阶段“Build”,通过mvn命令实现代码构建,在这之前我们需要在Jenkins添加一些配置。
1)下载插件Pipeline Maven Integration PluginJenkins Config File Provicer Plugin,辅助插件JUnit Attachments PluginTask Scanner Plugin
2)配置maven工具,进入系统管理——全局工具配置,找到Maven项,点击新增Maven,即可配置安装一个新的Maven工具,如下图所示:

upfile1601032814411.png

3)对于一些java项目,需要定制化的使用settings.xml文件(例如添加maven镜像和仓库)。进入系统管理——Managed files,点击Add a new Config后,选择Maven settings.xml,点击Submit,如下图:

upfile1601032863571.png

然后在配置页面编写settings.xml文件。
然后pipeline-syntax页面,找到withMaven语法,进行maven的配置,包括选择maven工具、settings文件等等,如下图:

upfile1601032911749.png

最后将语法添加在Pipeline脚本中,并在withMaven里使用批处理命令来执行mvn的构建命令,如下:

stage('Build') {
    withMaven(
        maven: 'maven3.5.2',
        mavenSettingsConfig: '9e88adc5-8b36-4f00-b6f6-fdb15e9286ae') {
        sh 'mvn -U clean package -Dmaven.test.skip=true'
    }
}

(4)辅助插件可帮助我们查看JUnit执行情况、追踪项目的TODO和FIXME等等

docker镜像生成和发布

在上篇中,我们介绍了如何在Jenkins容器里使用Docker命令,此时,我们可以直接利用全局变量docker进行docker的各种操作(具体见Global Variables)。
我们首先将Build中生成的jar包复制到Dockerfile所在目录下,然后使用方法
docker.build()生成docker镜像,且该方法会返回一个Image的对象,然后使用Image.push()方法即可将该镜像推送到远程仓库,如下:

stage('DockerBuild') {
    sh """
    rm -f src/docker/*.jar
    cp target/*.jar src/docker/*.jar    """
    
    dir ("src/docker/") {
        def image = docker.build("*****/demo:1.0.0")
        image.push()
    }}

注:由于当前我们使用root用户运行Jenkins容器,因此无法直接利用docker.withRegistry()或withDockerRegistry连接dockerhub仓库(该语句会生成仓库的config文件,该文件存放在/var/jenkins_home文件夹下,但docker命令会直接从/root下读取配置文件,导致配置文件无效)。因此,我们可以将config文件提前打包到Jenkins容器中,或者直接在命令行中进行登录。

最后则是在Rancher服务器上的服务部署以及Jenkins执行构建即可。因为内容太多就不做详细说明。




上一篇: Python接口框架封装

下一篇: 软件测试之手工测试人员如何转测试开发?

QQ技术交流群

多测师官方学习交流
556733550

加入群聊