Làm cách nào tôi có thể tạo Jenkins CI với kích hoạt Git khi đẩy thành chủ?


205

Tôi đang cố gắng thiết lập Jenkins-ci cho một dự án bằng GitHub. Tôi đã thiết lập Jenkins với các plugin thích hợp. Tôi muốn Jenkins chỉ chạy các kịch bản xây dựng bất cứ khi nào ai đó trong dự án đẩy lên thành thạo. Cho đến nay tôi đã có thể thiết lập nó để một bản dựng sẽ được kích hoạt bất cứ lúc nào bất cứ ai đẩy đến bất cứ đâu, nhưng nó quá rộng. Tôi đã thực hiện điều này với các móc dịch vụ sau nhận trên Git.

Tôi đã đọc wiki Jenkins, và một vài hướng dẫn, nhưng chi tiết cụ thể này còn thiếu ... có phải là một cái gì đó để bỏ phiếu không? Hoặc công việc nên được thực hiện ở phía Git, để Git chỉ kích hoạt Jenkins khi masterđược thay đổi?


3
Tác giả ban đầu của Jenkins, Kohsuke Kawaguchi, mô tả cách thực hiện thông báo đẩy từ kho lưu trữ bằng cách sử dụng plugin Git plugin Git plugin 1.1,14. Xem kohsuke.org/2011/12/01/ trộm
GeraldScott

Câu trả lời:


190

Như đã lưu ý bởi gezzed trong bình luận của mình, trong khi đó, có một giải pháp tốt (được mô tả trong Polling must die: kích hoạt Jenkins xây dựng từ hook Git ):

  • Đặt trình kích hoạt xây dựng của công việc Jenkins thành Poll SCM , nhưng không chỉ định lịch trình.

  • Tạo trình kích hoạt nhận sau GitHub để thông báo cho URL

    http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>?token=<get token from git to build remotely>
    
  • Điều này sẽ kích hoạt tất cả các bản dựng thăm dò kho Git được chỉ định.

  • Tuy nhiên, bỏ phiếu thực sự kiểm tra xem có bất cứ điều gì đã được đẩy đến chi nhánh được sử dụng.

Nó hoạt động hoàn hảo.


1
Điều này cũng rất hiệu quả đối với tôi, bạn có thể sử dụng cách tiếp cận tương tự với bản cài đặt địa phương: cweiske.de/ voltbuch / ggiousious
Justin Smith

4
Hoạt động với hook POST của Bitbucket (không phải Jenkins). Để chỉ định thông tin xác thực, bạn có thể sử dụng user: password@my.ci.server/git/notifyCommit? Url = ... làm URL.
loevborg

Nó có thể được cấu hình để jenkins chỉ xây dựng các lib / dự án bị ảnh hưởng bởi lần đẩy mới nhất vào repo không? Không xây dựng lại toàn bộ chi nhánh?
Croolman

Bạn có thể làm rõ phần này? "Tạo trình kích hoạt nhận sau github để thông báo cho URL"
dewwwald

Tôi cho rằng github phải có khả năng tiếp cận cá thể Jenkins của bạn, nghĩa là nó phải được truy cập công khai. Có thể làm cho điều này hoạt động với một máy chủ Jenkins không công khai?
A. Murray

33

Kể từ phiên bản 0.5, plugin GitHub cho Jenkins có thể kích hoạt bản dựng khi một thay đổi được đẩy lên GitHub .


23
@asveikau - Câu hỏi ban đầu là về github.
docwhat

Đó không phải là một giải pháp tốt vì nó kích hoạt việc xây dựng bất kể nhánh nào được đẩy.
Shannon

Trên thực tế, có vẻ như nó tuân theo trình xác định chi nhánh trong cài đặt plugin git nếu bạn bật "Poll SCM" (không cần lịch trình).
Shannon

1
Mặc dù điều đó có thể đúng, nhưng nó vẫn kích hoạt bản dựng không chính xác khi không có không gian làm việc tồn tại ("Không gian làm việc ngoại tuyến. Lên lịch cho bản dựng mới để có một không gian làm việc. (Nonex hiện_workspace) Xong. Đã tìm thấy 0 ms Thay đổi được tìm thấy"). Xem thêm vấn đề.jenkins-ci.org/browse/JENKINS-18079
Shannon

