如何在Jenkins管道脚本中使用source命令

28

最近,我将Bash执行命令重写为Jenkins pipeline。旧代码如下:

原始代码

(注意:代码已省略)

...
source environment.sh
//Build
//Test
...
现在我使用管道脚本来封装命令,像这样:

现在我使用管道脚本来封装命令,像这样

sh '''
    ...
    source environment.sh
    //Build
    //Test
    ...
'''

然而,我遇到了一个错误:.../.jenkins/script.sh: 第9行:source: environment.sh:找不到文件。当我尝试使用less environment.sh来查看时,它显示正确。因此,我怀疑sh wrap中的source命令存在问题。

在使用流水线之前,在shell执行中source environment.sh命令可以正常工作。因此,在Jenkins服务器上安装了source,似乎流水线脚本不知道source命令。

我该如何在sh wrap块内运行source命令呢?


使用 echo $pwd; ls . 进行调试。 - walsht
4个回答

31

source environment.sh 替换为

. ./environment.sh
请注意第一个句点后面有一个空格。

请注意第一个句点后面有一个空格。


1
这个可以工作了。我不再需要使用绝对路径了。谢谢。 - Neil

16

source是/ksh/等的扩展,作为更“实质性”的.的同义词。

sh中,如果底层shell不支持命令source(如dash),则需要使用.

sh '''
    ...
    . ./environment.sh
    //Build
    //Test
    ...
'''

我猜三引号是管道脚本中的语法,可以识别多行命令。我尝试使用“.”代替“source”,但是没有成功。类似的错误会抛出“/.jenkins/script.sh: line 9: .: environment.sh: file not found”。 - Neil
啊,看来这不仅仅是一个Shell脚本。 (尽管这应该是显而易见的,抱歉。)看起来真正的问题是Jenkins的工作目录与您原始脚本不同。使用绝对路径(而不仅仅是“environment.sh”)应该可以解决问题。 - chepner
谢谢,使用绝对路径可以工作。不过,Linux 找不到文件还是很奇怪的。 - Neil
@Neil 你必须先输入 ' ./' : . ./environment.sh。这对我有效。 - A. Gille
固定的;我总是忘记如果文件名中没有“/”,则“.”使用路径查找。 - chepner

1

如果有人想要使用源码执行脚本,唯一的解决方法是在“管理Jenkins”-“配置系统”中将“Shell可执行文件”更改为bash。


1

. ./script.sh命令可以正常工作,但您还可以执行以下操作:

sh '''#!/bin/bash
      source /path/to/script.sh
                    
   '''

重要提示!: 请注意,#!/bin/bash是脚本中的第一行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接