1 給www用戶登錄shell權(quán)限
cd /etc/passwd
將www這條信息的/usr/sbin/nologin修改為/bin/bash(前提是有www用戶惩激,如果沒有www用戶舞痰,需要添加一個(gè)www用戶)
2 給www用戶添加秘鑰
上一篇中生成的秘鑰是在root賬戶下生成的,所以www用戶是沒有權(quán)限訪問的,切換到www用戶
su www
重寫生成一次秘鑰理卑,同樣的距辆,將公鑰保存到gitlab中
上一章中忘記將項(xiàng)目的權(quán)限分配給www了余佃,另開一個(gè)窗口,登錄root賬戶跨算,這里操作以下步驟
chmod -R 777 /項(xiàng)目
chown -R www:www /項(xiàng)目
進(jìn)入項(xiàng)目根目錄爆土,嘗試使用git
git pull
3 創(chuàng)建webHooks.php和hooks.log
創(chuàng)建一個(gè)webHooks.php用于gitlab自動推送,我這里單獨(dú)給webHooks.php分配了地址
/home/www/hook/project/webHooks.php,同時(shí)創(chuàng)建/home/www/hook/project/hooks.log
<?php
error_reporting(E_ERROR);
//網(wǎng)站目錄
$www_file='/home/www/project/';
//打開網(wǎng)站目錄下的hooks.log文件,需要在服務(wù)器上創(chuàng)建,并給寫權(quán)限
$fs = fopen('/home/www/hook/project/hooks.log', 'a');
fwrite($fs, '================ Update Start ==============='.PHP_EOL.PHP_EOL);
//自定義字串掩碼 用于驗(yàn)證
$access_token = 'QhNO8YHqym5PHQQsexapF7041xOhzm62DRH';
//接受的ip數(shù)組诸蚕,也就是允許哪些IP訪問這個(gè)文件 這里是gitlab服務(wù)器IP
$access_ip = 'XXX.XXX.XXX.XXX';
//如果使用www.xxx.com/xxx.php?token=xxxxxxx 的方式來傳送驗(yàn)證字符串步势,則用這個(gè)方法獲取
# $client_token = $_GET['token'];
// 獲取請求端的secret token
$client_token = $_SERVER["HTTP_X_GITLAB_TOKEN"];
//獲取請求端的IP
$client_ip = $_SERVER['REMOTE_ADDR'];
//把請求的IP和時(shí)間寫進(jìn)log
fwrite($fs, 'Request on ['.date("Y-m-d H:i:s").'] from ['.$client_ip.']'.PHP_EOL);
//驗(yàn)證token 有錯(cuò)就寫進(jìn)日志并退出
if ($client_token !== $access_token)
{
echo "error 403";
fwrite($fs, "Invalid token [{$client_token}]".PHP_EOL);
exit(0);
}
//獲取請求端發(fā)送來的信息氧猬,具體格式參見gitlab的文檔
$json = file_get_contents('php://input');
$data = json_decode($json, true);
//如果有需要 可以打開下面,把傳送過來的信息寫進(jìn)log
# fwrite($fs, 'Data: '.print_r($data, true).PHP_EOL);
//執(zhí)行shell命令并把返回信息寫進(jìn)日志
$output=shell_exec("cd $www_file && git pull 2>&1");
fwrite($fs, 'Info:'. $output.PHP_EOL);
fwrite($fs,PHP_EOL. '================ Update End ==============='.PHP_EOL.PHP_EOL);
$fs and fclose($fs);
?>
4 為webHooks.php 設(shè)置訪問域名
在 /usr/local/nginx/conf/vhost新加一個(gè)project.hook.XXX.com.conf配置文件
server
{
listen 80;
server_name project.hook.XXX.com;
root /home/www/hook/project;
index index.html webhooks.php;
}
重啟nginx
在域名解析上添加該解析坏瘩。
5 gitlab添加hook的url
登錄gitlab,進(jìn)入項(xiàng)目后盅抚,點(diǎn)擊設(shè)置,點(diǎn)擊集成倔矾,將上步的域名填入,同時(shí)將webHooks中設(shè)置的token填入安全令牌妄均,并取消勾選SSL 證書驗(yàn)證
添加完成后,在web鉤子列表點(diǎn)擊test破讨,出現(xiàn)如下字樣丛晦,標(biāo)識連通了地址
6 開啟shell_exec函數(shù)
打開php.ini找到disable_functions,將shell_exec移除
現(xiàn)在測試自動部署功能
在你本機(jī)修改數(shù)據(jù)后push到gitlab提陶,打開服務(wù)器上的hooks.log烫沙,如果出現(xiàn)
================ Update Start ===============
Request on [2019-08-27 08:59:44] from [118.190.78.158]
Info:From gitlab.XXX.com:root/prostudy
3a691e9..c29f3a7 master -> origin/master
Updating 3a691e9..c29f3a7
Fast-forward
.env.example | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
================ Update End ===============
代表自動部署成功