Các GitHub Plugin liệt kê các Git Plugin là một phụ thuộc . Các wiki nói "khi tạo một công việc, xác định URL dưới 'dự án Github' và chọn Git chỉ định URL dưới 'Quản lý Source Code'. Nó nói 'cò này chỉ đá Git Plugin bỏ phiếu nội bộ algo cho mỗi sự kiện đến với repo phù hợp.' Tôi nghĩ rằng điều đó có nghĩa là Poll SCM giống như trong câu trả lời được chấp nhận, nhưng nó có các tùy chọn để tự động thiết lập webhook và một vài tính năng khác.
dosentmatter

9

Thay vì kích hoạt các bản dựng từ xa, hãy thay đổi cấu hình dự án Jenkins của bạn để kích hoạt các bản dựng bằng cách bỏ phiếu.

Jenkins có thể thăm dò ý kiến ​​dựa trên một nội bộ cố định hoặc bằng một URL. Cái sau là những gì bạn muốn bỏ qua các bản dựng nếu không có thay đổi cho nhánh đó. Các chi tiết chính xác có trong tài liệu . Về cơ bản, bạn chỉ cần kiểm tra tùy chọn "Thăm dò ý kiến ​​SCM", để trống phần lịch biểu và đặt URL từ xa để nhấn JENKINS_URL / công việc / tên / bỏ phiếu.

Một gotcha nếu bạn có môi trường Jenkins được bảo mật thì không giống như vậy /build, /pollingURL yêu cầu xác thực. Các hướng dẫn ở đây có chi tiết. Ví dụ: tôi có một cái móc nhận sau GitHub username:apiToken@JENKIS_URL/job/name/polling.


8

Đối với GitLab , sử dụng các bước sau:

  1. Chuyển đến cài đặt của dự án của bạn → Móc web
  2. Nhập URL "Xây dựng ngay" từ dự án Jenkins của bạn dưới dạng URL Sự kiện Đẩy:

    http://server.com/jenkins/job/project_name/build?delay=0sec ví dụ

  3. Nhấp Add Web Hookvà sau đótest hook

Sau đó, bất cứ khi nào bạn cam kết với kho lưu trữ, web hook sẽ được kích hoạt và bản dựng được tạo. Hãy chắc chắn đặt không gian làm việc Jenkins của bạn để delete workspace before each buildbạn có được một bản sao mới của mã mới.


2
Làm thế nào để bạn giải quyết vấn đề về câu hỏi liên quan đến việc xây dựng chỉ khi đẩy vào nhánh chính?
Custodio

4

Không liên quan đến Git, nhưng dưới đây tôi sẽ giúp chi tiết về cấu hình công việc của Jenkins với Mercurial. Nó có thể giúp những người khác với một vấn đề tương tự.

  1. Cài đặt Trình kích hoạt URL
  2. Đến trang cấu hình công việc và chọn Poll SCMtùy chọn. Đặt giá trị thành* * * * *
  3. Kiểm tra tùy chọn : [URLTrigger] - Poll with a URL. Bây giờ bạn có thể chọn một số tùy chọn như thay đổi ngày sửa đổi, nội dung URL, v.v.
  4. Trong các tùy chọn, chọn thay đổi nội dung URL, chọn tùy chọn đầu tiên - Monitor change of content
  5. Lưu các thay đổi.

Bây giờ, kích hoạt một số thay đổi đối với kho lưu trữ Mercurial bằng một số đăng ký kiểm tra.

Xem rằng công việc Jenkins hiện đang chạy bằng cách phát hiện các thay đổi SCM. Khi bản dựng được chạy do thay đổi Mercurial, sau đó, bạn sẽ thấy văn bản Started by an SCM change. Khác, người dùng tự khởi động nó.


3

Tôi hy vọng điều này có ích: Cách kích hoạt bản dựng Jenkins trên Git commit

Đó chỉ là vấn đề sử dụng curl để kích hoạt công việc Jenkins bằng cách sử dụng móc Git do Git cung cấp.

Lệnh curl http://localhost:8080/job/someJob/build?delay=0seccó thể chạy một công việc Jenkins, someJobtên của công việc Jenkins.

