0%

Jenkins-Pipeline

Jenkins-Pipeline

Jenkins Pipeline总体介绍

  • Pipeline,简而言之,就是一台运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。
  • Pipeline是Jenkins2.X最核心的特性,帮助Jenkins实现从CI到CD与DevOps的转变。
  • 详细介绍可见https://jenkins.io/2.0

Jenkins Pipeline

  • Jenkins Pipeline是一组插件,让Jenkins可以实现持续交付管道的落地和实施。
  • 持续交付管道(CD Pipeline)是将软件从版本控制阶段到交付给用户或客户完整过程的自动化表现
  • Pipeline提供了一组可扩展的工具,通过Pipeline Domain Specific Language(DSL)syntax可以达到Pipeline as Code的目的
  • Pipeline as Code: Jenkinsfile 存储在项目的源代码库

核心概念

  • Node

    Jenkins节点,或是Master,或是Agent,是执行Step的具体运行环境

  • Stage

    阶段,一个Pipeline可以划分为若干个Stage,每个Stage代表一组操作,如:“Build”,“Test”, “Deploy”。

    注意,Stage是一个逻辑分组的概念,可以跨多个Node。

  • step

    步骤,Step是 最基本的操作单元,小到创建一个目录,大到构建一个Docker镜像,由各类 Jenkins Plugin提供,例如:sh ‘make’

Pipeline特性

  • 代码(Code): Pipeline以代码的形式实现,通常被检入源代码控制,是团队能够编辑,审查 和迭代其CD流程。
  • 可持续性(Durable):Jenkins重启或者中断后都不会影响Pipeline Job。
  • 可停顿(Pausable):Pipeline可以选择停止并等待人工输入或者批准,然后再继续Pipeline运行。
  • 多功能(Versatile):Pipeline支持实现现实世界的复杂CD要求,包括fork/join子进程,循环和并行执行工作的能力。
  • 可拓展(Extensible):Pipeline插件支持其DSL的自定义扩展及与其他插件集成的多个选 项。

语法

官网文档:https://jenkins.io/doc/book/pipeline/syntax/

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
pipeline {
agent any
options {
timestamps()
}
environment {
TimeStamp="${currentBuild.startTimeInMillis}"
Service="${JOB_BASE_NAME}"
Branch="${env.gitlabTargetBranch}"
}
parameters {
choice(name: 'Action',choices: '程序发版\n程序回滚',description: '请选择操作')
choice(name: 'Scope',choices: '测试环境\n预发环境\n生产环境\n灾备环境',description: '请选择部署环境')
string(name: 'JenkinsApi', defaultValue: 'false', description: '是否是JenkinsAPI触发')
string(name: 'BranchOrTag', defaultValue: '', description: '指定分支或tag发版')
}
stages {
stage('PrintEnv') {
steps {
sh "printenv"
}
}
stage('Check Out') {
when {
anyOf {
environment name: 'Branch',value:'master';
environment name: 'Branch',value:'test';
environment name: 'Scope',value:'测试环境';
environment name: 'Scope',value:'预发环境';
environment name: 'Scope',value:'灾备环境'
}
}
steps {
sh "sh jenkins.sh 'CheckOut' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}' '${BranchOrTag}'"
}
}
stage('Build Package') {
when {
anyOf {
environment name: 'Branch',value:'master';
environment name: 'Branch',value:'test';
environment name: 'Scope',value:'测试环境';
environment name: 'Scope',value:'预发环境';
environment name: 'Scope',value:'灾备环境'
}
}
steps {
sh "sh jenkins.sh 'BuildPackage' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}'"
}
}
stage('Build Dockerfile') {
when {
anyOf {
environment name: 'Branch',value:'master';
environment name: 'Branch',value:'test';
environment name: 'Scope',value:'测试环境';
environment name: 'Scope',value:'预发环境';
environment name: 'Scope',value:'生产环境';
environment name: 'Scope',value:'灾备环境'
}
}
steps {
sh "sh jenkins.sh 'BuildDockerfile' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}'"
}
}
stage('Build K8S Yaml') {
when {
anyOf {
environment name: 'Branch',value:'master';
environment name: 'Branch',value:'test';
environment name: 'Scope',value:'测试环境';
environment name: 'Scope',value:'预发环境';
environment name: 'Scope',value:'生产环境';
environment name: 'Scope',value:'灾备环境'
}
}
steps {
sh "sh jenkins.sh 'BuildK8SYaml' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}' '${env.Action}'"
}
}
stage('Deploy') {
steps {
script {
if ("${Scope}" == "测试环境") {
echo "测试环境发版"
sh "sh jenkins.sh 'DockerBuildPush' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}' '${env.Action}'"
sh "sh jenkins.sh 'Deploy' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}'"
}
if ("${Scope}" == "预发环境") {
echo "预发环境发版"
sh "sh jenkins.sh 'DockerBuildPush' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}' '${env.Action}'"
sh "sh jenkins.sh 'Deploy' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}'"
}
if ("${Scope}" == "灾备环境") {
echo "灾备环境发版"
sh "sh jenkins.sh 'DockerBuildPush' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}' '${env.Action}'"
sh "sh jenkins.sh 'Deploy' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}'"
}
if ("${Scope}" == "生产环境") {
script {
if ("${JenkinsApi}" == "true") {
sh "sh jenkins.sh 'DockerBuildPush' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}' '${env.Action}'"
sh "sh jenkins.sh 'Deploy' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}'"
}
else {
script {
if ("${env.Action}" == "程序回滚") {
echo "生产环境回滚,等待领导确认"
script {
input message: "请确认是否回滚 ${Scope}: ",ok : '确认',submitter: "admin"
}
echo '已确认,即将回滚'
sh "sh jenkins.sh 'Deploy' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}' '${env.Action}'"
}
else {
echo "生产环境发版,等待领导确认"
script {
input message: "请确认是否部署 ${Scope}: ",ok : '确认',submitter: "admin"
}
echo '已确认,即将发布'
sh "sh jenkins.sh 'DockerBuildPush' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}' '${env.Action}'"
sh "sh jenkins.sh 'Deploy' '${Service}' '${Branch}' '${Scope}' '${TimeStamp}'"
}
}
}
}
}
}
}
}
}
}