web-dev-qa-db-ja.com

Jenkins Pipeline:再試行ブロック内で試行/キャッチ

Jenkinsパイプラインに問題があります。ビルド環境がワークスペースに既に存在する場合は、以前の環境を使用して(増分)ビルドを実行します。

それが失敗した場合は、クリーンビルドで再試行します(以前のビルド環境を削除してから、もう一度ビルドします)。

私はこれをやろうとしている:

_retry(1) {
        try {
            prepareEnvironment()
            setupBuildEnvironment() // sets up environment if it is not present yet
            runBuild()
        } catch (e) {
            echo 'Err: Incremental Build failed with Error: ' + e.toString()
            echo '     Trying to build with a clean Workspace'
            removeOldBuildEnvironment()
        } finally {
            cleanupEnvironment()
        }
    }
_

Jenkinsでこれを実行し、runBuild()ステップが失敗すると、次のようになります。

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:スクリプトが新しいJava.lang.Exception Java.lang.Stringの使用を許可されていない

問題は、retry(1)ブロック内のtry/catchだと思います。それを修正する方法の提案

リトライせずに試してみました。ここで私は問題がある

_bat "..." 
_

runBuild()内のステップが例外を返す例外をキャッチしてクリーンビルドが成功した場合でも、パイプラインステージは失敗としてマークされます。

助言がありますか?

7
Ditschi

エラーメッセージは、_try/catch_ではなく、prepareEnvironmentsetupBuildEnvironment、またはrunBuildメソッドで例外をスローするためです。これは、サンドボックスモードでは許可されないthrow new Exception("message")などの。許可されているのは、次のようにerrorステップを使用することです。

_def runBuild() {
    // ...
    error "ERR"
}
_

このステップは、指定されたメッセージとともに_hudson.AbortException_をスローします。

コード内のcatchブロックは、この例外をキャッチして適切なメッセージを出力し、removeOldBuildEnvironmentを呼び出します

一方、この変更を行っても、catchブロックによって例外が飲み込まれるため、スクリプトは期待どおりに機能せず、再試行ステップでコードが再度実行されることはありません。これを機能させるには、catchブロックから再度例外をスローする必要があります(retry(2)の代わりにretry(1)を使用する必要があることに注意してください)

_retry(2) {
    try {
        prepareEnvironment()
        setupBuildEnvironment() // sets up environment if it is not present yet
        runBuild()
    } catch (e) {
        echo 'Err: Incremental Build failed with Error: ' + e.toString()
        echo '     Trying to build with a clean Workspace'
        removeOldBuildEnvironment()
        throw e
    } finally {
        cleanupEnvironment()
    }
}
_
5
Gergely Toth

スクリプトの承認に移動し(Manage Jenkinsの下部にあります)、例外のtoStringメソッドを承認します。

スクリプトの承認が見つからない場合は、プラグイン https://wiki.jenkins-ci.org/display/JENKINS/Script+Security+Plugin を最初にインストールします。

RejectedAccessExceptionが表示されたら、そのページにアクセスする必要があるかもしれません。

4