2013-03-04 33 views
11

Cài đặt để Github tự động đẩy mọi bản cập nhật lên máy chủ từ xa là gì?Làm cho Github đẩy đến một máy chủ từ xa khi nó nhận được cập nhật

Điều này rất hữu ích cho việc duy trì một codebase trên Github, và có một trang web chạy ra khỏi codebase đó.

  1. Tôi có repo trên máy tính của riêng mình, đây là nơi tôi làm việc.

  2. Tôi cam kết thay đổi trên repo địa phương của mình và đẩy chúng vào repo Github của tôi.

  3. Tôi muốn repo Github của tôi sau đó đẩy những thay đổi này vào máy chủ từ xa của mình.

Tôi đã nghiên cứu cả ngày và sử dụng âm thanh 'móc' hợp lý. Có thể sử dụng hook 'post-receive' trên Github mà sau đó chạy một lệnh push đến máy chủ từ xa của tôi.

Mọi đề xuất?

Trả lời

10

Vì tôi hiểu github không cho phép bạn xác định móc "đúng". Giống như sau khi nhận. Thay vào đó, họ cung cấp một cái gì đó gọi là webhook cho các nhà phát triển. những gì bạn có thể làm với điều này là đưa ra một yêu cầu web đến bất kỳ URL nào được chỉ định bởi bạn bất cứ khi nào có một push đến kho lưu trữ của bạn.

Vì vậy, những gì bạn có thể làm là: thiết lập máy chủ web trên máy chủ git từ xa của bạn và định cấu hình github để thực hiện cuộc gọi http đến sau khi nhận. Bất cứ khi nào github thông báo cho máy chủ từ xa của bạn làm một pull trên nó từ github.

Xem tại đây về cách sử dụng webhooks: https://help.github.com/articles/post-receive-hooks

P.S. Một mechianism móc thực sự có thể là một lỗ hổng bảo mật có thể cho github gây ra nó cho phép bạn thực thi mã tùy chỉnh trên máy chủ của họ. Vì vậy, họ đã thực hiện một cái gì đó mà không cho phép bạn thực hiện bất cứ điều gì nhưng vẫn cho phép bạn làm bất cứ điều gì bạn muốn.

7

Để minh họa Yervand 's answer (upvoted), xem xét việc này peligangit như một ví dụ về một máy chủ HTTP đơn giản (mà bạn có thể cài đặt trên dụ amazon-EC2 của bạn), mà sẽ:

  • bắt đầu một máy chủ HTTP đơn giản.
  • lắng nghe một POST từ một GitHub webhook
  • nó sẽ kéo xuống các cam kết mới

workflow

thư viện đó sẽ lấy, và sau đó thiết lập lại các chi nhánh chính trên nguồn gốc/master.
Đó là một cách để thực hiện điều đó. (xem githook.py)

def hard_reset_repos(self): 
    self.server.source_repo.fetch([self.server.source_repo.origin]) 
    self.server.source_repo.reset(['--hard', self.server.source_repo.originMaster]) 
Các vấn đề liên quan