Cách cấu hình hook hook của Git


126

Làm cách nào để kích hoạt bản dựng từ xa từ Jenkins?
Làm thế nào để cấu hình Git post cam kết hook?

Yêu cầu của tôi là bất cứ khi nào thay đổi được thực hiện trong kho Git cho một dự án cụ thể, nó sẽ tự động bắt đầu xây dựng Jenkins cho dự án đó.

Trong phần xây dựng kích hoạt Jenkins tôi đã chọn xây dựng kích hoạt từ xa.
Trong .gitthư mục, thư mục hook nằm ở đó chúng ta phải cấu hình tập tin cam kết bài.
Tôi bối rối làm thế nào để kích hoạt một bản dựng từ đó (tôi biết một số phần chúng ta nên sử dụng lệnh curl).


curl cmbuild.aln.com/jenkins/view/project name/job/myproject/buildwithparameters?Branch=feat-con

Tôi đã đặt lệnh này trong thư mục hook máy chủ git của tôi (post commit hook).
Bất cứ khi nào những thay đổi xảy ra trong kho lưu trữ, nó đang chạy tự động xây dựng.

Tôi muốn kiểm tra các thay đổi trong việc có ít nhất một tệp java có bản dựng nên bắt đầu không.
Giả sử các nhà phát triển chỉ thay đổi các tệp xml hoặc các tệp thuộc tính mà bản dựng không nên bắt đầu.
Cùng với xml, giả sử các .javatệp ở đó bản dựng sẽ bắt đầu.


Tôi đã chỉnh sửa câu trả lời của mình để giải quyết phần thứ hai của câu hỏi của bạn.
VonC

Câu trả lời:


164

Như đã đề cập trong " Bỏ phiếu phải chết: kích hoạt các bản dựng Jenkins từ một git hook ", bạn có thể thông báo cho Jenkins về một cam kết mới:

Với plugin Git mới nhất 1.1,14 (mà tôi mới phát hành ngay bây giờ), giờ đây bạn có thể thực hiện việc này nhiều hơn> dễ dàng bằng cách thực hiện lệnh sau:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>

Điều này sẽ quét tất cả các công việc được định cấu hình để kiểm tra URL được chỉ định và nếu chúng cũng được định cấu hình với bỏ phiếu, nó sẽ ngay lập tức kích hoạt bỏ phiếu (và nếu điều đó tìm thấy một thay đổi có giá trị xây dựng, thì bản dựng sẽ được kích hoạt lần lượt. )

Điều này cho phép một kịch bản giữ nguyên khi các công việc đến và đi trong Jenkins.
Hoặc nếu bạn có nhiều kho lưu trữ trong một ứng dụng máy chủ lưu trữ duy nhất (chẳng hạn như Gitosis), bạn có thể chia sẻ một tập lệnh hook sau nhận với tất cả các kho lưu trữ. Cuối cùng, URL này không yêu cầu xác thực ngay cả đối với Jenkins được bảo mật, vì máy chủ không trực tiếp sử dụng bất cứ thứ gì mà khách hàng đang gửi. Nó chạy bỏ phiếu để xác minh rằng có một thay đổi, trước khi nó thực sự bắt đầu xây dựng.

Như đã đề cập ở đây , đảm bảo sử dụng đúng địa chỉ cho máy chủ Jenkins của bạn:

vì chúng tôi đang chạy Jenkins với tư cách là Máy chủ web độc lập trên cổng 8080, URL nên có mà không có /jenkins, như thế này:

http://jenkins:8080/git/notifyCommit?url=git@gitserver:tools/common.git

Để củng cố điểm cuối cùng đó, ptha thêm vào trong các bình luận :

Nó có thể rõ ràng, nhưng tôi đã có vấn đề với:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>. 

Các url tham số phải phù hợp chính xác những gì bạn có trong Repository URL của việc Jenkins của bạn.
Khi sao chép các ví dụ, tôi đã bỏ giao thức, trong trường hợp của chúng tôi ssh://và nó không hoạt động.


