Làm cách nào tôi có thể kích hoạt một công việc khác từ đường ống jenkins (jenkinsfile) bằng Plugin GitHub Org?


142

Làm thế nào tôi có thể kích hoạt xây dựng một công việc khác từ bên trong Jenkinsfile?

Tôi giả định rằng công việc này là một kho lưu trữ khác trong cùng một tổ chức github , một kho lưu trữ đã có tệp Jenkins của riêng nó.

Tôi cũng muốn làm điều này chỉ khi tên chi nhánh là chủ, vì nó không có ý nghĩa để kích hoạt các bản dựng hạ lưu của bất kỳ chi nhánh địa phương nào.

Cập nhật:

stage 'test-downstream'
node {
     def job = build job: 'some-downtream-job-name'
}

Tuy nhiên, khi thực thi tôi gặp lỗi

Không tìm thấy công việc được tham số hóa có tên là some-dowream-job-name

Tôi chắc chắn rằng công việc này tồn tại trong jenkins và nằm trong cùng thư mục tổ chức như công việc hiện tại. Đó là một công việc khác có riêng của nó Jenkinsfile.

Xin lưu ý rằng câu hỏi này dành riêng cho Plugin Tổ chức GitHub tự động tạo và duy trì công việc cho từng kho lưu trữ và chi nhánh từ Tổ chức GitHub của bạn.

Câu trả lời:


131

Trước hết, thật lãng phí một vị trí thực thi để bọc buildbước node. Giám đốc điều hành ngược dòng của bạn sẽ chỉ ngồi không có lý do.

Thứ hai, từ một dự án multibranch, bạn có thể sử dụng biến môi trường BRANCH_NAMEđể tạo logic có điều kiện trên nhánh hiện tại.

Thứ ba, jobtham số này có một tên công việc tuyệt đối hoặc tương đối. Nếu bạn đặt tên mà không có bất kỳ tiêu chuẩn đường dẫn nào, điều đó sẽ đề cập đến một công việc khác trong cùng thư mục, trong trường hợp của một dự án multibranch sẽ có nghĩa là một nhánh khác của cùng một kho lưu trữ.

Vì vậy, những gì bạn có nghĩa là để viết có lẽ

if (env.BRANCH_NAME == 'master') {
    build '../other-repo/master'
}

2
Cảm ơn! Nếu bằng bất kỳ thay đổi nào, bạn cũng biết cách kích hoạt bản dựng này mà không cần đợi nó hoàn thành thì nó sẽ rất tuyệt vời :)
sorin

48
Kiểm tra Trình tạo Snippet :build job: '../other-repo/master', wait: false
Jesse Glick

3
Có cách nào để gọi bước xây dựng với tên nhánh động không? Một cái gì đó giống như build job: '../other-repo/$BRANCH_NAME'nơi $BRANCH_NAMEđược các biến môi trường Jenkins liên quan đến chi nhánh chạy dự án Multibranch?
msteppe91

2
nếu ${BRANCH_NAME}có sẵn như là một biến môi trường, thay thế chuỗi đơn giản sẽ làm. Chỉ cần chắc chắn để chuyển sang "từ 'để trích dẫn chuỗi của bạn. ví dụbuild job: "../other-repo/${BRANCH_NAME}"
Cinderhaze

2
Liên kết API cho build job: jenkins.io/doc/pipeline/steps/pipeline-build-step
Katie

123

Ngoài các câu trả lời được đề cập ở trên: Tôi muốn bắt đầu một công việc với một tham số đơn giản được chuyển đến một đường ống thứ hai và tìm thấy câu trả lời trên https://dzone.com/refcardz/continupt-delivery-with-jenkins-workflow .

Vì vậy, tôi đã sử dụng:

stage ('Starting ART job') {
    build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]]
}

11
Công việc xây dựng phải được nhúng trong một bước (bắt đầu với phiên bản 0.5)
rhoerbe

5
Là BUILD_NUMBER của công việc Jenkins được gọi bởi buildlệnh được trả lại? Làm cách nào để truy cập BUILD_NUMBER trong một trong các giai đoạn sau? Bất cứ ai biết lệnh đó được ghi lại ở đâu?
user909481

4
Đó là build job: 'freestyle', parameters: [ string(name: 'param1', value:'test_param'), string(name:'dummy', value: "${index}")]ngày nay, từ jenkins.io/doc/pipeline/examples/#jobs-in-parallel
BartBiczBoży

Nhưng làm thế nào để sử dụng các tham số này được truyền trong công việc thứ 2
Nhẹ nhàng

2
Điều thú vị là build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]] không làm việc cho tôi nhưng: build job: 'RunArtInTest', parameters: [string(name: 'systemname', value: "${VALUE}")] đã làm việc
Alberto C

24

Lệnh buildtrong đường ống là có để kích hoạt các công việc khác trong jenkins.

Ví dụ về github

Công việc phải tồn tại ở Jenkins và có thể được tham số hóa. Đối với chi nhánh, tôi đoán bạn có thể đọc nó từ git


3
Tôi đã thử thêm build job: 'jobnamenhưng tôi gặp lỗi này No parameterized job named jobname foundvà tôi có thể đảm bảo với bạn rằng có một công việc có tên này ở cùng cấp độ trong thư mục tổ chức.
sorin

1
Vâng, có một công việc, nhưng công việc đó không được tham số hóa. Tôi đang cố gắng hiểu làm thế nào để tham số hóa một công việc được tạo bởi plugin tổ chức GitHub
yiwen

6
Định dạng tên công việc là:build job: "${ORGANISATION_NAME}/${REPO_NAME}/master"
Sahil Ahuja

