2016-09-12 22 views
11

Tôi đã chuyển một vài công việc Jenkins cũ sang công việc mới bằng cách sử dụng pipeline feature để có thể tích hợp cấu hình Jenkins trong kho lưu trữ git. Nó hoạt động tốt nhưng tôi tự hỏi liệu có cách nào để giảm số lần thanh toán xảy ra trong khi xây dựng không.Đường ống Jenkins: có thể tránh nhiều lần thanh toán không?

Cài đặt

  • Tôi có một công việc multibranch Jenkins có liên quan đến kho git của tôi
  • Tôi có một Jenkinsfile trong kho git của tôi

    #!groovy 
    node { 
    
        stage 'Checkout' 
        checkout scm 
    
        // build project 
        stage 'Build' 
        ... 
    } 
    

Vấn đề

Khi tôi đẩy để Branche xa tôi BRANCH_1, công việc Jenkins multibranch được kích hoạt và sự hiểu biết của tôi là các bước sau đây xảy ra:

  • công việc multibranch làm cho một git fetch cho việc lập chỉ mục chi nhánh và gây nên các công việc tương ứng với chi nhánh từ xa của tôi: BRANCH_1_job
  • BRANCH_1_job làm cho một git checkout để lấy Jenkinsfile của chi nhánh được kích hoạt
  • các Jenkinsfile được thực hiện và làm cho một checkout scm chính nó. Nếu tôi không làm điều đó, tôi không thể xây dựng dự án của mình vì không có nguồn.

Vì vậy, để xây dựng chi nhánh của mình, tôi kết thúc bằng một git fetch và hai git checkout.

Câu hỏi

  • Tôi hiểu được quá trình một cách chính xác? Hay tôi đã bỏ lỡ điều gì đó?
  • Có cách nào để giảm số lượng git checkout không? Khi tôi kiểm tra số official examples, tất cả đều thực hiện một bước kiểm tra như bước đầu tiên. Cá nhân tôi nghĩ rằng tôi không phải làm điều đó bởi vì công việc jenkins đã phải trả tiền để lấy Jenkinsfile (vì vậy nguồn của tôi phải ở đây bằng cách nào đó).
  • Bạn không nghĩ rằng các bản kiểm tra nhiều này có thể gây ra hiệu suất kém ngay khi repo git chứa số lượng lớn các lần chỉnh sửa?

Cảm ơn tất cả các bạn

+1

Nếu bạn không đặt trên bằng cách sử dụng đường ống đa chi nhánh, bạn có thể tạo ra một (chi nhánh duy nhất) việc đường ống bình thường với 'Jenkinsfile' trong Jenkins mà thực hiện một kiểm tra đơn và sau đó tải xây dựng của bạn kịch bản thực tế từ kiểm tra ra kho lưu trữ thông qua 'tải 'ci/xây dựng-script-in-bạn-repo.gy''. Thật không may, bạn sẽ mất các công việc riêng biệt cho từng chi nhánh trong trường hợp đó. – Carsten

+1

Tôi biết ý của bạn là gì nhưng tôi muốn: - giữ cấu hình ci của tôi trong kho lưu trữ của tôi chứ không phải trong cấu hình công việc jenkins của tôi - sử dụng các tính năng đa mẫu đẹp (như một công việc cho mỗi chi nhánh) chi nhánh đang thất bại) – Bastien

Trả lời

5

Với git đồng bằng Jenkins đã làm hai Thanh toán: một để có được những Jenkinsfile biết những gì để thực hiện trong công việc, và sau đó một thanh toán của nội dung kho thực tế cho mục đích xây dựng. Về mặt kỹ thuật Jenkins chỉ cần nạp một đơn Jenkinsfile từ repo, nhưng git không cho phép thanh toán của một tệp đơn lẻ. Do đó, không thể tránh thanh toán kép bằng git đơn giản bằng cách sử dụng plugin multibranch.

Nếu bạn lưu trữ git trên Bitbucket hoặc GitHub sau đó bạn tránh được thanh toán gấp đôi bằng cách sử dụng cụ thể của họ Jenkins plugin thay vì plugin multibranch.

Xem trang web plugin của Jenkins cho các tiện ích BitbucketGitHub plugin tương ứng.

Những plugin sử dụng API REST nhà cung cấp của Git tương ứng để tải các tập tin Jenkins duy nhất. Vì vậy, bạn về mặt kỹ thuật vẫn có một thanh toán kép, nhưng đầu tiên là một cuộc gọi REST đơn giản để tải xuống một tệp duy nhất, thay vì thực hiện kiểm tra toàn bộ git gốc của toàn bộ kho lưu trữ.

+0

Cảm ơn lời giải thích. Tôi sẽ kiểm tra plugin Jenkins Bitbucket – Bastien

+0

Có cách nào để sử dụng plugin github mà không quét toàn bộ tổ chức không? Tôi muốn hưởng lợi từ số lần kiểm tra ít hơn, nhưng tôi không thể có mọi repo trong tổ chức được quét ... –

+0

Đúng là git không cho phép thanh toán một tệp. Tuy nhiên người ta có thể sử dụng kho lưu trữ git để "thanh toán" một tệp duy nhất. Tôi đang sử dụng một cái gì đó như thế này để kiểm tra một tập tin duy nhất trong đường ống Jenkins của tôi: sh "git archive --remote = ssh: // $ {gitUser} @ $ {gitServer}/$ {view}/$ {} someProject .git $ {env.BRANCH} - $ {specFile} | tar xf -" – DJViking

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