Jenkins Pipeline 的核心概念
Stage 阶段
- 一个Pipeline可以划分成若干个Stage,每个Stage代表一组操作,例如:“Build”,“Test”,“Deploy”。
Node 节点
- 一个Node就是一个Jenkins节点,或者是Master,或者是Agent,是执行Step的具体运行环境。
Step 步骤
- Step是最基本的操作单元,小到创建一个目录,大到构建一个Docker镜像,由各类Jenklins Plugin提供,例如:sh ‘make’ 。
Pipeline 变量传递
变量的传递非常重要, 不同的变量定义 必须用在不同阶段中, 否则报错.
- 自定义变量(局部变量)
1
2
3
| # 注意 变量的引用 一定要用双引号, 单引号识别为字符串。
def username = 'Jenkins'
echo "Hello Mr.${username}"
|
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
| def username = 'Jenkins'
pipeline {
agent none
stages {
stage('Stage1') {
agent { label "jnlp-dev-android" }
steps {
timestamps {
echo '这是 jnlp-dev-android 第一个被执行的 stage.'
echo "Hello Mr.${username}"
}
}
}
stage('Stage2') {
agent { label "jnlp-test-java" }
steps {
timestamps {
echo "在 agent jnlp-test-java 上执行的并行任务 1."
echo "Hello Mr.${username}"
echo "在 agent jnlp-test-java 上执行的并行任务 1 结束."
}
}
}
}
}
|
- 环境变量(局部)
1
2
3
| withEnv(['MY_HOME=/opt']){
sh 'echo $MY_HOME'
}
|
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
| pipeline {
agent none
stages {
stage('Stage1') {
agent { label "jnlp-dev-android" }
steps {
timestamps {
echo '这是 jnlp-dev-android 第一个被执行的 stage.'
withEnv(['MY_HOME=/opt']){
sh 'echo $MY_HOME'
}
}
}
}
stage('Stage2') {
agent { label "jnlp-test-java" }
steps {
timestamps {
echo "在 agent jnlp-test-java 上执行的并行任务 1."
echo "在 agent jnlp-test-java 上执行的并行任务 1 结束."
}
}
}
}
}
|
- 环境变量(全局)
1
2
| environment {MY_HOME='/opt'}
echo "MY_HOME is ${env.MY_HOME}"
|
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
| pipeline {
environment {MY_HOME='/opt'}
agent none
stages {
stage('Stage1') {
agent { label "jnlp-dev-android" }
steps {
timestamps {
echo "这是 jnlp-dev-android 第一个被执行 开始."
echo "MY_HOME is ${env.MY_HOME}"
echo "这是 jnlp-dev-android 第一个被执行 结束."
}
}
}
stage('Stage2') {
agent { label "jnlp-test-java" }
steps {
timestamps {
echo "在 agent jnlp-test-java 第二个被执行 开始."
echo "MY_HOME is ${env.MY_HOME}"
echo "在 agent jnlp-test-java 第二个被执行 结束."
}
}
}
}
}
|
- 参数化构建(全局)
1
2
| parameters {string(name:'Jenkins',defaultValue:'Hello',description:'How should I greet the world')}
ehco "${params.Greeting} World!"
|
Pipeline 一些例子
stage 间变量传递
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
| pipeline {
agent none
stages {
stage('Stage1') {
agent { label "jnlp-dev-android" }
steps {
script {
echo "这是 jnlp-dev-android 第一个被执行 开始."
FOO = "test2"
env.BAR = "bar2"
echo "env.BAR = ${BAR}" // print BAR = bar2
echo "FOO = ${FOO}" // print FOO = test2
echo "这是 jnlp-dev-android 第一个被执行 结束."
}
}
}
stage('Stage2') {
agent { label "jnlp-test-java" }
steps {
script {
echo "在 agent jnlp-test-java 第二个被执行 开始."
echo "env.BAR = ${BAR}" // print BAR = bar2
echo "FOO = ${FOO}" // print FOO = test2
echo "在 agent jnlp-test-java 第二个被执行 结束."
}
}
}
}
}
|
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
| pipeline {
agent none
environment {
FOO = "bar"
}
stages {
stage('Stage1') {
agent { label "jnlp-dev-android" }
steps {
script {
echo "这是 jnlp-dev-android 第一个被执行 开始."
withEnv(["FOO=newbar"]) {
echo "FOO = ${env.FOO}"
}
echo "这是 jnlp-dev-android 第一个被执行 结束."
}
}
}
stage('Stage2') {
agent { label "jnlp-test-java" }
steps {
script {
env.FOOOO = "test3"
echo "在 agent jnlp-test-java 第二个被执行 开始."
echo "FOO = ${env.FOO}"
echo "在 agent jnlp-test-java 第二个被执行 结束."
}
}
}
stage('Stage3') {
agent { label "jnlp-test-java" }
steps {
sh '''
echo $FOOOO
'''
}
}
}
}
|
stage 中修改 全局环境变量
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
| pipeline {
agent none
environment {
FOO = "bar"
}
stages {
stage('Stage1') {
agent { label "jnlp-dev-android" }
steps {
script {
echo "这是 jnlp-dev-android 第一个被执行 开始."
withEnv(["FOO=newbar"]) {
echo "FOO = ${env.FOO}" // print FOO = newbar
}
echo "这是 jnlp-dev-android 第一个被执行 结束."
}
}
}
stage('Stage2') {
agent { label "jnlp-test-java" }
steps {
script {
echo "在 agent jnlp-test-java 第二个被执行 开始."
echo "FOO = ${env.FOO}" // print FOO = bar
echo "在 agent jnlp-test-java 第二个被执行 结束."
}
}
}
}
}
|