8

実稼働 Web サーバー (/var/www のドキュメント ルート) と同じサーバーで GitLab v5.2 を実行しています。

標準の GitLab Post-Receive Hook をセットアップしようとしていますが、投稿された JSON データを処理するためのスクリプトをセットアップする方法について驚くほどほとんど情報が見つかりません。カスタムをしようとしているわけではありません。箱から出してすぐに、Web サイトの場所 (同じサーバーで覚えておいてください) で受信後のデータを受信し、受信時に origin-master からプルします (受信後のデータ送信元のプッシュがマスター ブランチに送信された場合)。このように、/var/www にある Web サイトは常に同じマスターです。

誰かが、投稿データからのプル スクリプトの例を教えてください。

GitLab フック リクエストの例- GitLab インスタンスがない場合、GitLab Post-Receive JSON データは次のようになります (GitLab ヘルプからそのまま)

{
 "before": "95790bf891e76fee5e1747ab589903a6a1f80f22",
 "after": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
 "ref": "refs/heads/master",
 "user_id": 4,
 "user_name": "John Smith",
 "repository": {
   "name": "Diaspora",
   "url": "git@localhost: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": "jordi@softcatala.org",
     }
   },
   // ...
   {
     "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": "gitlabdev@dv6700.(none)",
     },
   },
 ],
 "total_commits_count": 4,
};
4

2 に答える 2

8

よし、徹底的に掘り下げた後、独自のスクリプトを作成するのに十分なドキュメントを見つけました。それは次のとおりです。

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');
 }

したがって、これはその目的のために完全に機能します。しかし今、私は論理を再考する必要があり、場合によっては哲学さえも再考する必要があります. この方法により、/var/www/website/directory が master で自動的に最新の状態に保たれます。しかし、他のさまざまなブランチについてはどうでしょうか。開発チームが自分の作業を表示できるように、Web サーバーを介して他のブランチを表示できるようにするための方法論が必要です...

これが私が考えていることです:

投稿文字列の ref セクション内で「マスター」を探すだけのコードではなく、「/」デリミタで投稿文字列を分割し、最後の要素を取り出します。

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

次に、このブランチの /var/www/website/directory/ 内に次のような作業ディレクトリがあるかどうかを確認します/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://git@git.mydomain.com/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");
} 

このロジックは比較的しっかりしているように見えますが、ここに投稿して人々の意見を確認するだけです. この方法では、開発者は新しいリモート ブランチを作成してそこにプッシュすると、ブランチは表示用に /var/www Web ディレクトリにプルされます。

開発者が開発ブランチや、このスクリプトを改善する方法に関する推奨事項を表示できるようにする別の方法を考えられる人はいますか?

ありがとう

于 2013-06-17T15:05:46.427 に答える
0

最新のドキュメントはアプリケーション自体にあります: https://docs.gitlab.com/ce/user/project/integrations/webhooks.html

于 2014-02-10T10:10:09.517 に答える