shell - 设置环境变量然后在 Jenkins Scripted Pipeline 中运行脚本
问题描述
我是 Jenkins、Groovy 和管道的新手。我创建了一个简单的管道阶段,如下所示:
//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}"
}
}
}
}
这会出错:
/home/jenkins-sw/ci/workspace/myWorkSpace@tmp/durable-6d30b48d/script.sh: 第 1 行: .: setup-target: 找不到文件
和
无法运行 setup-target 脚本并出现错误:hudson.AbortException:脚本返回退出代码 1
但是设置了环境变量,我通过在sh 'printenv'
该行的正下方进行检查ls -l
。有趣的是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}"
}
}
}
}
结果是:
/home/jenkins-sw/ci/workspace/myWorkSpace@tmp/durable-6d30b48d/script.sh:第 1 行:./setup-target:权限被拒绝
有趣的。withEnv 如何影响权限?什么?!如果我对该文件进行 chmod 以获得权限,我会收到一个新错误,与“缺少工作区”有关。
解决方案
我想到了。我直接克隆到工作区,然后将我的环境变量也设置为指向工作区。我修改了这两个东西。我现在在我的工作空间中创建一个目录并克隆到它,我还将我的环境变量设置为我的工作空间内的目录。像这样:
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}"
}
}
}
}
这行得通。
推荐阅读
- firebase-hosting - next.js 与 firebase 托管:如何为 firebase 创建 404.html 文件?
- html - 如何将项目左对齐(标题)
- angularjs - Angular 1.5 与外部值相关的自定义验证
- java - 如何在服务器上实现校验和检查逻辑以识别 jar 是否相同或更新
- python - 有谁知道如何使用 CVXOPT 模块在 Python 中进行凸优化?
- sql - 结合 join 和 where 子句时性能不佳
- c# - 如何对 KeyValuePair 的特定列进行分组
- php - 致命错误:调用未定义函数:WP functions.php
- recursion - Lua Love2d 四叉树递归
- python - 检查相应列表中是否存在值