別のスクリプトを呼び出して実行するパイプラインジョブを作成しています。 Jenkinsfileとスクリプトは同じディレクトリに存在しますが、ジョブは実行するスクリプトを見つけることができません。
これは関連するスクリプトのビットです。
stage ('Update') {
try {
dir('jenkins/pipeline/update-jenkins-plugins-ppln') {
sh 'ls -l'
sh 'update-plugins.sh'
}
}
次のエラーを返します。
[update-jenkins-plugins-ppln] Running Shell script
+ ls -l
total 8
-rw-r--r-- 1 jenkins jenkins 2441 Dec 20 09:34 Jenkinsfile
-rwxr-xr-x 1 jenkins jenkins 506 Dec 19 14:06 update-plugins.sh
[Pipeline] sh
[update-jenkins-plugins-ppln] Running Shell script
+ update-plugins.sh
/var/lib/jenkins/workspace/update-jenkins-plugins-ppln/jenkins/pipeline/update-jenkins-plugins-ppln@tmp/durable-11cefdd0/script.sh: 2: /var/lib/jenkins/workspace/update-jenkins-plugins-ppln/jenkins/pipeline/update-jenkins-plugins-ppln@tmp/durable-11cefdd0/script.sh: update-plugins.sh: not found
ご覧のとおり、ls
に従って必要なファイルupdate-plugins.sh
はパスしたディレクトリにあるため、私が使用しているパスは正しいです。ただし、何らかの理由で、実際にJenkinsがスクリプトを検索すると、パスに@tmp/durable-8d48734f/script.sh
が追加されます。
さまざまなトラブルシューティング:
Jenkinsが@tmpビットを追加する理由と、この動作を防ぐ方法はありますか?
あなたのパスワードはPATHにないので、次のように呼び出す必要があります:sh './update-plugins.sh'
Jenkinsワークスペース環境変数WORKSPACE
(ワークスペースの絶対パス)を使用してみましたか?これで、行は次のようになります。
sh '${WORKSPACE}/jenkins/pipeline/update-jenkins-plugins-ppln/update-plugins.sh'
私は同じ問題を抱えていました。 @ -Orenが技術的にあなたの質問に答えたと思いますwhy Jenkinsがこのtmp
スペースを作成しますが、解決方法に関する情報を共有できます。
基本的に、私のJenkins Hostシンボリックリンクbin/sh
からdash
; bash
ではありません。したがって、POSIX準拠のシェルスクリプトを使用すると、問題が解決しました。
たとえば、私はshopt -s extglob
でパターンマッチングを行います。
stage {
def shellCommand = $/ "rm -rf ! (_data|_includes|_plugins|Gemfile|_config.yml|page-builder)"/$
sh(returnStdout: true, script: shellCommand).trim()
}
dash
はextglob
をサポートしていないため、POSIX準拠のfind
コマンドに置き換えれば機能します。
stage {
sh('find . -regextype posix-extended -not -regex ".*includes.*|.*data.*|.*plugins.*|.*config.yml|.*Gemfile.*"')
}
この特定のケースはコンソールのJenkinsの外部で再現できるため、Jenkinsパイプラインとは関係がないと思います。パイプラインの「sh()」で実行したスクリプトのDOS line-endingsが原因でこの問題が発生した。この例を見てください:
$ cat -v dos_formatted.sh
#! /bin/sh^M
pwd^M
$ cat script.sh
./dos_formatted.sh
$ sh -xe script.sh
+ ./dos_formatted.sh
script.sh: 1: script.sh: ./dos_formatted.sh: not found
「見つかりません」というメッセージは誤解を招くものであることをよく示しています。スクリプトは適切な場所にあり、権限は十分ですが、別のスクリプトから実行すると、このようなエラーメッセージが表示されて失敗します。
Durable Task Pluginのコード( https://github.com/jenkinsci/durable-task-plugin/blob/master/src/main/Java/org/jenkinsci/plugins/durabletask/BourneShellScript.Java )は、プラグインが自動生成されたscript.shを「sh -xe ...」として実行することを示しています。したがって、これはまさに私たちのケースです。
上記の状況は、いくつかの(おそらくサードパーティの)Gitプロジェクトを「git clone」し、それがUnixスタイルのLFで複製されていることを確認しない場合に発生する可能性があります。
シェルスクリプトがパス/var/lib/jenkins/workspace/New_commit_test/Fibonacci.shにあるにもかかわらず、Jenkinsビルドがエラーメッセージ「/tmp/jenkins6688065235543884785.sh:3:/ tmp/jenkins6688065235543884785.sh:/var/lib/jenkins/workspace/New_commit_test/Fibonacci.sh:not found "
以前のコマンドを$ {WORKSPACE} /Fibonacci.sh> New_commit_test.txtから変更しました
to:(ここでbashスクリプトを使用していたため)bash $ {WORKSPACE} /Fibonacci.sh> New_commit_test.txt
ここで問題を並べ替えました
@tmpフォルダーは、jenkinsのジョブとステージの統計情報(ステージの期間など)のためにあります。確認する場合は削除できます。私はあなたの種類の問題が間違ったパスに関連していると思います、それを再確認してください。