Các mô-đun con Git không cập nhật trong bản dựng Jenkins


85

Tôi có một mô-đun con trong một dự án ở Jenkins. Tôi đã bật cài đặt nâng cao để cập nhật đệ quy các mô-đun con.

Khi tôi chạy bản dựng, tôi thấy rằng không gian làm việc có các tệp từ mô-đun con. Vấn đề là, nó dường như là bản sửa đổi đầu tiên của mô-đun con. Khi tôi đẩy các thay đổi (kho lưu trữ trên GitHub) Jenkins dường như không cập nhật submodule để có được những thay đổi phù hợp. Có ai đã từng nhìn thấy điều này?

Câu trả lời:


96

Lưu ý rằng plugin Jenkins Git 2.0 sẽ có "hành vi mô-đun con nâng cao", điều này sẽ đảm bảo cập nhật đúng cách cho các mô-đun con:

git 2.0

Như nhận xét của vikramvi:

Advanced sub-modules behavior> " Path of the reference repo to use during submodule update" đối với trường này, thêm url git mô-đun con.

Con đường


Owen B đề cập trong các bình luận :

Đối với vấn đề xác thực, hiện có tùy chọn "Sử dụng thông tin đăng nhập từ điều khiển từ xa mặc định của kho lưu trữ mẹ"

Đã thấy ở đây trong JENKINS-20941 :

https://issues.jenkins-ci.org/secure/attachment/33245/Screen%20Shot%202016-07-08%20at%2010.09.17.png


6
Nhưng bằng cách nào? Bạn cũng có thể cung cấp các bước chi tiết, các tùy chọn để chọn? Cảm ơn.
zavié

8
@ zavié Tôi nghĩ bạn nên chọn "Hành vi mô-đun con nâng cao" rồi chọn hộp kiểm "Cập nhật đệ quy mô-đun con" sẽ xuất hiện và nhấp vào Lưu.
KajMagnus

9
Điều này không hoàn toàn hiệu quả nếu bạn đang sử dụng một kho lưu trữ riêng tư.
Erik

1
Làm việc một cách hoàn hảo cho tôi với một repo tin
davegallant

3
Điều này chỉ hoạt động nếu repo của bạn không yêu cầu xác thực để đọc mô-đun con git của bạn. Lỗi Jenkins.
Ernst Kuschke

33

Điều này được đề cập trong tài liệu Git Plugin trên trang Jenkins trong phần: Mô-đun con đệ quy .

đoạn trích

Plugin GIT hỗ trợ các kho chứa với các mô-đun con mà chính các mô-đun con đó. Tuy nhiên, điều này phải được bật: trong Cấu hình công việc -> Quản lý mã nguồn phần , Git -> Nút nâng cao (trong Nhánh để xây dựng) -> Cập nhật đệ quy mô-đun con .

Thí dụ

Từ màn hình cấu hình công việc của bạn, trong phần Quản lý mã nguồn, kéo nút Thêm xuống, chọn "Hành vi mô-đun phụ nâng cao".

   s1

                                 s2

Sau đó chọn "Cập nhật đệ quy mô-đun con":

   s3


1
cảm ơn bạn nhưng điều này không hiệu quả vào thời điểm tôi đã thử điều này (gần 2 năm trước)
Ben

@Ben - OK, tôi vừa thử cái này và nó phù hợp với tôi. Có thể liên quan đến các phiên bản của bạn.
slm

1
Điều này chỉ hoạt động nếu repo của bạn không yêu cầu xác thực để đọc mô-đun con git của bạn.
Ernst Kuschke

@ErnstKuschke - Tôi tin rằng Jenkins có thể được cấp một khóa SSH để nó cũng có thể tương tác với các repo yêu cầu xác thực.
slm

29

Bạn có biết rằng kho lưu trữ Git của bạn luôn đề cập đến một bản sửa đổi cụ thể của một mô-đun con không? Jenkins sẽ không tự động thay đổi bản sửa đổi.

Nếu bạn muốn sử dụng một bản sửa đổi mới hơn của mô-đun con, bạn phải thực hiện việc này trong kho lưu trữ Git cục bộ của mình:

cd submoduledir
git pull
cd ..
git add submoduledir
git commit -m 'Updated to latest revision of submoduledir'
git push # Go and watch Jenkins build with the new revision of the submodule

