如何在 Jenkins 脚本化管道中将 bash 命令与 withEnv 一起使用?

How to use bash commands with withEnv in Jenkins Scripted Pipelines?

在 Jenkins 声明式管道中,通过以下方式将环境变量设置为 bash 命令的结果非常容易。

例如,USERNAMEUIDGID 的值设置为它们各自的 bash 命令的结果。

pipeline {
    agent {
        node {
            label 'master'
            customWorkspace "some/path"
        }
    }
    environment {
        USERNAME = sh(script:"whoami", returnStdout: true).trim()
        UID = sh(script:"id -u", returnStdout: true).trim()
        GID = sh(script:"id -g", returnStdout: true).trim()
    }

如何在使用 Jenkins 脚本化管道时做同样的事情?

例如,假设我有以下 node 块,我在 withEnv 中放什么来达到相同的结果? objective 使得 USERNAMEUIDGID 包含我的 external-test-server 节点上用户的用户名、uid 和 gid。

node('external-test-server') {
    stage("Test") {
        withEnv([
            // Note that the following does not work and is meant to illustrate what my objective is
            'USERNAME=${sh(script:"whoami", returnStdout: true).trim()}',
            'UID=${sh(script:"id -u", returnStdout: true).trim()}',
            'GID=${sh(script:"id -g", returnStdout: true).trim()}'
        ]) {
            dir("../some_path") {
                sh "pwd"
            }
        }
    }
}

编辑:

我还需要确保 node('external-test-server') 中的环境变量必须覆盖先前在节点外设置的环境变量。

您的 withEnv 块由于缺少引号而无法正常工作,按照以下内容应该可以正常工作

node {
    
    //initiated some values to make sure withEnv block overrides these
    env.USERNAME = "testUser"
    env.UID = "99"
    env.GID = "99"
    
    stage("Test") {
        withEnv([
            // This should now work
            "USERNAME=${sh(script:"whoami", returnStdout: true).trim()}",
            "UID=${sh(script:"id -u", returnStdout: true).trim()}",
            "GID=${sh(script:"id -g", returnStdout: true).trim()}"
        ]) {
            dir("myNewPath") {
                println USERNAME
                println UID
                println GID
            }
        }
    }
}