Shell 设置环境变量,然后在Jenkins脚本化管道中运行脚本

Shell 设置环境变量,然后在Jenkins脚本化管道中运行脚本,shell,jenkins,environment-variables,jenkins-pipeline,jenkins-groovy,Shell,Jenkins,Environment Variables,Jenkins Pipeline,Jenkins Groovy,我对Jenkins、Groovy和pipelines都是新手。我创建了一个简单的管道阶段,如下所示: //working build but not setting env variables node('build-01') { stage('Building') { echo "[*] Starting build (id: ${env.BUILD_ID}) on ${env.JENKINS_URL}" try { sh 'ls

我对Jenkins、Groovy和pipelines都是新手。我创建了一个简单的管道阶段,如下所示:

//working build but not setting env variables
node('build-01') {
    stage('Building') {
        echo "[*] Starting build (id: ${env.BUILD_ID}) on ${env.JENKINS_URL}"
        try {
            sh 'ls -l'
            //ls shows the damn file
            sh '. setup-target'
        } catch(all) { 
            sh "echo 'Failed to run setup-target script with error: ' ${all}"
        }
    }    
}
这很有效。但是我想修改/添加环境变量到运行这个脚本的会话中(这个脚本是一个bash文件,上面有正确的shebang行)。所以我做了:

node('build-01') {
    withEnv(["CMAKE_INSTALL_DIR=${WORKSPACE}", "SDK_INSTALL_DIR=${WORKSPACE}"]){
        stage('Building') {
            echo "[*] Starting build (id: ${env.BUILD_ID}) on ${env.JENKINS_URL}"
            try {
                sh 'ls -l'
                //ls shows the damn file
                sh '. setup-target'
            } catch(all) { 
                sh "echo 'Failed to run setup-target script with error: ' ${all}"
            }
        }    
    }
}
此错误与以下内容有关:

/主页/詹金斯软件/ci/工作区/myWorkSpace@tmp/持久-6d30b48d/script.sh:第1行::安装目标:未找到文件

无法运行安装程序目标脚本,错误为:hudson.AbortException:脚本返回退出代码1

但是设置了环境变量,我通过在
ls-l
行的正下方执行
sh'printenv'
来检查这一点。有趣的是,
ls-l
确实显示了脚本

我错过了什么

更新 以下是:

node('build-01') {
    withEnv(["CMAKE_INSTALL_DIR=${WORKSPACE}", "SDK_INSTALL_DIR=${WORKSPACE}"]){
        stage('Building') {
            echo "[*] Starting build (id: ${env.BUILD_ID}) on ${env.JENKINS_URL}"
            try {
                sh 'ls -l'
                //ls shows the damn file
                sh './setup-target'
            } catch(all) { 
                sh "echo 'Failed to run setup-target script with error: ' ${all}"
            }
        }    
    }
}
结果:

/主页/詹金斯软件/ci/工作区/myWorkSpace@tmp/持久-6d30b48d/script.sh:第1行:./setup target:权限被拒绝


有趣。withEnv如何影响权限?什么?!如果我将该文件修改为具有权限,我会得到一个新的错误,与“缺少工作区”有关。

我猜可能是
CMAKE\u INSTALL\u DIR
SDK\u INSTALL\u DIR
在路径上


而不是
sh'。设置目标'
你应该
sh./setup target'

我想出来了。我直接克隆到工作区,然后将环境变量设置为指向工作区。我修改了这两个东西。我现在在我的工作区中创建一个目录并克隆到其中,我还将环境变量设置为工作区中的目录。像这样:

node('build-01') {
    withEnv(["CMAKE_INSTALL_DIR=${WORKSPACE}/cmake_install", "SDK_INSTALL_DIR=${WORKSPACE}/sdk"]){
        stage('Building') {
            echo "[*] Starting build (id: ${env.BUILD_ID}) on ${env.JENKINS_URL}"
            try {
                sh 'ls -l'
                //ls shows the damn file
                dir('path/to/checkout/') {
                    sh '. ./setup-target'
                }
            } catch(all) { 
                sh "echo 'Failed to run setup-target script with error: ' ${all}"
            }
        }    
    }
}

这很有效

在第二种情况下,检查
sh'ls-l'
的输出,查看当前登录用户在文件
setup target
上的执行权限。在第一种情况下,我能够执行脚本。为什么withEnv会改变这一事实?不过,我会查一查。谢谢。
ls-l
在上述两种情况下都是相同的。如果一开始没有
,我就不会在当前会话中使用脚本,对吗?我需要将源代码导入当前会话。我试过
/setup target
但也不起作用。我必须了解shell脚本中的
(它是源代码的等价物)。一般来说,我认为我的答案仍然成立,
source
为您执行脚本,其中
/setup target
需要执行权限。其中一个变量很可能在您的路径上。所以仍然没有魔力。不确定你所说的CMAKE_INSTALL_DIR是什么意思?您是说CMAKE_INSTALL_DIR包含的路径被附加到$path中吗?如果是这样,我只是做了一个
echo$PATH
,没有,CMAKE_INSTALL_DIR和SDK_INSTALL_DIR持有的路径不在$PATH中。此外,源代码(或
)不仅执行脚本,还确保脚本作为当前shell进程的一部分运行。