我们正在使用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
答案 0 :(得分:9)
外部库可以从资源/目录加载附件文件 使用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 ...."