在Jenkins首页点击“新建”进入项目的创建页面,输入任务名后,选择“流水线”(或"Pipeline"),点击“确定”,即可创建一个新的pipeline项目,如下图所示:
在项目配置页面,找到"流水线"一项,选择"Pipeline script"即可编辑脚本
下面首先介绍脚本式pipeline的基本结构,以及如何使用Jenkins自带的语法生成器:
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页面,如下图所示:
在pipiline-syntax页面中选择需要执行的构建步骤,填写参数,然后点击“Generate Pipeline Script”即可生成需要的语法,如下图所示:
点击pipeline-syntax页面右方的Global Variables Reference,页面会展示pipeline脚本中可直接使用的全局变量,有docker、env、currentBuild等。当需要在脚本中使用全局变量,则使用"."连接全局变量和属性/方法,例如,使用docker变量构建镜像的方法为docker.build(your_imagename),获取当前构建结果的属性为currentBuild.result
这里我们以java项目为例编写脚本式pipeline,这个pipeline进行了打包构建、生成docker镜像、并将镜像推送到docker仓库中,最后实现在Rancher上的自动服务部署)。
node { stage('Preparation') { } stage('Build') { } stage('DockerBuild') { } stage('Rancher') { } }
Jenkins提供了有两种获取源代码的语法git和checkout,推荐使用checkout的方式,因为其更强大,可以配置工作目录、选择是否使用钩子等等,如下为两种语法的使用模板:
checkout的语法生成配置如下,需填写仓库url、branch等:
可以看到上图中选择了拉取gitlab代码的认证权限为”demo-ssh“,该认证需要在Credentials中进行配置;如果没有,也可点击Add进行添加,如下图为配置ssh密钥(对应公钥已添加在git仓库中)
此时仓库认证成功,点击下方的GeneratePipelineScript生成语法,如下:
将该语法粘贴到Pipeline脚本中,如下:
stage('Preparation') { checkout([$class: 'GitSCM', branches: [[name: '*/jenkins-test']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'c26f36ef-031d-4dbd-9d71-95be6a59e0f6', url: 'git@****.git']]])}
接下来需要添加代码构建阶段“Build”,通过mvn命令实现代码构建,在这之前我们需要在Jenkins添加一些配置。
(1)下载插件Pipeline Maven Integration Plugin、Jenkins Config File Provicer Plugin,辅助插件JUnit Attachments Plugin、Task Scanner Plugin
(2)配置maven工具,进入系统管理——全局工具配置,找到Maven项,点击新增Maven,即可配置安装一个新的Maven工具,如下图所示:
(3)对于一些java项目,需要定制化的使用settings.xml文件(例如添加maven镜像和仓库)。进入系统管理——Managed files,点击Add a new Config后,选择Maven settings.xml,点击Submit,如下图:
然后在配置页面编写settings.xml文件。
然后pipeline-syntax页面,找到withMaven语法,进行maven的配置,包括选择maven工具、settings文件等等,如下图:
最后将语法添加在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等等
在上篇中,我们介绍了如何在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接口框架封装
下一篇: 软件测试之手工测试人员如何转测试开发?