Jenkins Git Plugin: Cách tạo thẻ cụ thể?


120

Tôi đang gặp sự cố khi yêu cầu Jenkins tạo một thẻ được chỉ định. Thẻ là một phần của bản dựng được tham số hóa, nhưng tôi không biết làm cách nào để chuyển nó đến plugin git để chỉ tạo thẻ đó. Điều này đã diễn ra trong 3 giờ trong ngày của tôi và tôi đã phải nhận thất bại trước các bậc thầy khi stack tràn.


Ý bạn là điều này khác với stackoverflow.com/questions/7157170/… ? (kết quả thứ ba của google.com/… )
VonC

1
"Điều này đã được chụp 3 giờ trong ngày của tôi" - Tôi không nên lười biếng mà 3 giờ trong ngày của tôi đã không bao gồm tất cả các liên kết Tôi có thể tìm thấy trên google :)
sksamuel

1
Bạn có chắc chắn muốn làm theo cách này không? Bạn có nhận ra rằng việc gắn thẻ trong git không mở rộng quy mô không? Có lẽ bạn chỉ có thể sử dụng một tác vụ "thực thi trình bao" để viết một tập lệnh nhằm kiểm tra thẻ / bản sửa đổi mà bạn thực sự muốn?
mpontillo

Câu trả lời:


222

Tôi đã có thể làm điều đó bằng cách sử dụng tham số "branch to build":

Branch Specifier (blank for default): tags/[tag-name]

Thay thế [tag-name] bằng tên thẻ của bạn.


5
Tôi không biết tại sao cái này không có thêm +1. Mục nhập blog erics-ghi chú đó thật khó hiểu. Điều này là đơn giản và hoạt động tuyệt vời. Cảm ơn!
Cody S

3
Làm việc rất tốt cho tôi. Cảm ơn. Tham số của tôi được đặt tên là RELEASE_TAG vì vậy tôi đã sử dụng thẻ / $ {RELEASE_TAG} làm giá trị cho Thông số nhánh.
Wesley Womack,

3
Không thể làm cho điều này hoạt động. Vì một số lý do không thể kiểm tra thẻ. Tôi nhận được: 'LỖI: Không thể tìm thấy bất kỳ bản sửa đổi nào để tạo. Xác minh kho lưu trữ và cấu hình chi nhánh cho công việc này. ' Tôi chỉ định thẻ / 3.0.1, tôi cũng đã thử * / tags / 3.0.1. Tôi đã xác minh rằng thẻ tồn tại.
lostintranslation

1
Khi tôi thử làm những gì được đề xuất trong câu trả lời này, mọi cuộc thăm dò của kho lưu trữ sẽ kích hoạt một bản dựng. Nhật ký thăm dò git sẽ liên tục hiển thị rằng "Bản sửa đổi được xây dựng lần cuối" là bản sửa đổi của thẻ nhưng "Bản sửa đổi đầu từ xa mới nhất là" là bản sửa đổi mới nhất HEAD. Logic của plugin git dường như so sánh hai bản sửa đổi này, mà trong kho lưu trữ của tôi luôn không bằng nhau và do đó một bản dựng mới luôn được kích hoạt.
Louis

Đây chắc chắn phải là câu trả lời đúng, nó phù hợp với tôi và rất đơn giản. Tôi không thăm dò ý kiến ​​của repo, vì vậy tôi đoán vẫn còn vấn đề đó.
Jeremy

76

Không có câu trả lời nào trong số này là đủ đối với tôi, bằng cách sử dụng Jenkins CI v.1.555, plugin Git Client v.1.6.4 và plugin Git 2.0.4.

