一.简介

jenkins流水线pipeline是通过编写脚本来定义软件开发过程中的整个流程,包括构建、测试、部署等环节的顺序和依赖关系,实现了对整个流程的可编排性和可控性。

#pipeline格式,3大核心
agent:指定在运行pipeline的服务器,类似ansible的hosts
stages:包含流水线的各个阶段,类似ansible的tasks
steps:指定流水线的一个任务,如构建、测试、部署,包括具体的指令,类似ansible中调用的各种模块

脚本示例展示了如何将代码从构建过程自动推送到远程服务器的基本方法

#这个 Jenkinsfile 使用了 Jenkins Pipeline 的 Groovy 脚本定义,包含了三个阶段:Build、Test 和 Deploy。
#在 Build 和 Test 阶段使用了 Maven 来构建和测试 Java 应用程序,
#在 Deploy 阶段使用了 sshPublisher 步骤通过 SSH 将构建好的应用部署到远程服务器。

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                // maven构建
                sh 'mvn clean package'
            }
        }
        stage('Test') {
            steps {
                // 测试
                sh 'mvn test'
            }
        }
        stage('Deploy') {
            steps {
                // 部署
                sshPublisher(publishers: [sshPublisher(configName: 'production_server', transfers: [sshTransferRemote(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '\\n', remoteDirectory: '/apps/myapp', remoteDirectorySDF: false, removePrefix: 'target/', sourceFiles: 'target/*.war')], usePromotionTimestamp: false, useWorkspaceInPromotion: false)])
            }
        }
    }
}

二.测试示例

0.插件安装

"This Pipeline has run successfully, but does not define any stages. Please use the stage step to define some stages in this Pipeline."

#插件加速
cd /var/lib/jenkins/updates/
sed -i 's#http:\\/\\/updates.jenkins-ci.org\\/download#https:\\/\\/mirrors.tuna.tsinghua.edu.cn\\/jenkins#g' default.json 
sed -i 's#http:\\/\\/www.google.com#https:\\/\\/www.baidu.com#g' default.json
#web插件管理界面搜索并安装插件
pipeline
#下载pipeline-maven插件
cd /var/lib/jenkins/plugins
wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/pipeline-maven/latest/pipeline-maven.hpi
#重启jenkins
systemctl restart jenkins

1.新建任务   选流水线

代码上线之jenkins流水线pipeline_jenkins

2.pipeline编写的脚本 

pipeline {
    agent any
	environment {
	    host="alibaby007"
	}
    stages {
        stage('1.Build') {
            steps {
                echo "1 $host"
            }
        }
        stage('2.Test') {
            steps {
                echo "2 $host"
            }
        }
        stage('3.Deploy') {
            steps {
                echo "3 $host"
            }
        }
    }
}

代码上线之jenkins流水线pipeline_pipeline_02

Approve script 批准脚本

代码上线之jenkins流水线pipeline_jenkins_03

立即构建

代码上线之jenkins流水线pipeline_jenkins_04

三.拉取代码 maven编译 分发部署 示例

上一个任务---配置---流水线语法

代码上线之jenkins流水线pipeline_pipeline_05

流水线语法拉取代码示例

代码上线之jenkins流水线pipeline_jenkins_06

git credentialsId: '88679384-77d6-412c-95f2-295f9ed4eefb', url: 'git@192.168.77.147:root/hello-word-war.git'

流水线语法执行shell命令示例

sh 'shell命令'

代码上线之jenkins流水线pipeline_pipeline_07

流水线语法执行shell脚本示例

sh '''shell脚本'''

代码上线之jenkins流水线pipeline_pipeline_08

合成后的流水线

pipeline {
    agent any
	environment {
	    host="alibaby007"
	}
    stages {
        stage('1.pull代码') {
            steps {
                git credentialsId: '88679384-77d6-412c-95f2-295f9ed4eefb', url: 'git@192.168.77.147:root/hello-word-war.git'
            }
        }
        stage('2.maven构建') {
            steps {
                sh ''' /app/tools/maven/bin/mvn clean package '''
            }
        }
        stage('3.Deploy') {
            steps {
                 sh '''
				 echo "当前部署的版本为${TAG_NAME}"
                 #配置变量
                 file="hello-world-war-1.0.0.war"
                 tmp_file="`date +%s`_hello-world-war-1.0.0.war"
                 #web_server_list 可以参数化构建,可以设置多个IP
                 web_server_list="192.168.77.142"
                 #路径 当前路径默认$workspace下
                 src_dir=./target
                 dst_dir=/app/tools/tomcat/webapps
                 bak_dir=/tmp/`date +%s`_ROOT
                 
                 #maven已打包,源码无需打包
                 
                 #分发
                 distribute() {
                 for ip in ${web_server_list}
                 do
                   scp ${src_dir}/${file} root@${ip}:/tmp/${tmp_file}
                 done
                 }
                 #部署
                 deploy() {
                 for ip in ${web_server_list}
                 do
                    ssh root@${ip} " cd ${dst_dir} ;
                       [ -d ${dst_dir}/ROOT ] && {
                          mkdir -p ${bak_dir} ; 
                 	     mv ${dst_dir}/ROOT ${dst_dir}/ROOT.war  ${bak_dir} ;
                 	    } ;
                       mv /tmp/${tmp_file} ${dst_dir}/ROOT.war ;
                       systemctl stop tomcat ;
                       systemctl stop tomcat ;
                       systemctl start tomcat 
                    "
                 done
                 }
                 #执行函数
                 distribute
                 deploy
				 '''
            }
        }
    }
}

代码上线之jenkins流水线pipeline_pipeline_09

立即构建

代码上线之jenkins流水线pipeline_pipeline_10

控制台输出

代码上线之jenkins流水线pipeline_pipeline_11

代码上线之jenkins流水线pipeline_pipeline_12