2
@SahilAhuja Điều đó hoàn toàn tùy ý và dựa trên bố cục Jenkins của bạn và nếu bạn muốn sử dụng một đường dẫn tuyệt đối, bạn cần bắt đầu với a /. Đường dẫn tương đối là tốt; vấn đề của sorin có lẽ là việc gọi công việc buildlà một công việc đa chức năng, có nghĩa là một con đường như jobnamesẽ cố gắng xây dựng chi nhánh jobnamecủa cùng một công việc; nó cần phải được ../jobname/branchnamethay thế
Michael Mrozek 26/03/18

Điều này hoạt động tốt, nhưng điều gì xảy ra nếu chi nhánh được chỉ định không tồn tại?
Jaime Alcántara Arnela

17

Bạn có thể sử dụng build jobbước từ Jenkins Pipeline (Yêu cầu tối thiểu Jenkins: 2.130).

Đây là API đầy đủ cho buildbước: https://jenkins.io/doc/pipeline/steps/pipeline-build-step/

Cách sử dụng build:

  • job: Tên của một công việc hạ nguồn để xây dựng. Có thể là một công việc Pipeline khác, nhưng phổ biến hơn là tự do hoặc dự án khác.
    • Sử dụng một tên đơn giản nếu công việc nằm trong cùng thư mục với công việc Đường ống ngược dòng này;
    • Thay vào đó, bạn có thể sử dụng các đường dẫn tương đối như../sister-folder/downstream
    • Hoặc bạn có thể sử dụng các đường dẫn tuyệt đối như/top-level-folder/nested-folder/downstream

Kích hoạt một công việc khác bằng cách sử dụng một nhánh làm param

Tại công ty của tôi, nhiều chi nhánh của chúng tôi bao gồm "/". Bạn phải thay thế bất kỳ trường hợp nào của "/" bằng "% 2F" (như nó xuất hiện trong URL của công việc).

Trong ví dụ này, chúng tôi đang sử dụng các đường dẫn tương đối

    stage('Trigger Branch Build') {
        steps {
            script {
                    echo "Triggering job for branch ${env.BRANCH_NAME}"
                    BRANCH_TO_TAG=env.BRANCH_NAME.replace("/","%2F")
                    build job: "../my-relative-job/${BRANCH_TO_TAG}", wait: false
            }
        }
    }

Kích hoạt một công việc khác bằng cách sử dụng số bản dựng làm thông số

build job: 'your-job-name', 
    parameters: [
        string(name: 'passed_build_number_param', value: String.valueOf(BUILD_NUMBER)),
        string(name: 'complex_param', value: 'prefix-' + String.valueOf(BUILD_NUMBER))
    ]

Kích hoạt nhiều công việc song song

Nguồn: https://jenkins.io/blog/2017/01/19/converting-conditable-to-pipeline/

Thông tin thêm về Parallel tại đây: https://jenkins.io/doc/book/pipeline/syntax/#abul

    stage ('Trigger Builds In Parallel') {
        steps {
            // Freestyle build trigger calls a list of jobs
            // Pipeline build() step only calls one job
            // To run all three jobs in parallel, we use "parallel" step
            // https://jenkins.io/doc/pipeline/examples/#jobs-in-parallel
            parallel (
                linux: {
                    build job: 'full-build-linux', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
                },
                mac: {
                    build job: 'full-build-mac', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
                },
                windows: {
                    build job: 'full-build-windows', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
                },
                failFast: false)
        }
    }

Hay cách khác:

    stage('Build A and B') {
            failFast true
            parallel {
                stage('Build A') {
                    steps {
                            build job: "/project/A/${env.BRANCH}", wait: true
                    }
                }
                stage('Build B') {
                    steps {
                            build job: "/project/B/${env.BRANCH}", wait: true
                    }
                }
            }
    }

3

Sử dụng plugin xây dựng công việc cho tác vụ đó để kích hoạt các công việc khác từ tệp jenkins. Bạn có thể thêm nhiều loại logic vào thực thi của mình, chẳng hạn như các tùy chọn song song, nút và tác nhân và các bước để kích hoạt các công việc bên ngoài. Tôi đã đưa ra một số ví dụ sách nấu ăn dễ đọc cho điều đó.

1. ví dụ để kích hoạt công việc bên ngoài từ tệp jenkins với ví dụ có điều kiện:

if (env.BRANCH_NAME == 'master') {
  build job:'exactJobName' , parameters:[
    string(name: 'keyNameOfParam1',value: 'valueOfParam1')
    booleanParam(name: 'keyNameOfParam2',value:'valueOfParam2')
 ]
}

2.example kích hoạt nhiều công việc từ tệp jenkins với ví dụ có điều kiện:

 def jobs =[
    'job1Title'{
    if (env.BRANCH_NAME == 'master') {
      build job:'exactJobName' , parameters:[
        string(name: 'keyNameOfParam1',value: 'valueNameOfParam1')
        booleanParam(name: 'keyNameOfParam2',value:'valueNameOfParam2')
     ]
    }
},
    'job2Title'{
    if (env.GIT_COMMIT == 'someCommitHashToPerformAdditionalTest') {
      build job:'exactJobName' , parameters:[
        string(name: 'keyNameOfParam3',value: 'valueOfParam3')
        booleanParam(name: 'keyNameOfParam4',value:'valueNameOfParam4')
        booleanParam(name: 'keyNameOfParam5',value:'valueNameOfParam5')
     ]
    }
}

Nhưng làm thế nào để nhận và sử dụng các tham số trong công việc thứ 2
Nhẹ nhàng

2
@Dịu dàng. Bạn có thể truy cập thông qua paramater dưới dạng params.systemname
Pankaj Shinde
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.