Pipeline并行发布项目
背景:
公司现有jenkins配置项目发布是串行发布的(项目一发完后再发项目二),随着代码的不断更迭优化,发布时间越来越长,所以研究有什么好办法能够改成并行发布,并且能够自行选择分支和环境进行发布,后来经过别人的提醒说有pipeline流水线发布能够达到并行发布的效果,所以自己研究了一下,现将配置过程分享一下。
期望:
项目一:配置到master节点上发布
项目二:配置到jenkins-slave-8.203节点发布
点击build,并行构建发布效果图如下:
实操步骤:
一、新增一台slave节点,名称为jenkins-slave-8.203(可自行百度添加)
通过 “系统管理(Manage Jenkins)” -- “节点管理(Manage Nodes and Clouds)” 查看节点信息
二、配置全局设置
点击 系统管理 -- 全局工具配置 设置maven和jdk,这个在pipeline的tools插件使用时会用到
三、新建pipeline项目(我下面只写了设置参数和pipeline脚本,其他的地方读者可以按自己需求配置)
在 General 选择
This project is parameterized 设置参数
pipeline脚本,我这里只是大概的写了一个模板,还有很多优化的空间,仅供参考
这里大家可能会有疑问,为什么有两个项目一发布,这是因为有条件判断(when expression),前面在参数化构建的时候,如果选择的env_deploy的值是prerelease,那么就只执行匹配到prerelease的stage,选择dev,就只执行dev的那段stage
import hudson.model.*;
def createVersion() {
return new Date().format('yyyyMMddHHmmss') + "_${env.BUILD_ID}"
}
println env.JOB_NAME
println env.BUILD_NUMBER
println env.WORKSPACE
pipeline {
agent none //在可用的节点运行
// 前面已经在全局工具设置中已经配置了,名字要保持一样
tools {
maven 'maven'
jdk 'jdk'
}
environment {
project = "test-2.0.0"
// 定义项目git地址
git_url = "ssh://git@192.168.1.12:1234/test/test.git"
//定义tomcat目录
tomcat_dir = "/data/service/tomcat/tomcat8"
}
options {
timestamps()
//禁用Jenkins同时执行多次该pipeline
disableConcurrentBuilds()
//pipeline运行超时时间
timeout(time: 20, unit: 'MINUTES')
//保留最近历史构建记录的数量
buildDiscarder(logRotator(numToKeepStr: '5'))
}
stages {
stage('Parallel Stage') {
failFast true
parallel {
stage('Prerelease-cms机器') {
// 项目一发布
agent { label 'master' }
when {
expression {
return (env_deploy == 'prerelease')
}
}
stages {
stage('Prerelease-获取代码'){
steps{
script {
checkout([$class: 'GitSCM', branches: [[name: '*/$branch']],
userRemoteConfigs: [[credentialsId: 'jenkins',
url: 'ssh://git@192.168.1.12:1234/test/test.git']]])
}
}
}
stage('Prerelease-修改配置文件'){
steps{
sh '''
if [ -f /tmp/cms_publish.sh ]; then
/bin/bash /tmp/cms_publish.sh
else
echo '修改配置文件脚本不存在'
fi
'''
}
}
stage('Prerelease-开始构建'){
steps{
sh 'mvn clean package -Dmaven.test.skip=true -X'
}
}
// 发布构建包
stage('Prerelease-发布到服务器'){
steps{
// sh 'scp ${resource_dir}${project}.war yukw@10.0.8.112:${project_dir}test.war'
sh 'scp /data/jenkins/workspace/test-pipeline/target/test-2.0.0.war yukw@10.0.8.112:/home/yukw/test.war'
}
}
}
}
stage('Prerelease-发布机器') {
// 项目二发布
agent { label 'jenkins-slave-8.203' }
when {
expression {
return (env_deploy == 'prerelease')
}
}
stages {
stage('Prerelease-获取publish代码'){
steps{
script {
checkout([$class: 'GitSCM', branches: [[name: '*/$branch']],
userRemoteConfigs: [[credentialsId: 'jenkins',
url: 'ssh://git@192.168.1.12:1234/test/test1.git']]])
}
}
}
stage('Prerelease-修改publish配置文件'){
steps{
sh '''
if [ -f /tmp/cms_publish.sh ]; then
/bin/bash /tmp/cms_publish.sh
else
echo '修改配置文件脚本不存在'
fi
'''
}
}
stage('Prerelease-开始publish构建'){
steps{
sh 'mvn clean package -Dmaven.test.skip=true -X'
}
}
// 发布构建包
stage('Prerelease-发布到publish服务器'){
steps{
//sh 'scp ${resource_dir}${project}.war yukw@10.0.8.112:/home/yukw/test.war'
sh 'scp /data/jenkins/workspace/test-pipeline/target/test-2.0.0.war yukw@10.0.8.113:/home/yukw/test_publish.war'
}
}
}
}
stage('Dev-cms机器') {
// 项目一发布
agent { label 'jenkins-slave-8.203' }
when {
expression {
return (env_deploy == 'dev')
}
}
stages {
stage('Dev-获取代码'){
steps{
script {
checkout([$class: 'GitSCM', branches: [[name: '*/$branch']],
userRemoteConfigs: [[credentialsId: 'jenkins',
url: 'ssh://git@192.168.1.12:1234/test/test.git']]])
}
}
}
stage('Dev-修改配置文件'){
steps{
sh '''
if [ -f /tmp/cms_publish.sh ]; then
/bin/bash /tmp/cms_publish.sh
else
echo '修改配置文件脚本不存在'
fi
'''
}
}
stage('Dev-开始构建'){
steps{
sh 'mvn clean package -Dmaven.test.skip=true -X'
}
}
// 发布构建包
stage('Dev-发布到服务器'){
steps{
//sh 'scp ${resource_dir}${project}.war yukw@10.0.8.112:/home/yukw/test.war'
sh 'scp /data/jenkins/workspace/test-pipeline/target/test-2.0.0.war yukw@10.0.8.114:/home/yukw/test_dev.war'
}
}
}
}
}
}
}
}
四、验证
点击 Build with Parameters 进行参数化构建(参数化构建的好处就是能够选择想要获取的代码分支和要构建的环境,比如我有预发布环境、测试环境等,可以通过env_deploy参数进行环境选择)
1、选择branch分支和env_deploy
branch:refect-release
env_deploy:prerelease
2、选择branch分支和env_deploy
branch:refect-release
env_deploy:dev
好了,这就是Pipeline并行发布项目的方法了,如果你有更好的代码案例,可与博主一起交流讨论!