7

Tôi đã cố gắng nhận thông báo git commit trong jenkinsfile và ngăn chặn việc xây dựng dựa trên thông điệp cam kết.Làm thế nào để nhận được thông báo cam kết mới nhất git và ngăn chặn việc xây dựng jenkins nếu tin nhắn cam kết chứa [ci bỏ qua]?

env.GIT_COMMIT không trả lại chi tiết cam kết trong jenkinsfile.

Cách nhận thông báo cam kết mới nhất của git và ngăn xây dựng jenkins nếu thông báo cam kết chứa [ci skip] trong đó?

+2

thử sh "git log -1" và grep văn bản có liên quan. – Amityo

+0

@Amityo: Cảm ơn nó thực sự hữu ích. Tôi cần thêm một truy vấn ... làm thế nào để ngăn chặn jenkins xây dựng trong jenkinsfile, nếu tin nhắn chứa nội dung [ci skip]? –

Trả lời

10

Việc xây dựng sẽ vượt qua khi [ci skip] được cung cấp trong git log cuối cùng, nhưng sẽ không chạy mã thực tế xây dựng (thay thế cho echo tuyên bố đầu tiên)

node { 
    checkout scm 
    result = sh (script: "git log -1 | grep '\\[ci skip\\]'", returnStatus: true) 
    if (result != 0) { 
    echo "performing build..." 
    } else { 
    echo "not running..." 
    } 
} 
+1

Để biết thêm thông tin về cách sử dụng 'sh': https://issues.jenkins-ci.org/browse/JENKINS-26133 –

3

Tôi nghĩ rằng bạn có thể dễ dàng làm điều đó trong cấu hình công việc đường ống đa ngành Nguồn chi nhánh> Hành vi bổ sung> Bỏ phiếu bỏ qua cam kết với một số thư nhất định multi branch pipeline job configuration

+0

Khi sử dụng phương pháp này, $ CHANGE_ID không có sẵn trong Jenkinsfile. –

5

Tôi có cùng vấn đề. Tôi đang sử dụng đường ống dẫn. Tôi đã giải quyết vấn đề này bằng cách thực hiện một số shared library.

Mã của thư viện là:

// vars/ciSkip.groovy 

def call(Map args) { 
    if (args.action == 'check') { 
     return check() 
    } 
    if (args.action == 'postProcess') { 
     return postProcess() 
    } 
    error 'ciSkip has been called without valid arguments' 
} 

def check() { 
    env.CI_SKIP = "false" 
    result = sh (script: "git log -1 | grep '.*\\[ci skip\\].*'", returnStatus: true) 
    if (result == 0) { 
     env.CI_SKIP = "true" 
     error "'[ci skip]' found in git commit message. Aborting." 
    } 
} 

def postProcess() { 
    if (env.CI_SKIP == "true") { 
     currentBuild.result = 'NOT_BUILT' 
    } 
} 

Sau đó, trong Jenkinsfile tôi:

pipeline { 
    stages { 
    stage('prepare') { steps { ciSkip action: 'check' } } 
    // other stages here ... 
    } 
    post { always { ciSkip action: 'postProcess' } } 
} 

Như bạn có thể thấy, việc xây dựng được đánh dấu là NOT_BUILT. Bạn có thể thay đổi nó thành ABORTED nếu bạn thích, nhưng không thể đặt thành SUCCESSa build result can only get worse

+0

Cảm ơn, nó hoạt động tuyệt vời! #testedAndApproved –

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