Jenkins使用之基于docker镜像maven编译打包发布项目

  • Jenkins 自动部署Maven项目
  • 打开 Blue Ocean
  • 项目中添加`Jenkinsfile`文件
  • 完成基本的编译与打包
  • 以远程服务器Docker进行Dockerfile编译
  • push到gitlab时自动构建
  • 远程运行代码,启动容器


准备插件,安装好以下插件

  1. SSH Pipeline Steps 在SSH Over Publisher 插件不能用的情况下安装,可以在远程服务器上运行命令与操作文件详细说明 https://github.com/jenkinsci/ssh-steps-plugin#pipeline-steps
  2. Generic Webhook Trigger Plugin 用于设置钩子,在git push 时自动触发构建,详细说明 https://github.com/jenkinsci/generic-webhook-trigger-plugin

Jenkins 自动部署Maven项目

打开 Blue Ocean

  1. 创建流水线项目
  2. 选择 git项目,填写git服务项目的URL
  3. 拷贝公钥添加的git服务器中的SSH key 中
  4. 点击完成,将自动下载项目的Jenkinsfile文件

项目中添加Jenkinsfile文件

在项目中添加 Jenkinsfile文件,并且提交。Jenkins将根据该文件内容进行构建。

完成基本的编译与打包

先按照插件Docker
在Jenkinsfile文件中添加内容如下,保证Jenkins能完成基本的包下载与打包功能。详细如下:

node {
	checkout scm
  	docker.image('maven:3.6.1-jdk-13').inside('-v /root/.m2:/root/.m2') //映射文件无需每次下载包jar
  	{
       stage('Build'){
            sh 'pwd'
            sh 'java -version'
            sh 'mvn clean package -Dmaven.test.skip=true'
            sh '''
                cd /root/.m2
                ls -l
            '''
        }
    }
}

以远程服务器Docker进行Dockerfile编译

先安装插件 Docker
在Jenkins中使用服务器运行build,前提开启服务器Docker的远程服务,可参考开启Docker远程服务,在Jenkinsfile中添加代码如下:

docker.withServer('tcp://192.168.30.248:2375'){
            def cusImage=docker.build("${env.JOB_NAME}:latest",'./hitgen-appcenter-api')
  }

push到gitlab时自动构建

先安装插件 Generic Web Hook 在Jenkins中添加触发器,用于出发Jenkins自动构建,其代码如下:

checkout scm
    echo "${env.JOB_NAME}"
    properties([
        pipelineTriggers([
        [$class: 'GenericTrigger',
          genericVariables: [
            [key: 'ref', value: '$.resource.refUpdates[0].name'],
            //[key: 'ref', value: '$.ref'],
            // [
            //   key: 'before',
            //   value: '$.before',
            //   expressionType: 'JSONPath', //Optional, defaults to JSONPath
            //   regexpFilter: '', //Optional, defaults to empty string
            //   defaultValue: '' //Optional, defaults to empty string
            // ]
          ],
          // genericRequestVariables: [
          //     [key: 'requestWithNumber', regexpFilter: '[^0-9]', defaultValue:'requestWithNumber_test'],
          //     [key: 'requestWithString', regexpFilter: '']
          // ],
          // genericHeaderVariables: [
          //     [key: 'headerWithNumber', regexpFilter: '[^0-9]', defaultValue:'headerWithNumber_test'],
          //     [key: 'headerWithString', regexpFilter: '']
          // ],

          causeString: 'Triggered on $ref',
          token: abc, //该值可根据实际进行修改
          tokenCredentialId: '',

          printContributedVariables: true,
          printPostContent: true,
          silentResponse: false,

          regexpFilterText: '$ref',
          regexpFilterExpression: 'refs/heads/' + BRANCH_NAME
        ]
        ])
    ])

在gitlab 选择push事件,添加 http://JENKINS_URL/generic-webhook-trigger/invoke?token=abc通知。可参考 https://docs.gitlab.com/ee/user/project/integrations/webhooks.html 在开发机器上push代码到git服务器时,将会发送通知请求到Jenkins服务器,Jenkins服务器将自动构建。

远程运行代码,启动容器

Jenkinsfile文件中添加如下代码,用于远程启动容器,如下:

stage('Startup'){
     
        def remote = [:]
	    remote.name = 'Java-Server'
	    remote.host = 'xxx.xxx.xxx.xxx'
	    remote.user = 'root'
	    remote.password = 'yor password'
	    remote.allowAnyHosts = true
        sshScript remote: remote, script: 'hitgen-appcenter-api/run.sh' //执行服务器命令
}

完整代码:

node {
	properties([
	    pipelineTriggers([
	    [$class: 'GenericTrigger',
	      genericVariables: [
	        [key: 'ref', value: '$.resource.refUpdates[0].name'], //定义变量
	        //[key: 'ref', value: '$.ref'],
	        // [
	        //   key: 'before',
	        //   value: '$.before',
	        //   expressionType: 'JSONPath', //Optional, defaults to JSONPath
	        //   regexpFilter: '', //Optional, defaults to empty string
	        //   defaultValue: '' //Optional, defaults to empty string
	        // ]
	      ],
	      // genericRequestVariables: [
	      //     [key: 'requestWithNumber', regexpFilter: '[^0-9]', defaultValue:'requestWithNumber_test'],
	      //     [key: 'requestWithString', regexpFilter: '']
	      // ],
	      // genericHeaderVariables: [
	      //     [key: 'headerWithNumber', regexpFilter: '[^0-9]', defaultValue:'headerWithNumber_test'],
	      //     [key: 'headerWithString', regexpFilter: '']
	      // ],
	
	      causeString: 'Triggered on $ref',
	      token: 'abc', //请求的token
	      tokenCredentialId: '',
	
	      printContributedVariables: true,
	      printPostContent: true,
	
	      silentResponse: false,
	
	      regexpFilterText: '$ref',
	      regexpFilterExpression: 'refs/heads/' + BRANCH_NAME
	    ]
	    ])
  	])
	checkout scm
  	docker.image('maven:3.6.1-jdk-13').inside('-v /root/.m2:/root/.m2') //映射文件无需每次下载包jar
  	{
       stage('Package'){
            sh 'pwd'
            sh 'java -version'
            sh 'mvn clean package -Dmaven.test.skip=true'
            sh '''
                cd /root/.m2
                ls -l
            '''
        }
    }

	def remote = [:]
    remote.name = 'java-Server'
    remote.host = 'xxx.xxx.xxx.xxx'
    remote.user = 'root'
    remote.password = 'yor password'
    remote.allowAnyHosts = true
	stage('Build'){
		sshScript remote: remote, script: 'hitgen-appcenter-api/clean.sh' //在服务上执行clean.sh,其作用为 清理关联的容器
		docker.withServer('tcp://192.168.30.248:2375'){
	            def cusImage=docker.build("${env.JOB_NAME}:latest",'./test') //使用.test/Dockfile编译
	  	}
	}
    stage('Startup'){
        sshScript remote: remote, script: 'hitgen-appcenter-api/run.sh' //在服务上执行clean.sh,其作用为启动容器
}
}

完成以上步骤将可自动部署,完成容器在服务器上启动。

  • 如有问题欢迎指正,谢谢!