一、声明式流水线进阶语法

1.1 steps

作用域:被stage包裹,作用在stage内部
是否必须:必须
参数:无

1.2 post(可选)

作用域:作用在pipeline结束或者stage结束后
条件:always、changed、failure、success、unstable、aborted

1.3 parameters(可选)

  • 构建时用户需要提供的参数
  • 这些参数可以通过params提供给流水线的steps使用,有 字符串 类型和 boolean 类型 string:字符串类型,parameters { string(name: ‘DEPLOY_ENV’, defaultValue: ‘staging’, description: ‘’) } booleanParam:布尔参数,parameters { booleanParam(name: ‘DEBUG_BUILD’, defaultValue: true, description: ‘’) } text:文本参数,包含多行 parameters { text(name: ‘DEPLOY_TEXT’, defaultValue: ‘One\nTwo\nThree\n’, description: ‘’) } choice:选择类型的参数,parameters { choice(name: ‘CHOICES’, choices: [‘one’, ‘two’, ‘three’], description: ‘’) } password:password参数,parameters { password(name: ‘PASSWORD’, defaultValue: ‘SECRET’, description: ‘A secret password’) }

示例:

pipeline{
    agent any
    parameters {
        string(name: 'P1', defaultValue: 'it is p1', description: 'it is p1')
        booleanParam(name: 'P2', defaultValue: true, description: 'it is p2')
    }
    stages{
        stage("stage1"){
            steps{
                echo "$P1"
                echo "$P2"
            }
        }
    }
}

测试:

1、打开浏览器输入http://jenkins.zhang-qing.com/,输入账号root和密码123456登录(这是我设置的账号和密码,实际需要根据你自己设计的账号和密码来定)

2、新建构建任务TEST-Parameters

(1)点击【新建任务】

image-20231121224358777

(2)填写任务名称-TEST-Parameters

image-20231121224440961

(3)复制下面到脚本里面后,点击【保存】

pipeline{
    agent any
    parameters {
        string(name: 'P1', defaultValue: 'it is p1', description: 'it is p1')
        booleanParam(name: 'P2', defaultValue: true, description: 'it is p2')
    }
    stages{
        stage("stage1"){
            steps{
                echo "$P1"
                echo "$P2"
            }
        }
    }
}

image-20231121224658358

3、开始构建

(1)点击【立即构建】

(2)点击【Console Output】查看构建详细信息。这里因为没有传参导致会失败。

说明:这里带参数构建存在一个bug,第一次构建前没有【Build with Parameters】,只有点击第一次构建后,才会产生【Build with Parameters】

image-20231121225349455

(3)重新点击【Build with Parameters】进行给P1传参aaa后,点击【开始构建】

image-20231121225634312

(4)进入【#2】后,点击【Console Output】查看成功构建详细信息。

image-20231121225814775

1.4 triggers(可选)

自动化触发运行pipeline的方法

示例:每两分钟触发一次job

pipeline{
    agent any
    triggers{cron("*/1 * * * *")}
    stages{
        stage("Build Test"){
            steps{
                echo "hello world"
            }
        }
    }
}

测试:

1、打开浏览器输入http://jenkins.zhang-qing.com/,输入账号root和密码123456登录(这是我设置的账号和密码,实际需要根据你自己设计的账号和密码来定)

2、新建任务

image-20231121224358777

3、输入任务名称TEST-Tri

image-20231128153939283

4、填写脚本内容

pipeline{
    agent any
    triggers{cron("*/1 * * * *")}
    stages{
        stage("Build Test"){
            steps{
                echo "hello world"
            }
        }
    }
}

image-20231128154245929

5、点击【立即构建】

image-20231128154336084

6、观察到每1分钟执行一次

image-20231128154542184

1.5 input(可选)

指令允许 暂时中断 pipeline执行,等待用户输入,根据用户输入进行下一步动作

pipeline {
    agent any
    stages {
        stage('Example') {
            input {
                message "Should we continue?"
                ok "Yes, Do it."
                submitter "alice,bob"
                parameters {
                    string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')
                }
            }
            steps {
                echo "Hello, ${PERSON}, nice to meet you."
            }
        }
    }
}

测试:

1、打开浏览器输入http://jenkins.zhang-qing.com/,输入账号root和密码root登录Jenkins

2、新建构建任务TEST-Input

image-20231128154824396

3、输入任务名称TEST-Input

image-20231128155006596

4、填写脚本内容

pipeline {
    agent any
    stages {
        stage('Example') {
            input {
                message "Should we continue?"
                ok "Yes, Do it."
                submitter "alice,bob"
                parameters {
                    string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')
                }
            }
            steps {
                echo "Hello, ${PERSON}, nice to meet you."
            }
        }
    }
}

image-20231128155105122

5、点击【立即构建】

image-20231128155140749

6、选择【Yes, Do it.】

image-20231128155317003

点击【Console Output】查看日志

image-20231128155543268

7、再次点击【立即构建】

image-20231128155704603

8、选择【Abort】

image-20231128155735070

点击【Console Output】查看日志

image-20231128155852825

1.6 when(可选)

根据when指令的判断结果来决定是否执行后面的阶段 一个when指令至少包含一个条件,当有多个条件时,所有的子条件必须返回true,这个stage才会运行

branch:当正在构建的分支与模式给定的分支匹配时,执行这个阶段, 例如: when { branch ‘master’ }。注意,这只适用于多分支流水线。 environment:当指定的环境变量是给定的值时,执行这个步骤, 例如: when { environment name: ‘DEPLOY_TO’, value: ‘production’ } expression:当指定的Groovy表达式评估为true时,执行这个阶段, 例如: when { expression { return params.DEBUG_BUILD } } not:当嵌套条件是错误时,执行这个阶段,必须包含一个条件,例如: when { not { branch ‘master’ } } allOf:当所有的嵌套条件都正确时,执行这个阶段,必须包含至少一个条件,例如: when { allOf { branch ‘master’; environment name: ‘DEPLOY_TO’, value: ‘production’ } } anyOf:当至少有一个嵌套条件为真时,执行这个阶段,必须包含至少一个条件,例如: when { anyOf { branch ‘master’; branch ‘staging’ } }

单条件判断:

新建名为test-when-1的任务名,任务类型为流水线

pipeline {
    agent any
    parameters {
        string(name: "deploy_env", defaultValue: "test", description: "")
    }
    stages {
        stage("Build Test") {
            when {
                environment name: 'deploy_env', value: 'prod'
            }
            steps {
                echo "hello world"
            }
        }
    }
}

build结果:

第一次build只是为了带出【Build with Parameters】

第二次build时,deploy_env的值是 test,stage “Build Test” 被 skipped

第三次build时,参数deploy_env设置为 prod,执行 stage “Build Test”,输出hello world

多条件判断:

新建名为test-when-2的任务名,任务类型为流水线

pipeline {
    agent any
    parameters {
        string(name: "deploy_env", defaultValue: "test", description: "")
        string(name: "branch", defaultValue: "test", description: "分支")
    }
    stages {
        stage("Build Test") {
            when {
                allOf {
                    environment name: 'branch', value: 'master'
                    environment name: 'deploy_env', value: 'prod'
                }
            }
            steps {
                echo "Hello world"
            }
        }
    }
}

build结果:

第一次build只是为了带出【Build with Parameters】

第二次build时,branch和deploy_env的值是 test,stage “Build Test” 被 skipped

第三次build时,需满足 branch:master,deploy_env:prod 才会执行流水线,输出Hello world