Jenkins 파이프 라인에서 실패한 단계에 대한 재시도 옵션을 구현하려면 어떻게해야합니까?
여러 단계가있는 Jenkinsfile이 있으며 그중 하나는 실제로 일부 경우 실패 할 수있는 다른 작업 (배포 작업)입니다.
Jenkinsfile을 사용하여 프롬프트를 만들 수 있다는 것을 알고 있지만이 작업에 대한 재시도 메커니즘을 구현하는 방법을 잘 모릅니다.
실패한 단계를 클릭하고 다시 시도하도록 선택하고 싶습니다.
재시도 + 입력을 결합하여 그렇게 할 수 있어야합니다.
stage('deploy-test') {
try {
build 'yourJob'
} catch(error) {
echo "First build failed, let's retry if accepted"
retry(2) {
input "Retry the job ?"
build 'yourJob'
}
}
}
아무도 유효성을 검사하지 않으면 완료되기를 원하는 경우 입력에 시간 제한을 사용할 수도 있습니다. waitUntil도 유용 할 수 있지만 아직 사용하지 않았습니다.
편집 : WaitUntil은 확실히 최고로 보입니다. 조금만 가지고 놀아야하지만 그와 같은 것이 더 깨끗합니다.
stage('deploy-test') {
waitUntil {
try {
build 'yourJob'
} catch(error) {
input "Retry the job ?"
false
}
}
}
그건 그렇고, 여기에 모든 단계가 있습니다 https://jenkins.io/doc/pipeline/steps
This gist (not mine) was one of the better options that I found while trying to implement this functionality too. https://gist.github.com/beercan1989/b66b7643b48434f5bdf7e1c87094acb9
Changed it to a method in a shared library that just did retry or abort for my needs. Also added a max retries and made the timeout variable so that we could change it depending on the job or stage that needs it.
package com.foo.bar.jenkins
def class PipelineHelper {
def steps
PipelineHelper(steps) {
this.steps = steps
}
void retryOrAbort(final Closure<?> action, int maxAttempts, int timeoutSeconds, final int count = 0) {
steps.echo "Trying action, attempt count is: ${count}"
try {
action.call();
} catch (final exception) {
steps.echo "${exception.toString()}"
steps.timeout(time: timeoutSeconds, unit: 'SECONDS') {
def userChoice = false
try {
userChoice = steps.input(message: 'Retry?', ok: 'Ok', parameters: [
[$class: 'BooleanParameterDefinition', defaultValue: true, description: '', name: 'Check to retry from failed stage']])
} catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e) {
userChoice = false
}
if (userChoice) {
if (count <= maxAttempts) {
steps.echo "Retrying from failed stage."
return retryOrAbort(action, maxAttempts, timeoutMinutes, count + 1)
} else {
steps.echo "Max attempts reached. Will not retry."
throw exception
}
} else {
steps.echo 'Aborting'
throw exception;
}
}
}
}
}
Example usage with a max of 2 retries that waits for 60s for input.
def pipelineHelper = new PipelineHelper(this)
stage ('Retry Example'){
pipelineHelper.retryOrAbort({
node{
echo 'Here is an example'
throw new RuntimeException('This example will fail.')
}
}, 2, 60)
}
Just remember to put nodes inside of the closure so that waiting for an input doesn't block an executor.
If you have the paid jenkins enterprise Cloudbees has a Checkpoint plugin that can better handle this, but it is not planned to be release for open source Jenkins (JENKINS-33846).
This one with a nice incremental wait
stage('deploy-test') {
def retryAttempt = 0
retry(2) {
if (retryAttempt > 0) {
sleep(1000 * 2 + 2000 * retryAttempt)
}
retryAttempt = retryAttempt + 1
input "Retry the job ?"
build 'yourJob'
}
}
'development' 카테고리의 다른 글
UISearchBar CGContext 오류 (0) | 2021.01.08 |
---|---|
Visual Studio 2013 프로젝트의 새로운 Startup.cs 파일은 무엇입니까? (0) | 2021.01.08 |
ClickOnce에 대한 대안은 무엇입니까? (0) | 2021.01.08 |
WebKitFormBoundary 뒤의 임의의 문자열은 무엇을 의미합니까? (0) | 2021.01.08 |
C #에 || = 또는 && = 연산자가없는 이유는 무엇입니까? (0) | 2021.01.08 |