Pipeline Shared Libraries プラグインを使用して、さまざまなJenkinsパイプラインに共通のコードを因数分解しています。
ドキュメントから 、Groovy以外のファイル用にresources
トップレベルフォルダーを提供します。さまざまなbash関数に依存しているため、それらを別の.sh
ファイルでホストしたいと思います(したがって、Jenkins以外のプロセスでも使用できます)。同じドキュメントで、libraryResource
ステップを使用してこれらのリソースファイルをロードする方法について説明しています。 Groovyスクリプト内でこのメソッドを正常に呼び出すことができ、リソースファイル名を引数(function.sh
)として指定します。しかし、ここからは、同じGroovyスクリプトからfunction.sh
で定義されたfoofoo
関数を呼び出す方法を見つけることができませんでした。
sh "foofoo" #error: foofoo is not defined
また、最初に次のように調達しようとしました。
sh "source function.sh && foofoo"
しかし、source
ステップで失敗し、function.sh
が見つからないことを示します。
function.sh
で定義されたbash関数を呼び出すための正しい手順は何でしょうか。
ドキュメント によると
外部ライブラリは、libraryResourceステップを使用してresources /ディレクトリから付属ファイルをロードできます。引数は相対パス名であり、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"
Jenkins Pipelines V2を使用しているため、このための共有ライブラリを作成することをお勧めします。以下のコードが機能します。ファイルの書き込みに加えて、ファイルにも実行権限を付与する必要があります。
def scriptContent = libraryResource "com/corp/pipeline/scripts/${scriptName}"
writeFile file: "${scriptName}", text: scriptContent
sh "chmod +x ${scriptName}"
お役に立てれば!!
スクリプトは転送時にテキストファイルとして解析され、破損するため、これまでの回答はすべて不十分な解決策です。
引用符などが台無しになり、変数を置き換えようとします。
逐語的に転送する必要があります。
唯一の解決策は、スクリプトをファイルサーバーに保存し、ダウンロードして実行することです。例:
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 ...."
Shステップの最初にbashShebang(#!/ bin/bash)を使用して、Jenkinsにbashを使用するように指示し、bashの場合と同じようにlibをロードします。例:
sh '''#!/bin/bash
. path/to/shared_lib.bash
myfunc $myarg
'''
事実に注意してください、そのpath/to/shared_lib.bash
これが機能するために、リポジトリにチェックインされています。