2013-09-04 39 views
7

tôi đã tự hỏi những gì là cách tốt nhất để tạo ra một cái móc pre-push (trong một repo git) mà hiện những điều sau đây:Tạo pre-push móc để lint/test

  • Run JSHint/JSLint
  • Run Unit và functional tests
  • Nếu tất cả mọi thứ là ok sau đó chấp nhận cập nhật
  • Nếu không từ chối bản cập nhật
+2

Github (dịch vụ lưu trữ git) không cho phép bạn thêm móc tùy ý vào các bản sao lưu trữ trên máy chủ của bạn. Thiết lập các móc trên phiên bản * cục bộ * của kho lưu trữ của bạn chắc chắn là có thể, nhưng sau đó câu hỏi không phải là Github cụ thể :) – Gareth

+2

Vì vậy, cách duy nhất để thêm móc là sử dụng những cái được xác định trước bởi [GitHub] (http : //developer.github.com/v3/repos/hooks/#create-a-hook)? –

+0

Trước tiên, hãy lưu ý rằng việc đẩy trước được chạy trên máy đang đẩy và điều đó sẽ không bao giờ là Github. Sự kiện 'push' mà Github cung cấp một Web Hook cho thực sự được kích hoạt như là một post-receive, như nó nói ở đầu trang mà bạn đã liên kết tới. Vì vậy, nó chỉ thực sự có thể được sử dụng cho các thông báo – Gareth

Trả lời

2

Bạn có thể sử dụng một Git trước cam kết nối để làm cái này. Tôi đã thiết lập các móc trước khi cam kết để kiểm tra các câu lệnh gỡ lỗi, v.v.

Các móc bên khách hàng như thế này thuộc về thư mục .git/hooks. Nhưng kể từ khi bạn không thể cam kết bất cứ điều gì trong .git repo vào kiểm soát phiên bản bạn đang loại bị mắc kẹt.

Điều bạn cần làm là giữ lệnh trình bao kiểm tra tính chính xác trong một số thư mục trong repo git của bạn, nói thư mục tools cấp cao nhất.

Sau đó, "chỉ" nói với mọi người để cài đặt nó thông qua:

chmod u+x tools/precommit-checks.sh 

ln -s $PWD/tools/precommit-checks.sh .git/hooks/pre-commit 

và, giả định rằng tất cả mọi người cài đặt nó, bạn có thể đã kiểm tra như bạn yêu cầu.

Có lẽ một cách tốt hơn là chỉ cần nắm bắt phía máy chủ này: có một số loại máy chủ tích hợp liên tục kéo các cam kết mới nhất từ ​​repo Github của bạn và kiểm tra codebase.

Không, nó sẽ không cung cấp cho bạn khả năng "từ chối đẩy" mà bạn muốn.

Giả sử bạn đã lưu trữ git repo của mình, cũng có một nếp nhăn khác: Tôi nghĩ móc nhận trước trên máy chủ sẽ treo khách hàng cho đến khi móc mất. (Điều này được ghi lại là đúng cho móc sau khi nhận, vì vậy tôi đoán nó cũng đúng ở đây). Vì vậy, nếu các bài kiểm tra CI mất 2 phút một số nhà phát triển đang gõ git push và chờ 2 phút để bàn điều khiển của họ làm bất cứ điều gì một lần nữa.

Vì vậy, có thể tốt hơn để thực hiện phân tích đẩy bài đăng bằng máy chủ CI hoặc các bài kiểm tra chất lượng khác.

+1

lý do tại sao thực hiện điều này là một cam kết trước thay vì móc trước khi đẩy? Là một móc trước khi đẩy, nó sẽ cung cấp tùy chọn để từ chối một push - http://git-scm.com/docs/githooks#_pre-push –

+0

Nếu trước khi push xảy ra trên máy khách, thì nó có thể là một ý kiến ​​hay. Nếu nó xảy ra trên máy chủ, như tiền nhận, sau đó thấy vấn đề của tôi về nó treo. Nhưng trước khi đẩy có thể là thú vị: Tôi biết tôi làm một loạt các công việc, sau đó thực hiện một loạt các cam kết giải nén các phần khác nhau ra. trước khi đẩy có thể tránh "Có, tôi biết các bài kiểm tra đơn vị thất bại cho cam kết này, gimme một giây". Trừ khi bạn _want_ tính năng đó (aka: nhóm của bạn sử dụng git-bisect rất nhiều, vì vậy các bài kiểm tra đơn vị phải vượt qua) – RyanWilcox

+0

nếu bạn thêm nó vào địa phương của bạn.git/hooks dir, tất cả các hook đều là local. trước khi push sẽ kick ngay trước khi push được cho phép thông qua, và nếu bất cứ kịch bản nào chạy trở lại cái gì khác hơn 0, push sẽ bị hủy bỏ. –