以下是我的Jenkins 2.x管道:
node ('master'){
stage 'Checkout'
checkout scm
stage "Build Pex"
sh('build.sh')
}
当我运行这个管道时, checkout 会按照预期将代码放入工作区,而不是期望在workspace/中找到脚本(它真的在那里!),它会在一个不相关的目录中查找:workspace@tmp/durable-d812f509.
Entering stage Build Pex
Proceeding
[Pipeline] sh
[workspace] Running shell script
+ build.sh
/home/conmonsysdev/deployments/jenkins_ci_2016_interns/jenkins_home/jobs/pex/branches/master/workspace@tmp/durable-d812f509/script.sh: line 2: build.sh: command not found
如何修改这个Jenkinsfile,使build.sh在与我 checkout 项目源代码的目录完全相同的目录中执行?
8条答案
按热度按时间yqkkidmi1#
你可以把你的行为放在
dir
块中。<your new directory>
是您实际目录的占位符保持器。默认情况下,它是工作区的相对路径。您可以定义绝对路径,如果您确定代理上存在绝对路径。jrcvhitl2#
你的脚本不工作的原因是因为
build.sh
不在你的PATH中。Jenkinsfile
正在运行一个“sh”脚本,其全部内容是字符串build.sh
。parent 脚本位于“@tmp”目录中,并且将始终在那里-“@tmp”目录是Jenkins在运行期间保存Jenkins文件的地方。要解决此问题,请将行更改为
sh "./build.sh"
或sh "bash build.sh"
,以便Jenkins文件中的sh
块可以正确定位您要执行的build.sh
脚本。o3imoua43#
Jenkins在从你的项目克隆时会创建一个文件夹,如下所示:
/var/lib/jenkins/workspace/job-name@script
要做到这一点,你必须将文件设置为可执行文件(如果你在Linux环境中),然后调用shell脚本。
大概是这样的:
zynd9foi4#
我也有同样的问题,dir也没有帮助,可能是因为我在tmp dir本身的一个子目录中工作(原因与此无关)。我的代码看起来像这样
(the添加
pwd
和la -l
语句只是为了调试。问题存在w/o他们。)与他们我得到输出如下:我最终做到了这一点:
pprl5pva5#
我能够让我的脚本执行工作与拉斐尔曼佐尼的React简化衍生。我想知道整个“JOB_NAME@script”的事情,并发现这是不必要的,至少对于使用我们版本的Jenkins的声明性。只需设置工作区的访问权限。不需要再深入了。
w6mmgewl6#
我收集了上面所有的答案,对我来说,它是这样工作的:
感谢@拉斐尔·曼佐尼@基思·米切尔和@贾扬
8nuwlpux7#
如果您可以在SCM存储库中的
build.sh
上设置可执行位,则可以沿着executable header,例如那么它也应该是可执行的,在 checkout ,所以简单地
如果你不喜欢在配置管理库中的文件上设置模式位(例如,因为它会给Windows用户带来问题),简单的替代方法包括
或
(取决于它实际上是一个纯Bourne shell脚本,还是真正的Bash),或者
(This最后一种习惯用法可能容易出错,因为它将在代理上的默认shell中运行脚本,在许多Linux发行版上将是Bash,但在Debian/Ubuntu上将是“Dash”,它会故意阻止特定于Bash的功能。
如果您不希望将Pipeline脚本硬编码为特定的shell(或其他解释器,如Python),则可以如上所述包含
#!
头文件,但运行qf9go6mv8#
使用
GIT_CHECKOUT_DIR
环境变量Jenkinsfile:
在设置管道时设置
GIT_CHECKOUT_DIR
。看看这个question:更多环境变量列表:
${YOUR_JENKINS_HOST}/env-vars.html
http://localhost:8000/env-vars.html
最受欢迎的答案是危险而脆弱的。不需要在多个地方使用依赖于静态操作系统的ABSOLUTE PATH,一旦您更改机器,这些PATH就会破坏您的构建。