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()内のステップが例外を返す例外をキャッチしてクリーンビルドが成功した場合でも、パイプラインステージは失敗としてマークされます。
助言がありますか?
エラーメッセージは、_try/catch
_ではなく、prepareEnvironment
、setupBuildEnvironment
、または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()
}
}
_
スクリプトの承認に移動し(Manage Jenkinsの下部にあります)、例外のtoString
メソッドを承認します。
スクリプトの承認が見つからない場合は、プラグイン https://wiki.jenkins-ci.org/display/JENKINS/Script+Security+Plugin を最初にインストールします。
RejectedAccessException
が表示されたら、そのページにアクセスする必要があるかもしれません。