Jenkins(17):Jenkins-pipeline(1)-基础
https://jenkins.io/doc/book/pipeline/
https://www.cnblogs.com/111testing/p/9721424.html
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 "执行发布命令" } } }