Bạn cũng có thể sử dụng một hook hậu nhận đơn giản như trong " Xây dựng dựa trên đẩy bằng Jenkins và GIT "

#!/bin/bash
/usr/bin/curl --user USERNAME:PASS -s \

http://jenkinsci/job/PROJECTNAME/build?token=1qaz2wsx

Định cấu hình công việc Jenkins của bạn để có thể tạo ra Bộ kích hoạt chế độ từ xa và sử dụng mã xác thực ( 1qaz2wsxtrong ví dụ này).

Tuy nhiên, đây là một kịch bản dành riêng cho dự án và tác giả đề cập đến một cách để khái quát nó.
Giải pháp đầu tiên dễ dàng hơn vì nó không phụ thuộc vào xác thực hoặc một dự án cụ thể.


Tôi muốn kiểm tra thay đổi được đặt xem có ít nhất một tệp java ở đó bản dựng sẽ bắt đầu không.
Giả sử các nhà phát triển chỉ thay đổi các tệp XML hoặc các tệp thuộc tính, thì quá trình xây dựng không nên bắt đầu.

Về cơ bản, tập lệnh xây dựng của bạn có thể:

  • đặt ghi chú 'xây dựng' (xem git notes) vào cuộc gọi đầu tiên
  • trong các cuộc gọi tiếp theo, hãy lấy danh sách các cam kết giữa HEADứng cử viên chi nhánh của bạn để xây dựng và cam kết được tham chiếu bởi git notes'build' ( git show refs/notes/build) : git diff --name-only SHA_build HEAD.
  • kịch bản của bạn có thể phân tích danh sách đó và quyết định xem nó có cần tiếp tục với bản dựng không.
  • trong mọi trường hợp, tạo / di chuyển git notes'' của bạn buildđến HEAD.

Tháng 5 năm 2016: cwhsu chỉ ra trong các bình luận url có thể sau:

bạn chỉ có thể sử dụng curl --user USER:PWD http://JENKINS_SERVER/job/JOB_NAME/build?token=YOUR_TOKENnếu bạn đặt cấu hình kích hoạt trong mục của bạn

http://i.imgur.com/IolrOOj.png


Tháng 6 năm 2016, Polaretto chỉ ra trong các ý kiến :

Tôi muốn thêm rằng chỉ với một chút kịch bản shell, bạn có thể tránh cấu hình url thủ công, đặc biệt nếu bạn có nhiều kho lưu trữ trong một thư mục chung.
Ví dụ: tôi đã sử dụng các mở rộng tham số này để lấy tên repo

