2016-08-01 16 views
19

Tôi đang cân nhắc sử dụng tập lệnh đường ống Jenkins gần đây, một câu hỏi là tôi không tìm ra cách thông minh để tạo mã utils có thể sử dụng lại được, tưởng tượng, tôi có chức năng chung helloworld được sử dụng bởi rất nhiều công việc đường ống, vì vậy tôi hy vọng tạo ra một utils.jar có thể tiêm nó vào đường dẫn lớp công việc.Tạo kịch bản đường ống jenkins có thể sử dụng lại

tôi nhận thấy Jenkins có một khái niệm tương tự với global library, nhưng mối quan tâm của tôi về plugin này:

Vì nó là một plugin, vì vậy chúng tôi cần phải cài đặt/nâng cấp nó thông qua Jenkins cắm quản lý, sau đó nó có thể yêu cầu khởi động lại để áp dụng thay đổi, đây không phải là những gì tôi muốn thấy vì các utils có thể thay đổi, hãy thêm luôn, chúng tôi hy vọng nó có thể có sẵn ngay lập tức.

Thứ hai, đó là jenkins chính thức được chia sẻ lib, tôi không muốn (Hoặc họ sẽ không áp dụng chúng tôi) đặt mã riêng vào repo jenkins.

Bạn có ý tưởng hay không?

+0

Tôi không nhận được _Secondly .._ câu của bạn. – StephenKing

+0

Các câu trả lời ở đây phải rõ ràng nhưng blog này có thể rất hữu ích: https://lvthillo.com/reusable-jenkins-pipeline-for-maven-jobs/ – DenCowboy

Trả lời

26

Shared Libraries (docs) cho phép bạn tạo có thể truy cập được đối với tất cả tập lệnh đường ống của bạn. Bạn không cần phải xây dựng một plugin cho điều đó và bạn không phải khởi động lại Jenkins.

Ví dụ: đây là my librarythis a Jenkinsfile gọi hàm phổ biến này.


EDIT (tháng 2 năm 2017): Thư viện có thể được truy cập thông qua máy chủ Git nội Jenkins', hoặc triển khai thông qua các phương tiện khác (ví dụ qua Chef) vào thư mục workflow-lib/ trong thư mục home Jenkins của người dùng. (vẫn có thể, nhưng rất không vui).

Thư viện toàn cầu có thể được cấu hình thông qua các phương tiện sau:

  • chú thích @Library('github.com/...') trong Jenkinsfile trỏ đến URL của repo thư viện chia sẻ.
  • được định cấu hình ở cấp thư mục của công việc Jenkins.
  • được định cấu hình trong cấu hình Jenkins làm thư viện chung, với lợi thế là mã là tin cậy, tức là, không phụ thuộc vào bảo mật tập lệnh.

Kết hợp phương thức đầu tiên và cuối cùng sẽ là thư viện được chia sẻ không được tải rõ ràng, sau đó chỉ được yêu cầu sử dụng tên trong Jenkinsfile: @Library('mysharedlib').

+0

Hah, giải thích rất tốt, nếu đây là trường hợp, sau đó đó chính là điều tôi muốn. – Tim

+0

Đó là trường hợp :-) Bạn có thể có một cái nhìn tại tất cả các repos trong https://github.com/TYPO3-cookbooks/, tất cả đều sử dụng 'Jenkinsfile' s chỉ chứa các cuộc gọi đến đường ống. – StephenKing

+0

Tôi sẽ làm điều đó cho chắc chắn. – Tim

1

Đây là giải pháp mà chúng tôi đang sử dụng để tái sử dụng mã Jenkinsfile:

node { 

    curl_cmd = "curl -H 'Accept: application/vnd.github.v3.raw' -H 'Authorization: token ${env.GITHUB_TOKEN}' https://raw.githubusercontent.com/example/foobar/master/shared/Jenkinsfile > Jenkinsfile.t 
    sh "${curl_cmd}" 
    load 'Jenkinsfile.tmp' 

} 

Tôi có thể là một chút xấu xí nhưng nó hoạt động realiably và thêm vào đó nó cũng cho phép chúng ta chèn một số mã cụ thể của kho lưu trữ trước hoặc sau mã được chia sẻ.

+0

Vì kịch bản 'Jenkinsfile.tmp' của bạn dường như được kiểm tra với một repo Git, bạn có thể chỉ cần sử dụng bước kiểm tra git/scm cơ bản để tải kịch bản thay vì thực hiện curl thủ công. – Pom12

+0

Nếu điều này sẽ cho phép tôi để kiểm tra một tập tin duy nhất từ ​​kho lưu trữ nó sẽ là tuyệt vời. Nhưng nếu điều này sẽ kiểm tra toàn bộ kho lưu trữ nó rõ ràng sẽ không được một cái gì đó để được mong muốn như repo này có thể được thực sự lớn. – sorin

+0

Trong trường hợp đó, một khả năng khác có thể là kiểm tra gói tin Git 'Jenkinsfile.tmp' của bạn như một công việc Jenkins tự do mà thường xuyên bỏ phiếu trên repo Git của bạn, và sau đó tải tệp Jenkins của bạn từ vùng làm việc khác này. – Pom12

7

Tùy thuộc vào tần suất bạn định sử dụng lại mã của mình, bạn cũng có thể tải một hàm (hoặc một tập hợp các hàm) như một phần của một đường ống khác.

{ 
    // ...your pipeline code... 

    git 'http://urlToYourGit/projectContainingYourScript' 
    pipeline = load 'global-functions.groovy' 
    pipeline.helloworld() // Call one of your defined function 

    // ...some other pipeline code... 
} 

sức giải pháp này có vẻ một chút cồng kềnh so với StephenKing của một người nhưng những gì tôi thích về giải pháp này là chức năng toàn cầu của tôi đều cam kết Git và ai cũng có thể dễ dàng thay đổi chúng mà không cần (gần như) bất kỳ kiến ​​thức của Jenkins , chỉ là vấn đề cơ bản của Groovy.

Trong tập lệnh Groovy, bạn cần load, hãy đảm bảo bạn thêm return this vào cuối. Điều này sẽ cho phép bạn thực hiện cuộc gọi sau. Nếu không, khi bạn đặt pipeline = load global-functions.groovy, biến sẽ được đặt thành null.

+0

Chúng tôi đang cập nhật thư mục '$ JENKINS_HOME/workflow-lib /' thông qua Chef tự động từ Github. Bạn có thể làm điều đó cũng thông qua công việc Cron. Tôi cũng không thích máy chủ giả nội bộ của Jenkins. – StephenKing

+1

nhớ thêm 'trả lại kết quả này' ở cuối tập lệnh được chia sẻ của bạn. Xem câu trả lời này http://stackoverflow.com/questions/37800195/how-do-you-load-a-groovy-file-and-execute-it –

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