2013-02-20 29 views
6

Chúng tôi có một công việc Jenkins xây dựng mọi chi nhánh ngoại trừ tổng thể khi có các cam kết mới. Hành vi này có thể được cấu hình thông qua 'lựa chọn chiến lược: nghịch đảo' của git plugin để nó lắng nghe mọi chi nhánh ngoại trừ một nhánh cụ thể.Làm thế nào để lấy tên nhánh git được xây dựng bởi Jenkins khi sử dụng chiến lược lựa chọn nhánh nghịch đảo?

Chức năng này rất độc đáo. Nhưng vấn đề là biến môi trường GIT_BRANCH luôn đề cập đến nhánh bị loại trừ ('origin/master' trong trường hợp của chúng ta). Làm thế nào để truy vấn nhánh thực tế được xây dựng bởi Jenkins?

Hiện tại tôi đang sử dụng giải pháp thay thế mà tôi grep nó từ tạo ra changelog.xml. Nhưng đôi khi, changelog.xml trống khi Jenkins chuyển đổi giữa các nhánh khác nhau và tôi không thể tìm thấy thông tin này. Cách lấy/truy vấn chính xác từ Jenkins nhánh thực sự được xây dựng là gì?

Trả lời

2

Bởi vì git không bao giờ kiểm tra ra một chi nhánh chỉ là một cam kết trực tiếp bạn phải làm như sau:

Để có được sha của kiểm tra ra cam kết:

git rev-parse HEAD 

Để có được tất cả các chi nhánh có hành được dưới:

git branch -a --contains SHA 

các đưa ra của lệnh thứ hai có thể trông như thế này

master 
remotes/origin/HEAD -> origin/master 
remotes/origin/develop 
2

Có vẻ như đó là lỗi của Jenkins? Bạn có thể lấy trong xây dựng kịch bản của bạn tên của chi nhánh kiểm tra ra với điều này:

git symbolic-ref -q --short HEAD 

Trên thực tế Jenkins có bản sao làm việc trong TRỤ tách ra, đó là lý do git branch lợi nhuận "không có chi nhánh". Xem this quite detailed answer để đào vào hòa giải với giữa một HEAD tách rời và một chi nhánh.

+1

Cảm ơn Charles. Điều đó làm việc trong một workarea git bình thường nhưng không phải trong một không gian làm việc jenkins, nơi lệnh trả về không có gì. Chạy 'git branch' trong không gian làm việc jenkins cho '* (không có nhánh)'. Có lẽ nhánh được chọn phải được truy vấn từ Jenkins theo một cách nào đó vì nó có vẻ như thực hiện thanh toán dựa trên cam kết-id trong nhánh đã chọn. – harish

+0

Có, Jenkins hoạt động trong HEAD tách rời. xem chỉnh sửa của tôi và câu trả lời được liên kết. Tôi chắc rằng một trong các lệnh được liên kết trong nó sẽ hoạt động. – CharlesB

+0

Lệnh này hoạt động trong CMD, nhưng không phải trong Jenkins của tôi, tại sao? C: \ Tools \ Jenkins \ jobs \ DevOps \ jobs \ Test-GitHub \ workspace> git --version git phiên bản 2.7.0.windows.1 C: \ Tools \ Jenkins \ jobs \ DevOps \ jobs \ Test-GitHub \ không gian làm việc> git symbolic-ref -q --short HEAD C: \ Tools \ Jenkins \ jobs \ DevOps \ jobs \ Test-GitHub \ workspace > thoát 1 Xây dựng bước 'Thực thi lệnh batch của Windows' được đánh dấu là không thành công Hoàn thành: FAILURE –

17

Tôi sử dụng thành công cú pháp sau:

GIT_BRANCH=`git rev-parse HEAD | git branch -a --contains | grep remotes | sed s/.*remotes.origin.//` 
+1

Tuyệt vời! Đối với bất kỳ ai khác, tôi phải điều chỉnh một chút điều này thành: 'git rev-parse HEAD | git branch -a --contains | điều khiển từ xa grep | sed -e 's /.* remotes.origin .//' ' đối với OS X –

+0

Với chủ đã kiểm tra trong một repo Tôi hiện đang làm việc với, kết quả này trong 'HEAD -> origin/master \ nmaster' ('\ n' thực sự là một dòng mới trong kết quả), điều này rõ ràng là sai. –

+4

Lưu ý rằng --contains cũng sẽ bao gồm các chi nhánh mới hơn mã đã kiểm tra hiện tại. Điều này làm việc tốt hơn cho tôi: 'git show-ref | grep $ (git rev-parse HEAD) | điều khiển từ xa grep | grep -v HEAD | sed -e 's /.* remotes.origin .//' 'Và có thể đường ống này thành' head -n1' nếu bạn muốn nó tự ý chọn tên nhánh đầu tiên nếu có nhiều nhánh trỏ đến commit này. –

0

Tôi không thể tin như thế nào khó khăn này là. Tôi cũng đang làm điều này cho Jenkins. Tôi đã giải mã cho giải pháp của Piotr Kuczynski:

branch=`git rev-parse HEAD | git branch -a --contains | grep remotes | sed s/.*remotes.origin.//` 
branch=`echo $branch | awk '{print $NF}'` 

Vì đôi khi, như Matt Kantor đã chỉ ra, giải pháp của Piotr mang lại rất nhiều rác. Nhưng từ cuối cùng trong mẩu tin nhắn đó dường như luôn đúng. Lưu ý rằng giải pháp này chỉ hoạt động nếu ref bạn đang sử dụng tương ứng chính xác với một nhánh tồn tại trên remote (do đó các nhánh cục bộ sẽ không hoạt động).

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