Tìm kiếm thư mục "hook" trong thư mục .git ẩn của bạn. Đổi tên tệp "post-commit.sample" thành "post-commit". Mở nó bằng Notepad, xóa dòng ": nothing" và dán lệnh trên vào nó.

Đó là nó. Bất cứ khi nào bạn thực hiện một cam kết, Git sẽ kích hoạt các lệnh sau cam kết được xác định trong tệp.


Lúc đầu tôi đã nhầm lẫn với nhận xét của bạn bởi vì, tôi nghĩ rằng tôi phải thay đổi "công việc" trong url ở trên thành tên công việc. Tôi cũng bối rối vì khi tôi nhấn "Mục mới" trong Jenkins, tôi đã thiết lập "Dự án" không phải là một công việc, vì vậy khi bạn giới thiệu "someJob" ở trên, tôi không biết đó là tên dự án của mình. Cuối cùng tôi đã tìm ra url tôi cần: localhost: 8078 / job / codecept% 20tests / build trong đó "codecept% 20tests" là tên dự án của tôi. Cảm ơn giải pháp của bạn
Paul Preibisch

1
Cảm ơn Paul. Tôi đã cập nhật bài viết trên blog với một ghi chú bổ sung, đề cập đến giải pháp của bạn. "% 20" sẽ đặc biệt hữu ích cho những người khác.
Nav

3

Tích hợp liên tục với Jenkins, sau khi mã được đẩy vào kho lưu trữ từ lệnh / GUI Git:

  1. Tạo một công việc trong Jenkins chỉ với tên công việc và chọn loại tự do dự án. Nhấn vào đây OK. Trang tiếp theo không thêm bất cứ điều gì - chỉ cần nhấp vào Save.
  2. Chuyển đến kho Git cục bộ của bạn nơi bạn có mã nguồn và điều hướng đến .git/hooksthư mục.
  3. Các hooksthư mục chứa vài file. Kiểm tra "cam kết sau". Nếu không có, hãy tạo một tệp, "post-commit" mà không có phần mở rộng tệp:

    C:\work\test\\.git\hooks\post-commit
    
  4. Chỉnh sửa tệp "sau cam kết" bằng lệnh bên dưới. Hãy chắc chắn rằng nó có trong thư mục hook mã nguồn cục bộ của bạn.

    curl -u userName:apiToken -X POST http://localhost:8080/jenkins/job/jobName/build?token=apiToken
    

    Thí dụ:

    curl -u admin:f1c55b3a07bb2b69b9dd549e96898384 -X POST http://localhost:8080/jenkins/job/Gitcommittest/build?token=f1c55b3a07bb2b69b9dd549e96898384
    

    5.

    userName: Tên người dùng Jenkins

    jobName: Tên công việc của bản dựng

    apiToken: Để nhận mã thông báo API, hãy truy cập trang người dùng Jenkins của bạn (trên cùng bên phải trong giao diện). Nó có sẵn trong menu "Cấu hình" ở bên trái của trang: "Hiển thị mã thông báo API"

  5. Thay đổi mã nguồn của bạn và cam kết mã vào kho lưu trữ.

  6. Công việc của bạn http://localhost:8080/jenkins/job/Gitcommittest/, nên được xây dựng.


3

Bạn cần chỉ định chi nhánh. Theo mặc định, nó lắng nghe bất cứ điều gì. Xem bài đăng trên blog Hudson: Git và Maven plugin .


Gần đây tôi đã thiết lập Jenkins tại nơi làm việc để lấy các thay đổi từ git trên một nhánh được chỉ định. Hoạt động tốt. +1
Greg K

Tôi đã thiết lập cài đặt đó là tốt. Điều tôi nhận thấy là Jenkins được thông báo về từng cú đẩy github và phản ứng với nó, nhưng chỉ chạy các bước xây dựng nếu chủ chi nhánh đã thay đổi. Vì vậy, chúng tôi nhận được rất nhiều báo cáo xây dựng giả mạo có nội dung "Không thay đổi". Bạn đang quan sát hành vi này là tốt?
Ziggy