Tôi muốn một công việc xây dựng một kho lưu trữ Git cho một thẻ cụ thể, cố định (tức là không tham số hóa). Tôi đã phải đúc kết lại một giải pháp từ các câu trả lời khác nhau cộng với bài đăng blog "xây dựng thẻ Git" được trích dẫn bởi Thilo .

  1. Đảm bảo bạn đẩy thẻ của mình vào kho lưu trữ từ xa với git push --tags
  2. Trong phần "Kho lưu trữ Git" công việc của bạn, dưới tiêu đề "Quản lý mã nguồn", hãy nhấp vào "Nâng cao".
  3. Trong trường cho Refspec, hãy thêm văn bản sau: +refs/tags/*:refs/remotes/origin/tags/*
  4. Trong "Các chi nhánh để xây dựng", "Thông số chi nhánh", hãy đặt */tags/<TAG_TO_BUILD>(thay thế <TAG_TO_BUILD>bằng tên thẻ thực của bạn).

Việc thêm Refspec đối với tôi hóa ra là rất quan trọng. Mặc dù có vẻ như các kho lưu trữ git đang tìm nạp tất cả thông tin từ xa theo mặc định khi tôi để trống, tuy nhiên plugin Git sẽ hoàn toàn không tìm thấy thẻ của tôi. Chỉ khi tôi chỉ định rõ ràng "lấy thẻ từ xa" trong trường Refspec thì plugin Git mới có thể xác định và xây dựng từ thẻ của tôi.

