development

Jenkins 파이프 라인에서 실패한 단계에 대한 재시도 옵션을 구현하려면 어떻게해야합니까?

big-blog 2021. 1. 8. 22:45
반응형

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'
 }
}

참조 URL : https://stackoverflow.com/questions/36422888/how-do-i-implement-a-retry-option-for-failed-stages-in-jenkins-pipelines

반응형