Làm cách nào để tôi có thể tự động triển khai ứng dụng của mình sau một lần đẩy git (GitHub và node.js)?


92

Tôi đã triển khai ứng dụng của mình (node.js) trên VPS (linux). Tôi đang sử dụng git hub làm kho lưu trữ. Làm cách nào tôi có thể triển khai ứng dụng tự động trên git push?


4
có bạn kiểm tra git móc progit.org/book/ch7-3.html , và cũng có thể kiểm tra trên github help.github.com/test-webhooks
Pawel Dubiel

1
Cập nhật cho liên kết progit ở trên: git-scm.com/book/en/Customizing-Git-Git-Hooks
Code Novitiate

Git 2.10 sẽ bổ sung thêm một tính năng thú vị: tùy chọn push stackoverflow.com/a/38770670/6309
VonC

Câu trả lời:


63

Ví dụ trong PHP:

Điều hướng đến github vào kho lưu trữ github của bạn, nhấp vào "Quản trị viên"

nhấp vào tab 'Service Hooks' => 'WebHook URL'

và thêm vào

http://your-domain-name/git_test.php

sau đó tạo git_test.php

<?php 
try
{
  $payload = json_decode($_REQUEST['payload']);
}
catch(Exception $e)
{
  exit(0);
}

//log the request
file_put_contents('logs/github.txt', print_r($payload, TRUE), FILE_APPEND);


if ($payload->ref === 'refs/heads/master')
{
  // path to your site deployment script
  exec('./build.sh');
}

Trong build.sh, bạn sẽ cần đặt các lệnh thông thường để truy xuất trang web của mình từ github


6
Xin chào, cảm ơn bạn rất nhiều. Điều gì ngăn Bob thực thi tập lệnh triển khai của tôi?
Nâng cao

16
@Advanced 1 có thể là các quyền tập lệnh, cờ thực thi ... 2 thêm thẻ đóng trong PHP là một cách làm không tốt.
Pawel Dubiel

3
@Advanced Một kỹ thuật để đảm bảo Bob không thực thi tập lệnh của bạn là đảm bảo rằng yêu cầu ĐĂNG đến từ các máy chủ của Github. Kiểm tra các tiêu đề HTTP mà họ gửi khi đưa ra yêu cầu. Ngoài ra, bạn có thể tạo một URL 'bí mật' không thể đoán được.
jyap

5
@ Purefan Không phải là một trò đùa :) stackoverflow.com/questions/3219383/…
Pawel Dubiel,

1
@ Arius2038 Bạn đã bao giờ nghe nói về "bạn học được điều gì đó mới mỗi ngày"? đây là "cái gì đó mới" của tôi ngày hôm nay. Cám ơn vì đã chia sẻ!
Purefan

23

Đã có một vài đề cập về móc Git dưới dạng câu trả lời / nhận xét, điều này đã hiệu quả với tôi trong quá khứ .. vì vậy đây là công thức của tôi nếu người khác yêu cầu chi tiết cụ thể hơn.

Tôi sử dụng kết hợp git post-accept hooknode-supervisor để triển khai tự động đơn giản (giả sử bạn đang sử dụng kho lưu trữ từ xa git trên máy đó).


Thiết lập Hook sau khi nhận của bạn

Trong kho lưu trữ của bạn: sudo vi hooks/post-receive

Và nó sẽ trông giống như sau:

#!/bin/sh
GIT_WORK_TREE=/home/path/to/your/www
export GIT_WORK_TREE
git checkout -f

Đặt quyền đối với tệp: chmod +x hooks/post-receive

Git sẽ làm mới các tệp trong thư mục ứng dụng của bạn sau khi đẩy đến repo.


Chạy Node với Node-Supervisor

Bạn sẽ cần cài đặt Node-Supervisor trên máy của mình dưới dạng mô-đun nút chung: sudo npm install supervisor -g

Bây giờ chỉ cần chạy ứng dụng nút của bạn với trình giám sát nút và nó sẽ theo dõi các thay đổi đối với các tệp trong thư mục làm việc của bạn:

supervisor /home/path/to/your/www/server.js(ghi chú supervisorthay cho node).


Điều này là tốt, tuy nhiên một điều cần lưu ý là nếu bạn thêm npm mới vào ứng dụng cục bộ của mình, bạn cũng cần thực hiện cài đặt npm cho mô-đun đó trên máy chủ. Nếu không, có thể bạn sẽ gặp sự cố ứng dụng.
k00k

