目录

Jenkins Pipeline 语法

Jenkins Pipeline 的核心概念

  • Stage 阶段

    • 一个Pipeline可以划分成若干个Stage,每个Stage代表一组操作,例如:“Build”,“Test”,“Deploy”。
  • Node 节点

    • 一个Node就是一个Jenkins节点,或者是Master,或者是Agent,是执行Step的具体运行环境。
  • Step 步骤

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

Pipeline 变量传递

变量的传递非常重要, 不同的变量定义 必须用在不同阶段中, 否则报错.

  1. 自定义变量(局部变量)
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. 环境变量(局部)
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. 环境变量(全局)
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. 参数化构建(全局)
  • 参数化构建需用安装额外的插件
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 第二个被执行 结束."
                }
           }
        }
   }
}

  • scriptsh
 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 中修改 全局环境变量

  • 修改后只作用于 stages 这一阶段
 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 第二个被执行 结束."
                }
           }
        }
   }
}