repository=${PWD%/hooks}; 
repository=${repository##*/} 

và sau đó sử dụng nó như:

curl $JENKINS_URL/git/notifyCommit?url=$GIT_URL/$repository

hi von như bạn đã nói trong cuộc gọi đầu tiên tôi phải đặt một ghi chú xây dựng. Cuộc gọi đầu tiên của tôi là đọc tệp .java bất cứ khi nào nhà phát triển đẩy các thay đổi vào git repo. tôi mới biết tất cả những điều đó là lý do tại sao tôi hỏi từng bước. xin đừng bận tâm và tôi phải hoàn thành nhiệm vụ này
phanikumar Raja

Điều này rất hữu ích cho tôi. Tôi đã viết hook Git với sự giúp đỡ của chủ đề này. Các bạn ơi!
Kirill Bazarov

Tôi đã phải thêm cuộc gọi curl vào tập tin nhận, điều này không hoàn toàn rõ ràng từ câu trả lời này. Dù sao cũng rất hữu ích!
Magnilex

1
@IgorGanapolsky trong thư mục hook của repo trần của bạn đang nhận cam kết và phải gọi jenkins:yourRepo.git/hooks/post-receive
VonC

2
Nó có thể rõ ràng, nhưng tôi đã có vấn đề với : curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>. Các url tham số phải phù hợp chính xác những gì bạn có trong Repository URL của việc Jenkins của bạn. Khi sao chép các ví dụ tôi đã bỏ giao thức, trong trường hợp của chúng tôi là ssh: // và nó không hoạt động.
ptha 16/07/2015

17

Hy vọng điều này sẽ giúp: http://nrecacht.blogspot.in/2014/02/how-to-trigger-jenkins-build-on-git.html

Đó 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=0sec

có thể điều hành một công việc Jenkins, someJobtên của công việc Jenkins.

Tìm kiếm hooksthư mục trong thư mục .git ẩn của bạn. Đổi tên post-commit.sampletập tin thành post-commit. Mở nó bằng Notepad, xóa : Nothingdòng 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.


Sau khi thực hiện cam kết từ máy dev, post-receive được gọi, không phải post-commit. Xác minh bằng cách đặt báo cáo nhật ký trong cả hai hook. Có phải tôi đang đọc các tài liệu sai, không nên để nó được cam kết mà được gọi?
Shirish Hirekodi

@Shirish: Đó là lạ. Có lẽ bạn đang làm một cái gì đó khác đi
Nav

Đây là bản dựng thành công khi tôi thực hiện cam kết thay đổi lần cuối nhưng không xây dựng khi tôi cam kết thay đổi ... ???

3

Như câu trả lời trước đã cho thấy một ví dụ về cách hook đầy đủ có thể trông giống như ở đây là mã của hook sau nhận của tôi:

#!/usr/bin/python

import sys
from subprocess import call

if __name__ == '__main__':
    for line in sys.stdin.xreadlines():
        old, new, ref = line.strip().split(' ')
        if ref == 'refs/heads/master':
            print "=============================================="
            print "Pushing to master. Triggering jenkins.        "
            print "=============================================="
            sys.stdout.flush()
            call(["curl", "-sS", "http://jenkinsserver/git/notifyCommit?url=ssh://user@gitserver/var/git/repo.git"])

Trong trường hợp này, tôi kích hoạt các công việc của jenkins chỉ khi đẩy lên thành chủ chứ không phải các nhánh khác.


1
Làm thế nào để bạn buộc tập lệnh Python này vào Jenkins? Hay bạn chỉ chạy nó một lần?
IgorGanapolsky

Jenkins không biết về hook này, phần chính đang tải url notifyCommit trên máy chủ jenkins sẽ kích hoạt một cuộc thăm dò. Tôi nghĩ rằng bỏ phiếu được kích hoạt nhưng không có lịch trình về phía jenkins.
Zitrax

Vậy kịch bản python này nằm ở đâu? Tôi giả sử bạn liên kết nó với cài đặt git của bạn để theo dõi các cam kết ...
IgorGanapolsky

1
Câu trả lời muộn - nhưng vị trí tập lệnh sẽ nằm trên máy chủ git trong hook / post-receive. Đọc lên git hook để tìm hiểu thêm.
Zitrax

3

Tôi muốn thêm vào các câu trả lời ở trên rằng nó trở nên khó khăn hơn một chút nếu ủy quyền của Jenkins được bật.

Sau khi kích hoạt, tôi nhận được một thông báo lỗi rằng người dùng ẩn danh cần có quyền đọc.

Tôi thấy hai giải pháp khả thi:

1: Thay đổi hook của tôi thành:

curl --user name:passwd -s http://domain?token=whatevertokenuhave

2: thiết lập ủy quyền dựa trên dự án.

Các giải pháp trước đây có nhược điểm là tôi phải để lộ mật khẩu của mình trong tệp hook. Không thể chấp nhận trong trường hợp của tôi.

Thứ hai làm việc cho tôi. Trong cài đặt xác thực toàn cầu, tôi phải bật Tổng thể> Đọc cho người dùng ẩn danh. Trong dự án tôi muốn kích hoạt tôi phải kích hoạt Công việc> Xây dựng và Công việc> Đọc cho Ẩn danh.

Đây vẫn chưa phải là một giải pháp hoàn hảo vì bây giờ bạn có thể thấy dự án trong Jenkins mà không cần đăng nhập. Có thể có một giải pháp thậm chí tốt hơn bằng cách sử dụng phương pháp trước đây với đăng nhập http nhưng tôi chưa tìm ra.

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.