2
Không .. Bất kỳ mô-đun nút nào mà ứng dụng cục bộ của tôi phụ thuộc vào đều được cài đặt trong thư mục con node_modules trong dự án của tôi, đó là repo GIT cục bộ của tôi, do đó khi tôi thêm, cam kết, sau đó đẩy đến máy chủ từ xa, chúng cũng được sao chép.
Wes Johnson

8
Đúng, nhưng điều đó có nghĩa là nếu bất kỳ mô-đun nào trong số đó có mã đã được biên dịch (như mhash chẳng hạn), nó có thể không chạy trên một máy chủ khác có hệ điều hành và / hoặc kiến ​​trúc khác. Sử dụng package.json để theo dõi các phụ thuộc của bạn và sau đó chiến lược triển khai thực hiện npm install -ltrên máy chủ từ xa là một điều thông minh. Điều này tất nhiên có thể được kết hợp với phương pháp của bạn bằng cách sử dụng các móc sau nhận.
k00k

1
và bạn chỉ cần thêm cây công việc Git vào lệnh git checkout trực tiếp: git --work-tree = / var / www / tree --git-dir = / var / repo / deploy.git checkout -f (thay vì tạo biến và xuất khẩu nó trong kịch bản của bạn.
JasonB

Tuy nhiên, câu hỏi là về Github.
Noah

18

Có lẽ rất muộn để trả lời ở đây. Nhưng tôi đã tìm thấy dự án này trên github và dường như làm những gì bạn muốn nhưng theo một cách gọn gàng hơn nhiều.

https://github.com/logsol/Github-Auto-Deploy

Kiểm tra nó ra. Cũng sẽ quan tâm để biết những người khác nghĩ gì về điều này dưới dạng nhận xét và lượt ủng hộ.

Chúc mừng,
S


15
"Có lẽ rất muộn để trả lời ở đây." Không bao giờ quá muộn. :) Bạn thực sự đang đóng góp cho cả cộng đồng (hầu hết chúng ta là googlers; wow, chỉ nhìn vào 20k lượt xem đó!), Chứ không phải anh chàng độc thân đặt câu hỏi "một thời gian trước". Bản thân thời gian là không liên quan: miễn là công nghệ được đề cập có liên quan, câu trả lời của bạn cũng sẽ như vậy. (Cảm ơn vì mẹo, BTW, hãy kiểm tra nó ...)
Sz.

1
cảm ơn vì sự chú ý của bạn! ;) Nó làm việc rất tốt cho tôi tại thời điểm đó. Bây giờ tôi thích sử dụng travis (travis-ci.org), ( bất cứ nơi nào tôi có thể ) để triển khai tự động. @lunakid
Saurabh Kumar

8

Trong một dự án mà tôi hiện đang phát triển, tôi tuân theo các nguyên tắc được đề cập trong cuốn sách tuyệt vời của Jez Humble "Giao hàng liên tục" (rất đáng đọc).

Điều này có nghĩa là tạo một quy trình triển khai bằng cách sử dụng một số dạng máy chủ tích hợp liên tục (Tôi sử dụng phiên bản cộng đồng miễn phí của Thoughtworks của Go ), chịu trách nhiệm kiểm tra mã của bạn trước tiên về chất lượng, độ phức tạp và chạy thử nghiệm đơn vị. Sau đó, nó có thể đi theo một đường ống triển khai dẫn đến việc đẩy đến các máy chủ sản xuất của bạn.

Điều này nghe có vẻ rất phức tạp, nhưng không nhất thiết phải như vậy, và nó làm cho toàn bộ quá trình viết mã và đưa nó vào sản xuất an toàn và không phải lo lắng (không có ngày phát hành đáng sợ!).

Tôi sử dụng đường ống triển khai đầy đủ cho các hệ thống đang hoạt động và một phiên bản cắt giảm cho các mô-đun npm mà tôi viết và cả hai đều chia sẻ cùng một kỹ thuật triển khai bằng 1 cú nhấp chuột.


& +1 khác cho đề xuất sách! Tôi đang phát hiện ra CI không được tiếp cận một cách tình cờ.
Merrick

à, người ta hỏi một câu đơn giản, bạn đưa ra giải pháp đầy đủ :). Tôi phải nói rằng đây là một sự quá mức cần thiết. Nhưng nếu bạn đang sử dụng phân phối liên tục, có thể đây là con đường nên đi.
windmaomao

8

Tôi vừa xuất bản một giải pháp dựa trên nút cho vấn đề của bạn: nút-cd