Câu hỏi ban đầu là về cách giải quyết trình kích hoạt rộng và không cần thiết (kích hoạt khi bất kỳ ai đẩy vào bất kỳ nhánh nào) được định cấu hình trong câu trả lời của bạn. Nếu bạn có 5 công việc jenkin với cùng một cấu hình ngoại trừ công việc đầu tiên lắng nghe nhánh chính, nhánh thứ hai, nhánh FeatureX thứ ba, v.v., khi bạn chỉ đẩy sang nhánh FeatureX, tất cả các công việc jenkins sẽ được kích hoạt dẫn đến công việc quá tải với các bản dựng rất chậm.
geoom

2

Plugin kích hoạt Webhook chung có thể được cấu hình với các bộ lọc để đạt được điều này.

Khi được cấu hình với

  • Một biến có tên refvà biểu thức$.ref .
  • Một bộ lọc với văn bản $refvà biểu thức lọc như thế nào ^refs/heads/master$.

Sau đó, công việc đó sẽ kích hoạt cho mỗi lần đẩy tới master . Không bỏ phiếu.

Bạn có thể muốn nhiều giá trị hơn từ webhook để thực sự xây dựng. Chỉ cần thêm nhiều biến hơn, với JSONPath, để chọn những gì bạn cần.

Có một số trường hợp sử dụng ở đây: https://github.com/jenkinsci/generic-webhook-trigger-plugin/tree/master/src/test/resource/org/jenkinsci/plugins/gwt/bdd


Là gì "Achi" ?
Peter Mortensen

Đó là / là một lỗi chính tả.
Tomas Bjerre

Làm thế nào để bạn lấy $ GITCOMMIT trong Jenkins, nó dường như luôn là null với một webhook. Sau đó không thể gửi lại trạng thái để nói thành công hay thất bại.
dùng3520245

1

Trong tổ chức hiện tại của tôi, chúng tôi không làm điều này một cách tổng thể mà thực hiện nó trên cả phát triển và phát hành / chi nhánh (chúng tôi đang sử dụng Git Flow), để tạo các bản dựng ảnh chụp nhanh.

Vì chúng tôi đang sử dụng một đường ống đa nhánh, chúng tôi thực hiện điều này trong Jenkinsfile với cú pháp khi {} ...

stage {
    when { 
        expression { 
            branch 'develop'
        }
    }
}

Đây là chi tiết trong bài đăng trên blog này: https://jenkins.io/blog/2017/01/19/converting-conditable-to-pipeline/#longer-pipeline


1

Câu trả lời trên là chính xác nhưng tôi đang giải quyết cho họ những người mới đến đây vì sự đơn giản của họ

đặc biệt là để thiết lập kích hoạt xây dựng cho đường ống:

Hãy xem xét bạn có hai nhánh Github: 1.master, 2.dev và Jenkinsfile (nơi viết tập lệnh đường ống) và các tệp khác có sẵn trên mỗi nhánh

Cấu hình dự án Pipeline mới (cho chi nhánh dev)

## 1. Tích hợp mã với git-plugin và phương pháp dựa trên cron Điều kiện tiên quyết git plugin nên được cài đặt và định cấu hình nó với tên và email của bạn

  1. Phần chung.Kiểm tra kiểm tra - 'Dự án này được tham số hóa' và thêm Tên-SBRANCH Giá trị mặc định-'refs / điều khiển từ xa / nguồn gốc / dev '
  2. Xây dựng phần kích hoạt "Kiểm tra hộp kiểm - 'Thăm dò SCM' và lên lịch theo nhu cầu kiểm tra các cam kết, ví dụ: '* / 1 * * * *' để kiểm tra mỗi phút
  3. Phần định nghĩa đường ống. Chọn - Tập lệnh đường ống từ SCM,> chọn git Wap> addRep repository URL,> thêm thông tin xác thực git> chọn nâng cao> thêm Tên- nguồn gốc, RefSpec- '+ refs / Heads / dev: refs / remotes / origin / dev '(dev là chi nhánh github) -> Chi nhánh cần xây dựng - $ {SBRANCH} (Tên tham số từ điểm đầu tiên của ref) -> Đường dẫn tập lệnh>> Jenkinsfile -> Bỏ chọn Lightcheckout
  4. Áp dụng trò chơi> lưu

