如何从Jenkins管道Groovy脚本调用资源文件中定义的bash函数?

时间:2016-10-24 08:18:00

标签: bash jenkins groovy jenkins-pipeline

我们正在使用Pipeline Shared Libraries插件来分解我们不同的Jenkins管道常用的代码。

From its documentation,它为非Groovy文件提供了resources顶级文件夹。由于我们依赖于不同的bash函数,我们希望将它们托管在单独的.sh文件中(因此它们也可以被除Jenkins之外的其他进程使用)。 相同的文档告诉我们使用libraryResource步骤加载这些资源文件。我们可以在Groovy脚本中成功调用此方法,并将其资源文件名称作为参数(function.sh)。但是从这里开始,我们无法找到从同一个Groovy脚本调用foofoo中定义的function.sh函数的方法。

sh "foofoo"  #error: foofoo is not defined

我们也试图像这样首先采购它:

sh "source function.sh && foofoo"

但它在source步骤失败,说明找不到function.sh

调用function.sh

中定义的bash函数的正确过程是什么?

4 个答案:

答案 0 :(得分:9)

根据documentation

  

外部库可以从资源/目录加载附件文件   使用libraryResource步骤。参数是相对路径名,   类似于Java资源加载:

def request = libraryResource 'com/mycorp/pipeline/somelib/request.json'
  

文件作为字符串加载,适合传递给某些API   或使用writeFile保存到工作区。

     

建议您使用独特的包结构,以免使用   不小心与另一个图书馆发生冲突。

我认为以下内容可行

def functions = libraryResource 'com/mycorp/pipeline/somelib/functions.sh'
writeFile file: 'functions.sh', text: functions
sh "source function.sh && foofoo"

答案 1 :(得分:2)

由于您正在使用Jenkins Pipelines V2,因此最好为此创建一个共享库。下面的代码将起作用。除了编写文件之外,您还需要提供文件的执行特权:

def scriptContent = libraryResource "com/corp/pipeline/scripts/${scriptName}"
writeFile file: "${scriptName}", text: scriptContent
sh "chmod +x ${scriptName}"

希望这会有所帮助!

答案 2 :(得分:1)

在您的sh步骤开始时使用bash shebang(#!/ bin / bash)告诉Jenkins使用bash,然后像在bash中一样加载您的lib,例如:

sh '''#!/bin/bash
      . path/to/shared_lib.bash
       myfunc $myarg
    '''

请记住,path/to/shared_lib.bash已在您的仓库中被检查,以使其正常工作。

答案 3 :(得分:0)

所有先前的答案都是较差的解决方案,因为脚本在传输时会被解析为文本文件,从而破坏了文本。

行情弄乱了,它试图替换变量。

需要逐字转移。

唯一的解决方案是将脚本存储在文件服务器上,下载并运行,例如:

sh """
    wget http://some server/path../yourscript.sh
    chmod a+x yourscript.sh
   """

...或直接从仓库中检出脚本,像这样在本地使用它:

withCredentials([usernamePassword(
    credentialsId: <git access credentials>,
    usernameVariable: 'username',
    passwordVariable: 'password'
)])
{
    sh  """
        git clone http://$username:$password@<your git server>/<shared library repo>.git gittemp
        cd gittemp
        git checkout <the branch in the shared library>
        cd ..
        mv -vf gittemp/<path to file>/yourscript.sh ./
    """
}

...然后再运行您的脚本:

sh "./yourscript.sh ...."