Nó bao gồm một ứng dụng nút đơn giản chạy trên VPS của bạn, sẽ nhận được Hooks sau khi nhận Github và thực thi một tập lệnh bạn thích (ví dụ: một tập lệnh shell sẽ giết ứng dụng của bạn, git pull và khởi động lại nó).


+1 vì đó là node.js thuần túy, vì vậy người đăng không phải thêm bất cứ thứ gì vào ngăn xếp của họ hoặc sử dụng ngôn ngữ mà họ không cảm thấy thoải mái. Ngoài ra, thực sự độc đáo đặt ra mã
code_monk

3

Đây là một cách triển khai nodeJS đơn giản khác.

Đó là một máy chủ nút rất đơn giản chạy trên tên máy chủ và cổng mà bạn định cấu hình và có thể được thiết lập để xử lý các móc web nhận bài đăng GitHub. Và các hành động pul / thử nghiệm / triển khai thực tế có thể được tùy chỉnh để làm bất cứ điều gì bạn muốn. Trong cách triển khai hiện tại, nó là một lệnh shell được chỉ định nội tuyến trong tập lệnh máy chủ nodeJS. Và cũng có một chương trình bảo mật dựa trên khóa bí mật rất đơn giản.

https://github.com/shyam-habarakada/rscds

Máy chủ dàn của tôi đã được cài đặt và đang chạy nút, vì vậy việc viết lên này rất nhanh chóng và dễ dàng.


" yourdomain.com:8088/… " - THỰC SỰ ?! khóa "bí mật" được chuyển rõ ràng trong URL !!!! Không ai nên sử dụng nó.
Julian Knight

1
Uống một viên aspirin và ổn định đi Julian. Tham số nhận được mã hóa khi sử dụng https.
Gavin

3

Tôi tìm thấy dự án để triển khai dễ dàng sử dụng git.

git-play

Tôi nghĩ đó là cách thích hợp cho bạn.

Kiểm tra nó ra.


2

Nếu bạn muốn có một giải pháp dựa trên python / tornado, tôi đã viết một tập lệnh để xử lý các yêu cầu POST từ Dịch vụ Webhook của Github . Bạn có thể tìm thấy nó tại https://github.com/Akobi/ops/tree/master/autodeploy

Về cơ bản, nó sử dụng tệp cấu hình JSON để liệt kê kho mà bạn mong đợi được đẩy từ đó, lệnh nào bạn muốn chạy khi triển khai và thư mục lệnh phải chạy trong đó. Tất cả những gì bạn phải làm là sửa đổi tệp cấu hình theo ý muốn của bạn và chạy kịch bản!

Ngoài ra, tôi sử dụng Nginx làm proxy ngược để chuyển tiếp các POST này tới tập lệnh của tôi. Bạn có thể tìm cấu hình Nginx trong cùng repo Github trong thư mục 'nginx'.

Chúc vui vẻ!



1

Tôi đã tạo công cụ triển khai thô sơ của riêng mình, công cụ này sẽ tự động kéo xuống các bản cập nhật mới từ repo - https://github.com/jesalg/SlimJim - Về cơ bản nó lắng nghe github post-accept-hook và sử dụng proxy để kích hoạt cập nhật tập lệnh.


1

Tôi là người sáng lập https://commando.io và gần đây chúng tôi đã công bố tích hợp với GitHub thông qua một dịch vụ. Việc tích hợp cho phép bạn chạy các thực thi trên máy chủ khi bạn chuyển sang repo GitHub. Đây là cơ hội hoàn hảo để tự động chạy các tập lệnh triển khai khi bạn đẩy mã.

Thực thi là một tập lệnh bạn viết bên trong Commando.io có thể được viết bằng bash, perl, python, ruby, go hoặc node.js. Để đọc thêm và xem kịch bản thực thi ví dụ về cách chạy git pull, hãy xem thông báo bài đăng trên blog của chúng tôi: http://blog.commando.io/run-executions-via-github-push/


1

Deepl.io dường như là ứng cử viên mới và đầy hứa hẹn trong không gian này.

Các tính năng (lấy từ trang web của nó):

  • Nắm bắt webhook từ GitLab & GitHub
  • Định cấu hình nhiều kho lưu trữ
  • Định cấu hình nhiều nhánh cho mỗi kho lưu trữ
  • Sử dụng các tập lệnh triển khai của riêng bạn, PHP, shell hoặc cả hai
  • Gửi email xác nhận

1

Cũng lưu ý rằng có những dịch vụ miễn phí / không tốn kém như REPOMAN.IO tự động hóa hầu như tất cả những điều này cho bạ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.