2013-06-16 30 views
6

Tôi đang chạy GitLab v5.2 trên cùng một máy chủ với máy chủ web sản xuất của tôi (Document Root in/var/www).GitLab 5.2 Sau khi nhận WebHook

Tôi đang cố gắng thiết lập Hook Post-Receive chuẩn GitLab nhưng tôi đang tìm kiếm một chút thông tin đáng ngạc nhiên về cách thiết lập tập lệnh để xử lý dữ liệu JSON đã đăng. Tôi không cố gắng làm bất cứ điều gì, chỉ cần ra khỏi hộp, tôi muốn nhận dữ liệu sau khi nhận tại vị trí trang web của tôi (nhớ trên cùng một máy chủ), và sau đó kéo từ gốc-master khi nó nhận được (với điều kiện đẩy dữ liệu sau khi nhận được đến nhánh chính). Bằng cách này, trang web được tìm thấy trong/var/www luôn giống như một tổng thể.

Có thể là ai đó, hãy cho tôi ví dụ về tập lệnh kéo từ dữ liệu bài đăng hoặc chỉ cho tôi đúng hướng để tôi tạo một tài liệu?

GitLab Hook Yêu cầu Ví dụ - Đối với những người không có một trường hợp GitLab, đây là những gì các GitLab Post-Nhận JSON dữ liệu trông giống như (trực tiếp từ sự giúp đỡ GitLab)

{ 
"before": "95790bf891e76fee5e1747ab589903a6a1f80f22", 
"after": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7", 
"ref": "refs/heads/master", 
"user_id": 4, 
"user_name": "John Smith", 
"repository": { 
    "name": "Diaspora", 
    "url": "[email protected]:diaspora.git", 
    "description": "", 
    "homepage": "http://localhost/diaspora", 
}, 
"commits": [ 
    { 
    "id": "b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327", 
    "message": "Update Catalan translation to e38cb41.", 
    "timestamp": "2011-12-12T14:27:31+02:00", 
    "url": "http://localhost/diaspora/commits/b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327", 
    "author": { 
     "name": "Jordi Mallach", 
     "email": "[email protected]", 
    } 
    }, 
    // ... 
    { 
    "id": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7", 
    "message": "fixed readme", 
    "timestamp": "2012-01-03T23:36:29+02:00", 
    "url": "http://localhost/diaspora/commits/da1560886d4f094c3e6c9ef40349f7d38b5d27d7", 
    "author": { 
     "name": "GitLab dev user", 
     "email": "[email protected](none)", 
    }, 
    }, 
], 
"total_commits_count": 4, 
}; 

Trả lời

6

Alright, sau khi mở rộng đào tôi đã đủ tài liệu tìm thấy để tạo ra kịch bản của riêng tôi, và ở đây nó là:

PHP

error_reporting(E_ALL); 
ignore_user_abort(true); 

function syscall ($cmd, $cwd) { 
    $descriptorspec = array(
      1 => array('pipe', 'w') // stdout is a pipe that the child will write to 
    ); 
    $resource = proc_open($cmd, $descriptorspec, $pipes, $cwd); 
    if (is_resource($resource)) { 
      $output = stream_get_contents($pipes[1]); 
      fclose($pipes[1]); 
      proc_close($resource); 
      return $output; 
    } 
} 

if($HTTP_RAW_POST_DATA && !empty($HTTP_RAW_POST_DATA['ref'])){ 
    // pull from master 
    if(preg_match('(master)', $HTTP_RAW_POST_DATA['ref'])) 
      $result = syscall('git pull origin master', '/var/www/website/directory'); 
} 

Vì vậy, thi s hoạt động hoàn hảo cho mục đích của nó. Nhưng bây giờ tôi cần phải suy nghĩ lại về logic và thậm chí là triết lý. Phương pháp này sẽ tự động giữ thư mục/var/www/website/up-to-date với master; tuy nhiên, những nhánh khác thì sao? Tôi cần một số phương pháp tại chỗ để có thể xem chi nhánh khác thông qua máy chủ web của tôi, vì vậy các đội dev có thể xem công việc của họ ...

Dưới đây là những gì tôi đang nghĩ:

Thay vì mã của tôi chỉ tìm kiếm "bậc thầy" trong phần ref của bài chuỗi, tôi chia chuỗi bài về "/" delimiter và bật tắt các yếu tố cuối:

$branch = array_pop(split("/", $HTTP_RAW_POST_DATA['ref'])); //this will return which branch the post data was sent from 

sau đó, tôi kiểm tra xem nếu chi nhánh này có làm việc thư mục trong/var/www/website/directory /, như /var/www/website/directory/master:

if(is_dir("/var/www/website/directory/$branch")){ //check if branch dir exists 
    $result = syscall("git pull origin $branch", "/var/www/website/directory/$branch"); 
} else { 
    //if branch dir doesn't exist, create it with a clone 
    $result = syscall("git clone ssh://[email protected]/sadmicrowave/someproject.git $branch", "/var/www/website/directory"); 
    //change dir to the clone dir, and checkout the branch 
    $result = syscall("git checkout $branch", "/var/www/website/directory/$branch"); 
} 

Logic này có vẻ tương đối chắc chắn, chỉ cần đăng lên đây để xem ý kiến ​​của mọi người. Với phương thức này, một nhà phát triển có thể tạo một nhánh từ xa mới và đẩy nó vào, sau đó nhánh sẽ được kéo vào thư mục web/var/www để xem.

Có ai có thể nghĩ ra một cách khác để cho phép nhà phát triển xem chi nhánh của họ hoặc bất kỳ đề xuất nào về cách làm cho tập lệnh này tốt hơn không?

Cảm ơn

+0

Tôi đã thêm một bài viết trên blog về những hành động tôi đã và khối đầy đủ các mã được sử dụng để thiết lập chức năng này trên máy chủ của tôi nếu bất kỳ ai quan tâm: http://www.kernelops.com/gitlab-post-receive-webhook/ – sadmicrowave

Các vấn đề liên quan