Cập nhật 2014-5-7 : Thật không may, giải pháp này đi kèm với tác dụng phụ không mong muốn cho Jenkins CI (v.1.555) và cơ chế thông báo đẩy của kho lưu trữ Git à la Stash Webhook tới Jenkins : bất kỳ lúc nào bất kỳ nhánh nào trên kho lưu trữ được cập nhật trong một lần đẩy, các công việc xây dựng thẻ cũng sẽ kích hoạt trở lại. Điều này dẫn đến nhiều lần lặp đi lặp lại việc xây dựng lại cùng một thẻ không cần thiết. Tôi đã thử định cấu hình các công việc có và không có tùy chọn "Buộc bỏ phiếu bằng cách sử dụng không gian làm việc" và nó dường như không có tác dụng. Cách duy nhất tôi có thể ngăn Jenkins tạo các bản dựng không cần thiết cho các công việc thẻ là xóa trường Refspec (tức là xóa +refs/tags/*:refs/remotes/origin/tags/*).

Nếu bất kỳ ai tìm thấy một giải pháp tốt hơn, vui lòng chỉnh sửa câu trả lời này với một bản cập nhật. Ví dụ, tôi nghi ngờ rằng có thể điều này sẽ không xảy ra nếu refspec cụ thể +refs/tags/<TAG TO BUILD>:refs/remotes/origin/tags/<TAG TO BUILD>chứ không phải là dấu hoa thị bắt tất cả. Tuy nhiên, hiện tại, giải pháp này đang hiệu quả với chúng tôi, chúng tôi chỉ cần xóa Refspec thừa sau khi công việc thành công.


4
Để "thêm văn bản sau" vào refspec ... nếu trước đây refspec của bạn là. Thì +refs/heads/*:refs/remotes/origin/*bây giờ sẽ như vậy +refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/remotes/origin/tags/*. (Tôi chưa làm việc với refspec nhiều, vì vậy phải mất một số thử nghiệm để biết rằng trường này được phân định bằng không gian.)
driftcatcher

1
Thêm +1 cho giải pháp này. Các giải pháp trước đó cũng không hiệu quả với tôi.
whitespy9

16

Bạn không thể nói Jenkins xây dựng từ tên Ref? Nếu vậy thì đó là

refs/tags/tag-name

Từ tất cả các câu hỏi tôi thấy về Jenkins và Hudson, tôi khuyên bạn nên chuyển sang TeamCity. Tôi không phải chỉnh sửa bất kỳ tệp cấu hình nào để TeamCity hoạt động.


Thực ra bạn không phải là người đầu tiên đề xuất thành phố nhóm. Nó có thực sự tốt hơn nhiều không? Tôi có thể kiểm tra nó ra.
sksamuel

1
@monkjack Tôi đã thử cú pháp tương tự trên một trong các đại diện của mình và nó hoạt động. Bạn có thể liệt kê các thẻ hiện tại của mình không? Bạn có chắc chắn bạn đã đặc biệt đẩy thẻ đó đến repo từ xa vớigit push --tags
Andrew T Finnell

4
Tiến gần hơn. Tôi đã không đẩy các thẻ lên từ xa, nhưng bây giờ tôi đã làm được. Tôi có thể lấy jenkins để xây dựng ngay bây giờ bằng cách sử dụng refs / tags / harpercollins-1.0.16 tuy nhiên nó luôn nhấn mạnh vào việc xây dựng đầu bất kể tôi đã đưa gì vào đó. Tôi đã xác nhận rằng điều khiển từ xa có thẻ (có thể thấy nó trong gitweb) và chụp nhanh thẻ đó xác nhận mọi thứ đều ở trong đó đúng cách.
sksamuel

6
TeamCity là độc quyền, khiến nó trở nên vô dụng.
tiếng lóng

2
Ồ vâng, chuyển từ công cụ miễn phí sang thương mại là một lựa chọn đúng đắn! Khi jetbrains phát minh lại bánh xe và tạo trình theo dõi lỗi mới, bạn có đề xuất với những người khác chuyển từ bugzilla sang đó không?
m1ld

11

Nếu bạn đang sử dụng đường ống Jenkins và muốn kiểm tra một thẻ cụ thể (ví dụ: một TAGthông số của bản dựng của bạn), đây là những gì bạn có thể làm:

stage('Checkout') {
  steps {
    checkout scm: [$class: 'GitSCM', userRemoteConfigs: [[url: 'YOUR_GIT_REPO_URL.git', credentialsId: 'YOUR_GIT_CREDENTIALS_ID' ]], branches: [[name: 'refs/tags/${TAG}']]], poll: false
  }
}

9

Trong Jenkins mới nhất (1.639 trở lên), bạn có thể:

  1. chỉ cần chỉ định tên của thẻ trong trường 'Các nhánh để xây dựng'.
  2. trong một bản dựng được tham số hóa, bạn có thể sử dụng tham số làm biến trong cùng một trường 'Chi nhánh để xây dựng' tức là $ {Branch_to_build}.
  3. bạn có thể cài đặt Plugin tham số Git sẽ cung cấp cho bạn chức năng bằng cách liệt kê tất cả các nhánh và thẻ có sẵn.

1
Thật vậy, chỉ cần nhập một tên thẻ cũng làm việc cho tôi. Mặc dù tài liệu cho việc này trong plugin git vẫn nói cụ thể rằng làm điều đó sẽ không hoạt động: "<tagName>: Điều này không hoạt động vì thẻ sẽ không được nhận dạng là thẻ. Hãy sử dụng refs / tags / <tagName> để thay thế."
Zitrax

Điều này đã làm việc cho tôi trong Jenkins 1.532.3, tôi chỉ chỉ định phiên bản thẻ (ví dụ 1.0.1) trong các nhánh để xây dựng trường.
andre

9

Tôi đã làm một cái gì đó như thế này và nó đã hoạt động:

Source Code Management

 Git    
    Repositories    


 Advance

Name: ref
Refspec : +refs/tags/*:refs/remotes/origin/tags/* 

 Branches to build  
 Branch Specifier (blank for 'any') : v0.9.5.2

nhập mô tả hình ảnh ở đây

Nhật ký Jenkins xác nhận rằng nó đang lấy nguồn từ thẻ

Kiểm tra Bản sửa đổi 0b4d6e810546663e931cccb45640583b596c24b9(v0.9.5.2)


Điều này là tuyệt vời để xây dựng tất cả các thẻ, cảm ơn! Thêm refspecthủ thuật bằng cách nhấp vào nút Nâng cao.
súng trường

9

Tôi đặt trường Advanced-> Refspec thành refs/tags/[your tag name]. Điều này có vẻ đơn giản hơn so với các đề xuất khác cho Refspec, nhưng nó hoạt động tốt đối với tôi.

CẬP NHẬT 23/7/2014 - Trên thực tế, sau khi thử nghiệm thêm, hóa ra điều này không hoạt động như mong đợi. Có vẻ như phiên bản HEAD vẫn đang được kiểm tra. Vui lòng hoàn tác điều này là câu trả lời được chấp nhận. Tôi đã nhận được một giải pháp làm việc bằng cách theo dõi bài đăng từ gotgenes trong chủ đề này (ngày 30 tháng 3). Vấn đề được đề cập trong bài đăng đó về việc kích hoạt các bản dựng không cần thiết không phải là vấn đề đối với tôi, vì công việc của tôi được kích hoạt từ một công việc thượng nguồn, không phải từ thăm dò SCM.

CẬP NHẬT THÁNG 4/2018 - Lưu ý trong phần nhận xét rằng điều này có hiệu quả với một người và đồng ý với tài liệu của Jenkins.


Tôi chỉ muốn lưu ý rằng — bốn năm sau khi câu trả lời này được đăng — việc sử dụng refs/tags/<tagname>là những gì tài liệu Jenkins nói nên được sử dụng và nó hoạt động tốt đối với tôi. Có lẽ plugin đã bị lỗi vào thời điểm đăng bài gốc, nhưng ... tính đến tháng 4 năm 2018, đây câu trả lời chính xác.
evadeflow

Cập nhật nhận xét trước đây của tôi: Trên thực tế, tôi thấy rằng tôi có thể bỏ qua refs/tagstiền tố và chỉ sử dụng <tagname>. YMMV, nhưng ... nó hoạt động tốt cho mục đích của tôi.
evadeflow

3

Tôi đã có thể nhờ Jenkins tạo một thẻ bằng cách đặt Refspec và Branch Specifier như được nêu chi tiết trong bài đăng trên blog này .

Tôi cũng phải đặt Tên kho lưu trữ (thành "origin" trong trường hợp của tôi) để tôi có thể tham chiếu nó trong Refspec (nếu không, nó rõ ràng sẽ sử dụng tên được tạo ngẫu nhiên).


2

Cuối cùng những gì tôi đã làm là:

  • đã tạo một chi nhánh mới jenkins-targetvà có jenkins để theo dõi điều đó
  • hợp nhất từ ​​bất kỳ nhánh hoặc thẻ nào tôi muốn xây dựng trên jenkins-target
  • khi bản dựng hoạt động, các bài kiểm tra vượt qua, v.v., chỉ cần tạo một thẻ từ jenkins-targetnhánh

Tôi không chắc liệu điều này có hiệu quả với tất cả mọi người hay không, dự án của tôi khá nhỏ, không có quá nhiều thẻ và nội dung, nhưng nó rất dễ thực hiện, không phải lộn xộn với refspec và các thông số và nội dung :-)


Tôi thích cách tiếp cận rất đơn giản này.
zochhuana

2

Bạn có thể tạo ngay cả một loại thẻ, chẳng hạn như 1.2.3-alpha43sử dụng các ký tự đại diện:

Refspec: +refs/tags/*:refs/remotes/origin/tags/*

Thông số chi nhánh: origin/tags/1.2.3-alpha*

Bạn cũng có thể đánh dấu vào "Tạo khi thay đổi được đẩy lên GitHub " để kích hoạt quá trình đẩy, nhưng bạn phải thêm hành động "tạo" vào webhook


1

Thêm hai xu của tôi ở đây vì tôi chưa thấy câu trả lời sử dụng tùy chọn "Xây dựng với các tham số" trong Jenkins.

Ở đây tôi đang sử dụng bảng điều khiển trình duyệt Jenkins CI cho dự án starwars_api và tôi đã có thể xây dựng trực tiếp bằng "Xây dựng với tham số" với giá trị refs / tags / tag-name

  1. chọn tùy chọn "xây dựng với các tham số".
  2. thêm giá trị vào hộp dưới dạng "refs / tags / tag_142" (tag_name = tag_142 cho ví dụ của tôi)

xây dựng với tên thẻ giới thiệu

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.