Khi bạn làm như vậy, Jenkins sẽ kiểm tra bản sửa đổi chính xác của mô-đun con trong quá trình xây dựng. Jenkins không tự mình quyết định nên sử dụng bản sửa đổi nào của mô-đun con. Đây là sự khác biệt cơ bản giữa mô-đun con Git và mô-đun bên ngoài SVN.

Bạn có thể muốn đọc một tài liệu tham khảo tốt về các mô-đun con, ví dụ: http://progit.org/book/ch6-6.html .


1
Liên kết ProGit mà @sti cung cấp đã lỗi thời. Tôi nghĩ rằng đây là tương đương với hiện tại https://git-scm.com/book/en/v2/Git-Tools-Submodules
Stevel

Liên kết bị hỏng (liên quan đến HTTPS?) - "502 Bad Gateway" .
Peter Mortensen

17

Cuối cùng tình cờ tìm ra một cách để làm điều này và nó đơn giản.

Vấn đề:

Bản sao ban đầu với thông tin đăng nhập hoạt động tốt nhưng submodulebản sao sau đó không thành công với thông tin đăng nhập không chính xác.

  1. Tự động sao chép mô-đun phụ nâng cao Source Code Management >> Additional Behaviours >> Advanced sub-modules behaviours:: dẫn đến lỗi thông tin xác thực.
  2. git submodule update --inittrong Execute Shellphần này cũng không thành công với lỗi thông tin xác thực.

Giải pháp:

Tôi đang sử dụng jenkins-1.574.

  1. Đánh dấu vào Build Environment >> SSH Agentô.
  2. Chọn thông tin đăng nhập chính xác (có thể giống như đã chọn trong Source Code Managementphần
  3. Cập nhật các mô-đun con trong Execute Shellphần

    git submodule sync
    git submodule update --init --recursive
    

Đây là ảnh chụp màn hìnhnhập mô tả hình ảnh ở đây


3
Không còn hộp kiểm như vậy nữa.
adi518

11

Có vẻ như tôi đã tìm thấy một giải pháp:

Tôi đã thêm một bước xây dựng để thực hiện các lệnh shell sau:

git submodule foreach git checkout master
git submodule foreach git pull

Sau khi thực hiện các lệnh đó, bạn có thể cần phải cam kết trong siêu dự án, vì HEAD trong các mô-đun con của bạn sẽ được cập nhật.
slacy,

Xin chào Ben, bạn có thể chia sẻ giải pháp của mình chi tiết hơn một chút không? Tôi muốn làm điều tương tự. Ngoài ra, chỉ để xác nhận, giải pháp của bạn sẽ git submodule cập nhật các mô-đun con của một dự án vào WORKSPACE, phải không?
Kim Stacks

không có nhiều chi tiết hơn thế. Tôi vừa thêm 2 dòng đó vào quy trình xây dựng của mình và nó luôn kéo phiên bản mới nhất của mô-đun con.
Ben

10
Như @sti đã nói trong một phản hồi khác ở đây, có vẻ như bạn đang cố gắng sử dụng các mô-đun con Git như các mô-đun bên ngoài SVN. Thay vì thêm các lệnh này vào Jenkins, tốt hơn là bạn nên cam kết các phiên bản mô-đun con thích hợp vào kho Git chính của bạn. Jenkins sau đó sẽ luôn kiểm tra cùng một phiên bản của các mô-đun con khi xây dựng một phiên bản cụ thể của dự án của bạn. Các bản dựng có thể tái tạo là một điều tốt.
Cody Casterline

4
@ben Tôi đã xem qua lệnh này mà bạn có thể tìm thấy hữu ích hơn, esepcially nếu bạn không sử dụng các chi nhánh chủ trong submodule git submodule update --init --recursive
Corey Scott

7

Nếu bạn đang sử dụng mô-đun Jenkins Git, bạn có thể đặt nó thành "Xóa không gian làm việc trước khi xây dựng", bằng cách này, nó sẽ luôn nhận được đúng mô-đun phụ.


2

Tôi đang sử dụng pipelining có tập lệnh với plugin thanh toán. Nếu bạn muốn các mô-đun con giống như trong kho lưu trữ của mình, chỉ cần tắt tùy chọn trackingSubmodules như sau:

checkout([$class: 'GitSCM', branches: [[name: '*/develop']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: true, recursiveSubmodules: false, reference: '', trackingSubmodules: false]], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '[myCredentials]', url: 'https://git.myRepo.git']]])
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.