2016-04-05 14 views
36

Tôi có một Jenkinsfile với nhiều giai đoạn và một trong số họ là trong thực tế một công việc khác (một triển khai) mà có thể thất bại trong một số trường hợp.Làm cách nào để triển khai tùy chọn thử lại cho các giai đoạn không thành công trong đường ống Jenkins?

Tôi biết rằng tôi có thể tạo lời nhắc bằng cách sử dụng Jenkinsfile nhưng tôi không thực sự biết cách triển khai cơ chế thử lại cho công việc này.

Tôi muốn có thể nhấp vào giai đoạn không thành công và chọn thử lại. jenkins-pipelines-with-stages

+1

Yêu cầu tính năng tổng thể này là [JENKINS-33846] (https://issues.jenkins-ci.org/browse/JENKINS-33846). Nó (dissapointingly) chỉ được chọn cho các đường ống khai báo trong [JENKINS-45455] (https://issues.jenkins-ci.org/browse/JENKINS-45455). – mkobit

Trả lời

22

Bạn sẽ có thể kết hợp retry + đầu vào để làm điều đó Something như thế

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

bạn cũng có thể sử dụng thời gian chờ cho đầu vào nếu bạn muốn nó kết thúc nếu không ai xác nhận. Ngoài ra còn có waitUntil rằng có thể có ích nhưng tôi đã không sử dụng nó chưa

Edit: WaitUntil dường như chắc chắn là tốt nhất, bạn nên chơi với nó một chút nhưng một cái gì đó như thế là sạch hơn:

stage('deploy-test') { 
    waitUntil { 
    try { 
     build 'yourJob' 
    } catch(error) { 
     input "Retry the job ?" 
     false 
    } 
    } 
} 

Nhân tiện, có tất cả các bước ở đây https://jenkins.io/doc/pipeline/steps

+0

Có phải sẽ thêm lời nhắc thử lại không? Tôi nghi ngờ. – sorin

+0

Ồ không, bạn nói đúng. tôi sẽ cập nhật câu trả lời của tôi cho điều đó! – fchaillou

+1

Chỉ có thể bật thời gian chờ cho phần thử lại không? Tôi có thể muốn có một thời gian chờ khác nhau cho công việc. Tôi đã không chấp nhận câu trả lời như tôi không tìm thấy một công việc chặn như là một giải pháp tốt. Lý tưởng nhất là tùy chọn thử lại sau khi công việc đã hoàn tất. Hãy tưởng tượng rằng công việc này được kích hoạt bởi một cái móc GitHub trên một PR. Tôi muốn thấy sự thất bại trên GitHub thay vì không có câu trả lời trong trường hợp có lỗi. – sorin

2

Gist này (không phải của tôi) là một trong những tùy chọn tốt hơn mà tôi tìm thấy trong khi cố gắng triển khai chức năng này. https://gist.github.com/beercan1989/b66b7643b48434f5bdf7e1c87094acb9

Đã thay đổi nó thành phương thức trong thư viện được chia sẻ vừa thử lại hoặc hủy bỏ các nhu cầu của tôi. Cũng đã thêm một lần thử lại tối đa và thực hiện biến thời gian chờ để chúng tôi có thể thay đổi tùy thuộc vào công việc hoặc giai đoạn cần nó.

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

Ví dụ sử dụng với tối đa 2 lần thử lại chờ 60 giây cho đầu vào.

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

Chỉ cần nhớ đặt các nút bên trong phần đóng để đợi đầu vào không chặn trình thực thi.

Nếu bạn có doanh nghiệp jenkins trả tiền, Cloudbees có plugin Checkpoint có thể xử lý tốt hơn, nhưng nó không được lên kế hoạch phát hành cho mã nguồn mở Jenkins (JENKINS-33846).

Các vấn đề liên quan