2015-05-28 59 views
1

嘿所以我用一個鉤子後像這樣:混帳REV-解析--short HEAD沒有得到最新的承諾

<?php 
file_put_contents('deploy.log', serialize($_POST['payload']), FILE_APPEND); 

$repo_dir = '/home/admin/web/website/repo-fullstack.git'; 
$web_root_dir = '/home/admin/web/website/public_html'; 

// Full path to git binary is required if git is not in your PHP user's path. Otherwise just use 'git'. 
$git_bin_path = 'git'; 

$update = false; 

// Parse data from Bitbucket hook payload 
$payload = json_decode($_POST['payload']); 

if (empty($payload->commits)){ 
    // When merging and pushing to bitbucket, the commits array will be empty. 
    // In this case there is no way to know what branch was pushed to, so we will do an update. 
    $update = true; 
} else { 
    foreach ($payload->commits as $commit) { 
    $branch = $commit->branch; 
    if ($branch === 'production' || isset($commit->branches) && in_array('production', $commit->branches)) { 
     $update = true; 
     break; 
    } 
    } 
} 

if ($update) { 
    // Do a git checkout to the web root 
    exec('cd ' . $repo_dir . ' && ' . $git_bin_path . ' fetch'); 
    exec('cd ' . $repo_dir . ' && GIT_WORK_TREE=' . $web_root_dir . ' ' . $git_bin_path . ' checkout -f'); 

    // Log the deployment 
    $commit_hash = shell_exec('cd ' . $repo_dir . ' && ' . $git_bin_path . ' rev-parse --short HEAD'); 
    file_put_contents('deploy.log', date('m/d/Y h:i:s a') . " Deployed branch: " . $branch . " Commit: " . $commit_hash . "\n", FILE_APPEND); 
} 
?> 

的問題是POST HOOK得到一個老犯,而且,不得到最新的提交。我注意到,即使是ROOT用戶。我運行命令git rev-parse --short HEAD它也得到了舊的提交。所以它肯定不是一個權限問題。

此命令不起作用的任何原因?我只是不明白爲什麼它會得到一箇舊的提交。

編輯:最奇怪的問題,如果所有,如果你想知道的是,它得到POST HOOK的正確描述。只是不正​​確的提交。跆拳道是這樣嗎?

回答

0

有此腳本中幾個問題:

$branch = $commit->branch; 

$branch = $payload->repository->default_branch 

替換它它一個git獲取,但你需要一個git拉,所以後添加此抓取

exec('cd ' . $repo_dir . ' && ' . $git_bin_path . ' pull'); 

我也有麻煩從文件被刪除回購,仍然存在。爲了解決這個問題添加混帳混帳乾淨結帳這樣後:

exec('GIT_WORK_TREE=' . $web_root_dir . ' ' . $git_bin_path . ' clean -fdx'); 

整個事情是這樣的,我已經添加了一個不錯的郵件功能太:

<?php 
$repo_dir = '/srv/users/YOURUSER/gitrepo/APPLICATIONAME'; 
$web_root_dir = '/srv/users/YOURUSER/apps/APPLICATIONAME/public'; 

// Full path to git binary is required if git is not in your PHP user's path. Otherwise just use 'git'. 
$git_bin_path = 'git'; 

// Parse data from Github hook payload 
$payload = json_decode($_POST['payload']); 

$empty = false; 
$update = false; 

if (empty($payload->commits)){ 
    // When merging and pushing to bitbucket, the commits array will be empty. 
    // In this case there is no way to know what branch was pushed to, so we will do an update. 
    $empty = true; 
    $update = true; 
} else { 
    $branch = $payload->repository->default_branch; 
    $message = $payload->head_commit->message; 

    if ($branch === 'master') { 
     $update = true; 
    } 
} 
if ($update) { 
    // Do a git checkout to the web root 
    exec('cd ' . $repo_dir . ' && ' . $git_bin_path . ' fetch'); 
    exec('cd ' . $repo_dir . ' && ' . $git_bin_path . ' pull'); 
    exec('cd ' . $repo_dir . ' && GIT_WORK_TREE=' . $web_root_dir . ' ' . $git_bin_path . ' checkout -f'); 
    exec('cd ' . $repo_dir . ' && GIT_WORK_TREE=' . $web_root_dir . ' ' . $git_bin_path . ' clean -fdx'); 

    // Log the deployment 
    $commit_hash = shell_exec('cd ' . $repo_dir . ' && ' . $git_bin_path . ' rev-parse --short HEAD'); 
    file_put_contents('.deploy.log', date('Y-m-d H:i:s') . " Github -- " . $message . " HASH: " . $commit_hash . "\n", FILE_APPEND); 

    // prepare and send the notification email 
    $headers = "From: [email protected]\r\n"; 
    $headers .= 'CC: ' . $payload->pusher->email . "\r\n"; 
    $headers .= "MIME-Version: 1.0\r\n"; 
    $headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n"; 

    // send mail to someone, and the github user who pushed the commit 
    $body = '<p>The Github user <a href="https://github.com/' 
    . $payload->pusher->name .'">@' . $payload->pusher->name . '</a>' 
    . ' has pushed to <b>' . $payload->repository->url 
    . '</b></p>'; 
    $body .= '<p>Here\'s a brief list of what has been changed:</p>'; 
    $body .= '<ul>'; 
    foreach ($payload->commits as $commit) { 
     $body .= '<li>'.$commit->message.'<br />'; 
     $body .= '<small style="color:#e67e22 ">Modified: </small><b>'.count($commit->modified) 
      .'</b> &nbsp; <small style="color:#58d68d ">Added: </small><b>'.count($commit->added) 
      .'</b> &nbsp; <small style="color:#e74c3c">Removed: </small><b>'.count($commit->removed) 
      .'</b> &nbsp; <a href="' . $commit->url 
      . '">Compare here</a></li>'; 
    } 
    $body .= '</ul>'; 
    $body .= '</pre>'; 
    $body .= '<p>Thanks for contributing, <br/>Github Webhook Endpoint'; 
    $body .= ' @ '.$_SERVER['REMOTE_ADDR'].'</p>'; 

    mail('[email protected]', 'Deployed to YOURAPPLICATION', $body, $headers); 
    echo(date('Y-m-d H:i:s')); 
    echo(" \r\n$message deployed"); 

} else { 
    header('HTTP/1.1 500 Internal Server Error'); 
} 
?>