2013-07-02 31 views
6

Tôi có yêu cầu từ nhóm phát triển để thiết lập hệ thống xây dựng để mỗi bản dựng sẽ có số bản dựng duy nhất cho tất cả các nhánh.Làm cách nào để thuyết phục jenkins chia sẻ số bản dựng cho một số công việc?

Bản dựng được tạo bởi jenkins sử dụng công việc cho từng chi nhánh.

Có một plugin Jenkins rằng có thể thiết lập các buildnumber tiếp theo cho một công việc nhưng đây là kinda vô dụng trong ít nhất hai lý do:

  • nó sẽ thiết lập số lượng xây dựng cho một công việc duy nhất và bạn không thể biết tất cả làm thế nào để thiết lập nó cho tất cả các chi nhánh vì họ có thể được loại bỏ hoặc thêm vào bất cứ lúc nào
  • nó không thiết lập nó cho xây dựng hiện hành

làm thế nào để chúng ta có được những con số xây dựng: chúng tôi làm thực hiện cuộc gọi HTTP với tên chi nhánh và số sửa đổi trong git/mercurial. Dựa trên điều này, máy chủ tập trung sẽ cho chúng ta một số xây dựng như một phản ứng. Nếu bạn gọi nó hai lần với cùng các tham số, bạn sẽ nhận được cùng một phản hồi (hành vi mong muốn).

Bây giờ, làm thế nào chúng ta có thể tinh chỉnh jenkins để sử dụng cùng một số xây dựng như chúng ta? Rõ ràng tôi có thể sử dụng số xây dựng được trả lại từ tập lệnh, nhưng số công việc sẽ khác và tôi nghi ngờ jenkins sẽ biết rằng tôi đã chạm vào biến BUILD_NUMBER bên trong tập lệnh của mình.

Chủ yếu, những gì tôi cần là một số loại kịch bản lệnh bắt đầu công việc mà tôi có thể chạy, kịch bản sẽ chạy trước khi số bản dựng được gán cho công việc.

Trả lời

0

Khám phá Build Name Setter PluginDescription Setter Plugin. Chúng sử dụng RegEx và/hoặc các biến để thiết lập các thuộc tính xây dựng sau khi xây dựng, dựa trên kết quả xây dựng.

Ví dụ, bạn có thể sử dụng RegEx này:

At revision (\d)+ 

và chuỗi thay thế này

Build number is ${BUILD_NUMBER}; Subversion revision \1 

bạn có thể thiết lập mô tả của người xây dựng.

Nếu chuỗi thay thế của bạn không chứa gì đó duy nhất cho bản dựng (ví dụ: ${BUILD_NUMBER}), tôi đề nghị bạn không thay đổi tên xây dựng vì có thể có vài bản dựng cho cùng một bản sửa đổi kho.


Bây giờ, làm thế nào để có được một số công việc được xây dựng trên cùng một bản sửa đổi kho lưu trữ là một điều khác! Có vẻ như parameterized builds có thể được bắt đầu qua HTTP POST. Vì vậy, bạn có thể có một công việc được kích hoạt bởi thay đổi SCM và sử dụng công cụ HTTP (ví dụ: wget) để lên lịch cho mỗi công việc được tham số hóa.

14

Bạn có thể sử dụng Environment Injector Plugin để đánh giá tập lệnh Groovy trước khi chạy. Tuy nhiên, tôi có hầu như cùng yêu cầu, tuy nhiên đối với tôi, chỉ những công việc có cùng tên job_prefix_ trong tên của họ chia sẻ cùng một số duy nhất nextBuildNumber (nói cách khác, các công việc khác với job_prefix2_ trong tên của họ có chung khác nhau nextBuildNumber).

Trong phần Evaluated Groovy Script, xin vui lòng sử dụng:

import jenkins.model.* 

// Access to the Jenkins instance 
jenkins_instance = jenkins.model.Jenkins.instance 

// Select jobs that match. 
job_name = "^job_prefix_.*" 
allItems = jenkins_instance.items 
chosenJobs = allItems.findAll{ job -> job.name.matches(job_name) } 

// Get the max 
build_number = chosenJobs.collect{ it -> it.nextBuildNumber }.max() 

// Increase next build number 
currentJob.nextBuildNumber = build_number + 1 

// and use it. 
def map = [BUILD_NUMBER: build_number] 
return map 
+0

Cảm ơn rất nhiều! Đã làm cho tôi. Trong trường hợp của tôi, tôi đang sử dụng plugin thư mục CloudBees, điều đó đã giúp tôi giải quyết vấn đề tìm kiếm theo mẫu. Thay vào đó tôi đã sử dụng phương thức getItems() và loại bỏ công việc hiện tại bằng cách sử dụng "currentJob" :-). –

8

tôi mất dnozay's answer, nhưng ít nhất là cho Jenkins 1,586, điều này không làm việc khá tốt cho tôi. Dưới đây là những vấn đề tôi gặp phải:

  1. Số bản dựng trong lịch sử xây dựng Jenkins khác với BUILD_NUMBER biến tôi sử dụng trong công việc. Dường như cài đặt BUILD_NUMBER tại thời điểm này, ngay cả khi Override Build Parameters được đặt, đã quá muộn.
  2. Số bản dựng tiếp theo sẽ là hiện tại + 2, thay vì hiện tại + 1. Tôi nghĩ rằng đó là vì nextBuildNumber được tăng lên cả bởi tập lệnh này và Jenkins.

Vì vậy, đây là một phiên bản cập nhật dựa trên câu trả lời của mình:

import jenkins.model.* 

// Access to the Jenkins instance 
jenkinsInstance = jenkins.model.Jenkins.instance 

// Select jobs that match. 
jobName = "^job_prefix.*" 
allItems = jenkinsInstance.items 
chosenJobs = allItems.findAll{ job -> job.name.matches(jobName) } 

// Get the max 
buildNumber = chosenJobs.collect{ job -> job.nextBuildNumber }.max() 

// Increase next build number for all matching jobs 
chosenJobs.each{ job -> job.updateNextBuildNumber(buildNumber) } 

return [:] 

Một lần nữa, tất cả các tín dụng đi vào dnzay cho kịch bản gốc.

Chỉnh sửa: khi tạo công việc mới, ứng dụng cũ phải được chạy trước khi chạy công việc mới, nếu không chúng sẽ bắt đầu bằng 1.

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