environment与options

流水线变量

在pipeline中也是可以定义变量,使用变量的。使用关键字environment

1. 全局变量/局部变量

1.1 全局变量

流水线中也是有局部变量和全局变量之分的,他们都是使用关键字environment来定义

pipeline {
    agent {
        kubernetes {
            cloud 'kubernetes'  
            showRawYaml true
            yaml """
"""
        }
    }
    environment {
        key = 'key01'
    }
    stages {
        stage('Hello') {
            steps {
                echo "${ key }"
            }
        }
    }
}

这里我们在stages外面定义了一个environment,里面有变量名key,他的值是key01

然后我们在stages里面输出了这个量,引用变量的格式是"${变量名}"

然后构建这个流水线

Running on hello-kuber-5-svx2v-pnhsc-dz2k7 in /home/jenkins/agent/workspace/hello-kuber
[Pipeline] {
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Hello)
[Pipeline] echo
key01
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // podTemplate
[Pipeline] End of Pipeline
Finished: SUCCESS

看最后的输出,他就将变量的值key01给输出了

2. 局部变量

除了全局变量,还可以定义局部变量

pipeline {
    agent {
        kubernetes {
            cloud 'kubernetes'
            showRawYaml true    
            yaml """
"""
        }
    }
    environment {
        key = 'key01'
    }
    stages {
        stage('Hello') {
            environment {
                key = 'key02'
            }
            steps {
                echo "${ key }"
            }
        }
    }
}

现在有全局变量key=key01,和一个局部变量key=key02,输出一下这个变量

[Pipeline] echo
key02
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // podTemplate
[Pipeline] End of Pipeline
Finished: SUCCESS

点击立即构建之后他输出的是key02,全局变量和局部变量冲突之后会采用局部变量,因为局部变量的优先级更高。当然局部变量只存在于这个stages中。

3. credentials插件

我们在流水线中需要使用某个凭证的时候,jenkins也是给我们提供了一个获取凭证的方式,就是使用credentials插件

pipeline {
    agent {
        kubernetes {
            cloud 'kubernetes'
            showRawYaml true
            yaml """
"""
        }
    }
    environment {
        key = 'key01'
        gitlab_user = credentials('test')
    }
    stages {
        stage('Hello') {
            environment {
                key = 'key02'
            }
            steps {
                echo "${ key }"
                echo "${gitlab_user_USR}"
                echo "${gitlab_user_PSW}"
            }
        }
    }
}

在变量里面我们多加了一行内容gitlab_user = credentials('test'),他这个是调用credentials插件来获取id为test这个凭证的内容然后复制给变量gitlab_user,然后我们在stages里面去输出这个凭证的用户名和密码

注意我们输出的方式,我们的变量名是gitlab_user,如果我们获取的凭据他是用户名和密码这种凭据的话,那么这个变量只是一个前缀,需要获取具体的用户名就是gitlab_user.USR

密码就是gitlab_user.PAS,我们来构建一下,看一下输出

[Pipeline] echo
test
[Pipeline] echo
Warning: A secret was passed to "echo" using Groovy String interpolation, which is insecure.
		 Affected argument(s) used the following variable(s): [gitlab_user_PSW]
		 See https://jenkins.io/redirect/groovy-string-interpolation for details.
****
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // withCredentials
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // podTemplate
[Pipeline] End of Pipeline
Finished: SUCCESS

可以看到用户名test已经被输出了,但是在输出密码的时候还是输出的****,这是因为他的保护机制,如果你是正常使用这个密码去连接的话是没有问题的

options

options用于定义pipeline运行时的约束,如是否在执行pipeline时打印时间戳,如果pipeline执行超过2小时,则强行终止并判定失败;禁止并行(这里的并行并不是指pipeline语法中的parallel,而是说一个任务不能有两个job同时运行)等等。

options的示例:

options {
    timestamps() //日志会有时间
    skipDefaultCheckout() //删除隐式checkout scm语句
    disableConcurrentBuilds() //禁止并行
    timeout(time: 2, unit: 'HOURS')
}

常用options说明如下:

  • buildDiscarder:为最近的流水线运行的特定数量保存组件和控制台输出
  • disableConcurrentBuilds:关闭并行执行构建,可被用来防止同时访问共享资源等
  • overrideIndexTriggers:允许覆盖分支索引触发器的默认处理
  • skipDefaultCheckout:在pipeline中,如果配置有代码仓库,则agent会默认检出代码,此选项用于跳过这个默认动作
  • skipStagesAfterUnstable:一旦构建状态变得unstable,则跳过该阶段
  • checkoutToSubdirectory:在工作空间的子目录中自动的执行源码检出
  • timeout:设置流水线运行的超时时间
timeout(time: 30, unit: 'MINUTES')
  • retry:在失败时,指定重试次数
  • timestamps:在流水线输出时,打印时间

1. 定义options

如果在options里面加入了timestamps(),那么需要安装一个插件叫做 timestamper

如果没有按装直接定义这个options的话构建是会报错的

pipeline {
    agent {
        kubernetes {
            cloud 'kubernetes'
            showRawYaml true
            yaml """
"""
        }
    }
    options {
    timestamps() 
    skipDefaultCheckout() 
    disableConcurrentBuilds() 
    timeout(time: 2, unit: 'HOURS')
    }
    environment {
        key = 'key01'
        gitlab_user = credentials('test')
    }
    stages {
        stage('Hello') {
            environment {
                key = 'key02'
            }
            steps {
                echo "${ key }"
                echo "${gitlab_user_USR}"
            }
        }
    }
}

然后我们在输出里面就可以看到有时间了

16:29:08  key02
[Pipeline] echo
16:29:08  test
[Pipeline] echo
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // timeout
[Pipeline] }
[Pipeline] // timestamps
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // withCredentials
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // podTemplate
[Pipeline] End of Pipeline
Finished: SUCCESS
posted @ 2024-06-23 16:33  FuShudi  阅读(24)  评论(0编辑  收藏  举报