一、概述
简介
Jenkins 2.x的精髓是Pipeline as Code,那为什么要用Pipeline呢?jenkins1.0也能实现自动化构建,但Pipeline能够将以前project中的配置信息以steps的方式放在一个脚本里,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程,形成流水式发布,构建步骤视图化。简单来说,Pipeline适用的场景更广泛,能胜任更复杂的发布流程。举个例子,job构建工作在master节点,自动化测试脚本在slave节点,这时候jenkins1.0就无法同时运行两个节点,而Pipeline可以。
基本概念
Stage: 阶段,一个Pipeline可以划分为若干个Stage,每个Stage代表一组操作。注意,Stage是一个逻辑分组的概念,可以跨多个Node。
Node: 节点,一个Node就是一个Jenkins节点,或者是Master,或者是slave,是执行Step的具体运行期环境。
Step: 步骤,Step是最基本的操作单元,小到创建一个目录,大到构建一个Docker镜像,由各类Jenkins Plugin提供。
语法
Pipeline支持两种语法:Declarative Pipeline(在Pipeline 2.5中引入,结构化方式)和Scripted Pipeline,两者都支持建立连续输送的Pipeline。
共同点:
两者都是pipeline代码的持久实现,都能够使用pipeline内置的插件或者插件提供的steps,两者都可以利用共享库扩展。
区别:
两者不同之处在于语法和灵活性。Declarative pipeline对用户来说,语法更严格,有固定的组织结构,更容易生成代码段,使其成为用户更理想的选择。但是Scripted pipeline更加灵活,因为Groovy本身只能对结构和语法进行限制,对于更复杂的pipeline来说,用户可以根据自己的业务进行灵活的实现和扩展。
本文主要采取Scripted Pipeline语法
二、项目实战
环境介绍
这里面,主要是通过jenkins将Spring Cloud项目发布到一台服务器。
利用了参数化构建,一个jenkins job同时支持发布和回滚。
pipeline方式
如果要改成pipeline方式,需要新建一个jenkins job,名字为:test_pipeline_eureka-server
基本设置
参数化构建
pipeline脚本
完整代码如下:
node {
if (env.Status == 'Deploy'){
stage('code pull') {
checkout([$class: 'GitSCM', branches: [[name: 'test_eureka-server']],
doGenerateSubmoduleConfigurations: false,
extensions: [],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: 'bf8a2a98-bb4f-461e-be46-2b49702d19b0', url: 'ssh://git@gitlab.baidu.com:22/eureka-server.git']]])
}
stage('code Build') {
sh 'mvn -f pom.xml clean package -Pdev -Dmaven.test.skip=true'
}
stage('code deploy') {
sh 'ansible-playbook -v /opt/ansible/test/deploy_standard_template.yml -e "HOSTS=test_java JOB_NAME=${JOB_NAME} BUILD_NUMBER=${BUILD_NUMBER} ENV=test PROJECT_NAME=eureka-server PREFIX=eureka-server PORT=8761"'
}
}else{
stage('code rollback') {
sh 'ansible-playbook -v /opt/ansible/test/rollback_standard_template.yml -e "HOSTS=test_java ENV=test PROJECT_NAME=eureka-server PORT=8761 BUILD_ID=${BUILD_ID}"'
}
}
}
代码解释:
node {}
if (env.Status == 'Deploy'){}
stage('code pull') {}
checkout()
$class: 'GitSCM'
branches: [[name: 'test_eureka-server']]
doGenerateSubmoduleConfigurations: false
extensions
submoduleCfg
userRemoteConfigs
credentialsId
url
stage('code Build') {}
stage('code deploy') {}
stage('code rollback') {}
点击页面的构建
点击构建
效果如下:
Blue Ocean插件,点击左侧的Blue Ocean
效果如下:
如果不考虑回滚, pipeline可以精简一些,比如:
node {
stage('code pull') {
checkout([$class: 'GitSCM', branches: [[name: 'test_eureka-server']],
doGenerateSubmoduleConfigurations: false,
extensions: [],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: 'bf8a2a98-bb4f-461e-be46-2b49702d19b0', url: 'ssh://git@gitlab.baidu.com:22/eureka-server.git']]])
}
stage('code Build') {
sh 'mvn -f pom.xml clean package -Pdev -Dmaven.test.skip=true'
}
stage('code deploy') {
sh 'ansible-playbook -v /opt/ansible/test/deploy_standard_template.yml -e "HOSTS=test_java JOB_NAME=${JOB_NAME} BUILD_NUMBER=${BUILD_NUMBER} ENV=test PROJECT_NAME=eureka-server PREFIX=eureka-server PORT=8761"'
}
}
View Code