web-dev-qa-db-ja.com

@tmpパスが作成されているため、Jenkins Pipelineジョブはスクリプトを見つけることができません

別のスクリプトを呼び出して実行するパイプラインジョブを作成しています。 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が追加されます。

さまざまなトラブルシューティング:

  • Jenkinsfileを取得するためにすでにブランチをチェックアウトしている場合でも、ブランチを再度チェックアウトする必要があると読みました。
  • 私はチェックするためにJenkinsボックスにSSH接続しました。そうです、スクリプトはそこにあります。

Jenkinsが@tmpビットを追加する理由と、この動作を防ぐ方法はありますか?

15
Alex

あなたのパスワードはPATHにないので、次のように呼び出す必要があります:sh './update-plugins.sh'

3
izzekil

Jenkinsワークスペース環境変数WORKSPACE(ワークスペースの絶対パス)を使用してみましたか?これで、行は次のようになります。

sh '${WORKSPACE}/jenkins/pipeline/update-jenkins-plugins-ppln/update-plugins.sh'
3
grubers

私は同じ問題を抱えていました。 @ -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()
}

dashextglobをサポートしていないため、POSIX準拠のfindコマンドに置き換えれば機能します。

stage {
    sh('find . -regextype posix-extended -not -regex ".*includes.*|.*data.*|.*plugins.*|.*config.yml|.*Gemfile.*"')
} 
1
knack

この特定のケースはコンソールの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で複製されていることを確認しない場合に発生する可能性があります。

0

シェルスクリプトがパス/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

ここで問題を並べ替えました

0
Nin

@tmpフォルダーは、jenkinsのジョブとステージの統計情報(ステージの期間など)のためにあります。確認する場合は削除できます。私はあなたの種類の問題が間違ったパスに関連していると思います、それを再確認してください。

0
Oren