“Xây dựng định kỳ” với Đường ống nhiều nhánh trong Jenkins


80

Tôi đang chạy Jenkins 2 với plugin Pipeline. Tôi đã thiết lập một dự án Đường ống nhiều nhánh trong đó mỗi nhánh (chủ, phát triển, v.v.) có một tệp Jenkins ở gốc. Thiết lập này rất đơn giản. Tuy nhiên, tôi không biết làm thế nào để mỗi nhánh chạy định kỳ (không phải lập chỉ mục nhánh), ngay cả khi mã không thay đổi. Tôi cần đặt gì vào Jenkinsfile của mình để kích hoạt các bản dựng định kỳ?

Câu trả lời:


68

Nếu bạn sử dụng Pipeline kiểu khai báo và chỉ muốn kích hoạt bản dựng trên một nhánh cụ thể, bạn có thể làm như sau:

String cron_string = BRANCH_NAME == "master" ? "@hourly" : ""

pipeline {
  agent none
  triggers { cron(cron_string) }
  stages {
    // do something
  }
}

Tìm thấy trên Jenkins Jira


15
Điều này hoạt động, nhưng lưu ý rằng việc cam kết và đẩy Jenkinsfile là không đủ để kích hoạt được chọn; công việc cũng phải được chạy một lần theo cách thủ công sau đó.
Cameron

1
Trình kích hoạt có thể nằm bên trong khối sân khấu không? Tức là giai đoạn ('Triển khai đến sản xuất') {triggers {cron (MASTER_TRIGGER)}
Người học

2
Điều này sẽ hoạt động trong một tệp jenkins khai báo hay chỉ một tệp jenkins có tập lệnh?
Người học

Nên làm việc với Jenkinsfile khai báo. Trình kích hoạt chỉ hoạt động bên trong iirc thẻ tùy chọn. Nếu bạn chỉ muốn triển khai nhánh chính, bạn có thể đặt một tập lệnh {if (BRANCH_NAME == „Master“) {// deploy}} bên trong khối triển khai. (Tôi hiện đang sử dụng thiết bị di động nên cú pháp có thể sai)
Julian Veerkamp

@Learner "nếu bạn sử dụng Pipeline kiểu khai báo"
OrangeDog

43

Nếu bạn đang sử dụng kiểu khai báo Jenkinsfile thì bạn sử dụng chỉ thị kích hoạt .

pipeline {
    agent any
    triggers {
        cron('H 4/* 0 0 1-5')
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

14
Có cách nào để chỉ kích hoạt cron trên masterchi nhánh không? Để đưa ra một số ngữ cảnh: khi các thành viên trong nhóm tạo một nhánh tính năng mới và cam kết ở đó, tệp Jenkins vẫn sẽ kích hoạt (thông qua thăm dò ý kiến ​​hoặc đẩy) nhưng điều tôi không muốn là kích hoạt cron trên các nhánh tính năng này.
foobarto

Sử dụng: giai đoạn ('Giai đoạn 1') {khi {nhánh "chính"} bước {}} HOẶC giai đoạn ('Giai đoạn 1 (Không phải chính)') {khi {không phải {nhánh 'chính'}} bước {sh 'do-non- master.sh '}}
tr53

29

Tôi có thể tìm thấy một ví dụ minh họa điều này một cách loại bỏ các bản dựng cũ, đây cũng là điều tôi muốn.

Jenkinsfile trong jenkins-Infra / jenkins.io:

properties(
    [
        [
            $class: 'BuildDiscarderProperty',
            strategy: [$class: 'LogRotator', numToKeepStr: '10']
        ],
        pipelineTriggers([cron('H/30 * * * *')]),
    ]
)

1
BTW đối với thuộc tính đầu tiên, bạn có thể sử dụng buildDiscarderbiểu tượng để đơn giản hóa cú pháp, như Pipeline Syntax sẽ hiển thị.
Jesse Glick vào

1
Nó không hoạt động trong các đường ống được tập lệnh theo jenkins 2.79 (java.lang.UnsupportedOperationException: Ký hiệu không xác định '
pipeTriggers

2
Eric, chỉ cần thử với điều này cho các đường ống có tập lệnh: pipelineTriggers([[$class: "TimerTrigger", spec: "H 1 * * *"]])
nradev


2

Đối với các lần chạy định kỳ được Paramertized hoặc bộ kích hoạt theo lịch trình, người ta có thể sử dụng như sau.

triggers{
    parameterizedCron env.BRANCH_NAME == "develop" ? '''H 03 * * * % buildSlave=vm1;testSlave=vm2;HYPERVISOR=vbox;VERSION=10.5.0.0
H 03 * * * % buildSlave=vm1;testSlave=vm2;HYPERVISOR=workstation;VERSION=10.5.0.0''' : ""
}

0

Tôi nhấn các vấn đề với các giải pháp trên.
Tôi không phải là trình hướng dẫn của Jenkins nên không chắc liệu tôi có đang sử dụng định dạng / cú pháp cũ hay thứ gì đó hay không, nhưng cách sau đây đang hoạt động với tôi.

#!/usr/bin/env groovy
properties(
    [
        pipelineTriggers([
                [
                    $class: 'TimerTrigger',
                    spec: 'H 7,19 * * *'
                ]
         ])
    ]
)

Được xác định từ: https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/triggers/TimerTrigger.java

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.