## 2. Tích hợp mã: phương pháp github-plugin và webhook Điều kiện tiên quyết Nên cài đặt plugin Github và máy chủ Github phải được cấu hình, nên kiểm tra kết nối nếu không xem xét cấu hình sau

Định cấu hình plugin Github với tài khoản trên Jenkins

Phần GitHub Thêm máy chủ Github nếu không có URL API: https://api.github.com Thông tin xác thực: Thêm văn bản bí mật (Nhấp vào nút thêm: chọn nhập văn bản bí mật) với giá trị Mã thông báo truy cập cá nhân (Tạo tài khoản từ tài khoản Github của bạn -> nhà phát triển cài đặt Wap> mã thông báo truy cập cá nhân> thêm mã thông báo> kiểm tra phạm vi> sao chép mã thông báo) Kiểm tra kết nối bằng cách kiểm tra> Kiểm tra xem nó có được kết nối với tài khoản Github của bạn hay không Kiểm tra hộp kiểm với phần Quản lý trước thông tin trước đây cho 'bí mật được chia sẻ'

Thêm webhook nếu không được thêm vào kho lưu trữ của bạn bằng cách

  1. Chuyển đến cài đặt Kho lưu trữ Github -> thêm webhook Thẻ> thêm URL
    http: // Public_IP: Jenkins_PORT / github-webhook /
  2. Hoặc nếu bạn không có Public_IP, hãy sử dụng ngrok . Cài đặt, xác thực, nhận IP công cộng từ lệnh ./ngrok http 80 (sử dụng jenkins_port của bạn) sau đó thêm webhook -> thêm URL http: // Ngrok_IP / github-webhook /
  3. Kiểm tra nó bằng cách phân phối tải trọng từ trang webhook và kiểm tra xem bạn có nhận được 200 trạng thái hay không.

Nếu bạn có plugin yêu cầu Github Pull, hãy cấu hình nó với URL Jenkins đã xuất bản.

  1. Phần chung.Kiểm tra kiểm tra - 'Dự án Github' thêm URL dự án - (liên kết github kết thúc bằng '.git /')
  2. Phần chung.Kiểm tra kiểm tra - 'Dự án này được tham số hóa' và thêm Tên-SBRANCH Giá trị mặc định-'refs / điều khiển từ xa / nguồn gốc / dev '
  3. Xây dựng hộp kiểm kích hoạt.section.Check - 'Trình kích hoạt móc GitHub để bỏ phiếu GITScm'
  4. Phần def'n đường ống: Chọn - Tập lệnh đường ống từ SCM,> chọn git,> addRep repository URL,> thêm thông tin xác thực git> chọn nâng cao -> thêm Tên- nguồn gốc, RefSpec- '+ refs / Heads / dev: refs / remotes / origin / dev '(dev là chi nhánh github) -> Chi nhánh cần xây dựng - $ {SBRANCH} (Tên tham số từ điểm 1.st) -> Đường dẫn tập tin> Jenkinsfile>> Bỏ chọn Lightcheckout
  5. Áp dụng trò chơi> lưu


0

Giải pháp của tôi cho máy chủ git cục bộ: chuyển đến thư mục hook máy chủ git cục bộ của bạn, bỏ qua update.sample hiện tại và tạo một tệp mới có tên theo nghĩa đen là "update", chẳng hạn như:

gituser@me:~/project.git/hooks$ pwd
/home/gituser/project.git/hooks
gituser@me:~/project.git/hooks$ cat update
#!/bin/sh
echo "XXX from  update file"
curl -u admin:11f778f9f2c4d1e237d60f479974e3dae9 -X POST http://localhost:8080/job/job4_pullsrc_buildcontainer/build?token=11f778f9f2c4d1e237d60f479974e3dae9

exit 0
gituser@me:~/project.git/hooks$ 

Câu lệnh echo sẽ được hiển thị dưới kết quả đẩy git của bạn, mã thông báo có thể được lấy từ cấu hình công việc jenkins của bạn, duyệt để tìm nó. Nếu tệp "cập nhật" không được gọi, hãy thử một số tệp khác có cùng tên mà không có "mẫu" mở rộng.

Đó là tất cả những gì bạn cần

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.