gpt4 book ai didi

Jenkins:从全局函数设置环境变量

转载 作者:行者123 更新时间:2023-12-04 20:29:56 28 4
gpt4 key购买 nike

我有一个多分支管道项目,在 SCM 中有一个脚本化的 Jenkinsfile。我想通过共享的全局函数在我的管道中设置环境变量。我的共享全局函数如下所示:

#!/usr/bin/groovy

def call(String envName = 'staging') {

def json = libraryResource 'env-config.yaml'
def config = readYaml text: json
def envObj = config.environments.find{it.name == envName}
environment {
PROJECT = ${envObj.project}
ARTIFACTS_REPOSITORY = ${envObj.artifacts_repository}
DOCKER_REGISTRY_PREFIX = ${envObj.docker_registry_prefix}
}
println "${envObj}"
}

但是在我的 Jenkinsfile 中,我没有看到这些设置:

timestamps {
withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'xxx', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
node('klm') {
try {
def revisionTag
loadEnvConfig('staging')
println "project=${env.PROJECT}, repo=${env.ARTIFACTS_REPOSITORY}"
...
env.PROJECTenv.ARTIFACTS_REPOSITORY都是空的。如果我返回 envObj从函数并打印管道中的属性,我可以看到它们。是否可以从我的函数中设置环境变量?

编辑:我刚刚意识到我无法在多分支管道中的 Jenkinsfile 中设置任何环境变量。例如。这两种模式都不起作用

timestamps {
withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'xxx', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
node('klm') {
try {
environment {
FOO = "bar"
}
println "project=${env.FOO}"
...

timestamps {
withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'xxx', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
node('klm') {
try {
withEnv(["FOO=BAR"]) {
println "project=${env.FOO}"
...

最佳答案

我不完全确定是什么 environment是以及为什么它不会为您失败。 PROJECT = ${envObj.project}不是有效的 Groovy,因此该块不会被执行。看起来您正在尝试使用 environment directive for declarative pipelines ,但是,您正在使用脚本化管道。由于共享库和声明性管道的限制,以下选项仅对脚本化管道有效。

在您当前的代码中,您没有修改任何全局脚本变量或返回要在其他步骤中使用的值,因此它们不会产生任何影响。根据您想要呈现给消费者的 API,您有几种不同的方法。

第一个选项是只修改 env全局变量:

env.PROJECT = envObj.project
env.ARTIFACTS_REPOSITORY = envObj.artifacts_repository
env.DOCKER_REGISTRY_PREFIX = envObj.docker_registry_prefix

这些将修改全局 env将在脚本中的其他任何地方可用的状态(除非它们被覆盖或删除)。

另一种选择是使用现有的 withEnv step 编写方法。并允许消费者提供 Closure body 。这是我从 loadEnvConfig 重命名函数的示例至 withEnvConfig :

def call(String envName = 'staging', Closure body) {
// Previous code...
withEnv([
"PROJECT=${envObj.project}",
"ARTIFACTS_REPOSITORY=${envObj.artifacts_repository}",
"DOCKER_REGISTRY_PREFIX=${envObj.docker_registry_prefix}",
]) {
body()
}
}
Jenkinsfile
withEnvConfig('staging') {
println "In block project=${env.PROJECT}, repo=${env.ARTIFACTS_REPOSITORY}"
}
println "Out of block project=${env.PROJECT}, repo=${env.ARTIFACTS_REPOSITORY}"

在主体内部,它们被设置为 withEnv 的值。 .在块之外,它们被重置。

我更喜欢这种模式而不是修改全局状态。

关于Jenkins:从全局函数设置环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48667367/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com