Pipeline介绍
Pipeline 是Jenkins 2.0的精髓,简单来说,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程。Pipeline的实现方式是一套Groovy DSL,任何发布流程都可以表述为一段Groovy脚本,并且Jenkins支持从代码库直接读取脚本,从而实现了Pipeline as Code的理念。
为什么要使用pipeline
- 1. 代码: pipeline 以代码的形式实现,通过被捡入源代码控制, 使团队能够编译,审查和迭代其cd流程
- 2 可连续性: jenkins 重启 或者中断后都不会影响pipeline job
- 3.停顿: pipeline 可以选择停止并等待人工输入或者批准,然后在继续pipeline运行
- 4.多功能: pipeline 支持现实世界的复杂CD要求, 包括fork、join子进程,循环和并行执行工作的能力
- 5.可扩展: pipeline 插件支持其DSL的自动扩展以及其插件集成的多个选项。
Pipeline的几个基本概念:
- Stage: 阶段,一个Pipeline可以划分为若干个Stage,每个Stage代表一组操作。注意,Stage是一个逻辑分组的概念,可以跨多个Node。
- Node: 节点,一个Node就是一个Jenkins节点,或者是Master,或者是slave,是执行Step的具体运行期环境。
- Step: 步骤,Step是最基本的操作单元,小到创建一个目录,大到构建一个Docker镜像,由各类Jenkins Plugin提供
简单样例
hello world
添加stage步骤
Blue Ocean
这个需要插件
input中断
node ("master"){
stage('第1步拉代码'){
echo "拉代码"
}
stage('第2步编译'){
echo "编译"
}
stage('第3步打包'){
echo "打包"
}
stage('是否发布'){
input "发布"
}
}
执行shell命令
node ("master"){
stage("先看看主机名")
sh "hostname"
stage("在看看磁盘空间")
sh("df -h")
stage("再看看内存")
sh("free -m")
}
执行个脚本
git拉一下代码
我不知道语法怎么办?
node ("master"){
stage('第1步拉代码'){
echo "拉代码"
git credentialsId: '03fd8295-c536-4871-9794-1c37394676e0', url: 'git@gitlab.corp.XXX.com:wangxu/ops.git'
}
}
编译一下
打包
node ("master"){
stage('第1步拉代码'){
echo "拉代码"
git credentialsId: '03fd8295-c536-4871-9794-1c37394676e0', url: 'git@gitlab.corp.XXX.com:wangxu/ops.git'
}
stage('第2步编译'){
echo "编译"
sh "source /etc/profile && /usr/local/maven/bin/mvn clean compile"
}
stage('第3步发送文件'){
echo "打包,有一个mail模块是系统级别的,需要sudo"
sh "sudo /usr/local/maven/bin/mvn package"
echo "完成后 修改一下权限,否则下一次麻烦"
sh "sudo chown -R jenkins: ."
sh "find -name '*SNAPSHOT.jar' "
}
}
再把打包的文件放到下载服务器上
node ("master"){
stage('第1步拉代码'){
echo "拉代码"
git credentialsId: '03fd8295-c536-4871-9794-1c37394676e0', url: 'git@gitlab.corp.XXX.com:wangxu/ops.git'
}
stage('第2步编译'){
echo "编译"
sh "source /etc/profile && /usr/local/maven/bin/mvn clean compile"
}
stage('第3步发送文件'){
echo "打包,有一个mail模块是系统级别的,需要sudo"
sh "sudo /usr/local/maven/bin/mvn package"
echo "完成后 修改一下权限,否则下一次麻烦"
sh "sudo chown -R jenkins: ."
sh "find -name '*SNAPSHOT.jar' "
}
stage('是否发布'){
input "发布"
}
stage("放到下载服务器上"){
sh "sudo cp ./account-email/target/account-email-1.0.0-SNAPSHOT.jar /home/admin/webserver/html/download && sudo chown -R admin: /home/admin/webserver/html/download"
}
}
slave端下载包、发布
node ("master"){
stage('第1步拉代码'){
echo "拉代码"
git credentialsId: '03fd8295-c536-4871-9794-1c37394676e0', url: 'git@gitlab.corp.XXX.com:wangxu/ops.git'
}
stage('第2步编译'){
echo "编译"
sh "source /etc/profile && /usr/local/maven/bin/mvn clean compile"
}
stage('第3步发送文件'){
echo "打包,有一个mail模块是系统级别的,需要sudo"
sh "sudo /usr/local/maven/bin/mvn package"
echo "完成后 修改一下权限,否则下一次麻烦"
sh "sudo chown -R jenkins: ."
sh "find -name '*SNAPSHOT.jar' "
}
stage('是否发布'){
input "发布"
}
stage("放到下载服务器上"){
sh "sudo cp ./account-email/target/account-email-1.0.0-SNAPSHOT.jar /home/admin/webserver/html/download && sudo chown -R admin: /home/admin/webserver/html/download"
}
node("test-mall-10.6.76.25"){
stage("slave-test-mall"){
echo "test-mall下载一下"
sh "cd /home/admin/;wget http://download.corp.XXX.com/account-email-1.0.0-SNAPSHOT.jar"
}
stage("我检查一下文件"){
sh ('ls /home/admin/account-email-1.0.0-SNAPSHOT.jar')
}
stage("确认是否发布"){
input("发布")
echo "我发布了啊,没有后悔药"
echo "执行发布命令"
}
}
}