web-dev-qa-db-ja.com

JenkinsパイプラインGroovyスクリプトからリソースファイルで定義されたbash関数を呼び出す方法は?

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関数を呼び出すための正しい手順は何でしょうか。

7
Ad N

ドキュメント によると

外部ライブラリは、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"
15
Yuri G.

Jenkins Pipelines V2を使用しているため、このための共有ライブラリを作成することをお勧めします。以下のコードが機能します。ファイルの書き込みに加えて、ファイルにも実行権限を付与する必要があります。

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

お役に立てれば!!

4
anuj0901

スクリプトは転送時にテキストファイルとして解析され、破損するため、これまでの回答はすべて不十分な解決策です。

引用符などが台無しになり、変数を置き換えようとします。

逐語的に転送する必要があります。

唯一の解決策は、スクリプトをファイルサーバーに保存し、ダウンロードして実行することです。例:

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 ...."
3

Shステップの最初にbashShebang(#!/ bin/bash)を使用して、Jenkinsにbashを使用するように指示し、bashの場合と同じようにlibをロードします。例:

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

事実に注意してください、そのpath/to/shared_lib.bashこれが機能するために、リポジトリにチェックインされています。

1
Gregory