gitlab webhook 自动部署代码

Posted by Sunday on 2018-03-29

原理

1、配置gitlab,当客户端git push动作的时候,访问服务器上的一个链接比如demo.sundayle.com/applet.php
2、applet.php会调用applet.sh脚本,检测master或upload更新,就会让服务器git pull相应项目的代码到内网web目录或外网web目录。
3、pull结束,我们只要重新访问内网或外网 网站就可以了。

内外网shell脚本

同步内网demo服务器 shell脚本
/data/web/webhook/shell# cat applet.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/local/webserver/git/bin:$PATH

WEB_PATH='/data/web/applet.demo.yyq.com'
WEB_USER='www'
WEB_USERGROUP='www'

echo "Start deployment"
cd $WEB_PATH
echo "pulling source code..."
git reset --hard origin/master
git clean -f
git pull
git checkout master
echo "changing permissions..."
sudo chown -R $WEB_USER:$WEB_USERGROUP $WEB_PATH
echo "Finished."

同步外网服务器 shell脚本
/data/web/webhook/shell# cat shell/upload-cp.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/local/webserver/git/bin

WEB_PATH='/data/web/webhook/upload/www.sundayle.com'
WEB_USER='www'
WEB_USERGROUP='www'

echo "Start deployment..."
cd $WEB_PATH
echo "Pulling source code..."
git reset --hard origin/upload
git clean -f
git pull
git checkout upload
echo "changing permissions..."
sudo chown -R $WEB_USER:$WEB_USERGROUP $WEB_PATH
echo "Finished."

echo "" > /data/web/webhook/rsync.log
rsync -avu --progress -e "ssh -p25180" --exclude-from="/data/shell/exclude/applet" $WEB_PATH www@www.sundayle.com:/data/web/www.sundayle.com --log-file-format='%t %f %b' --log-file='/data/web/webhook/rsync.log'

php代码

通过 php 调用 exec函数执行shell脚本 applet.sh。
注:php.ini需启动exec函数。自行配置nginx

root@demo18:/data/web/webhook# cat applet.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php 
// 处理 GitLab 请求的脚本

$rowData = file_get_contents('php://input', 'r');;
$rowData = json_decode($rowData,true);

$output = '';
$type = $_GET['type'];

// 只拉取 master 分支的代码到服务器
if($rowData['ref'] == 'refs/heads/master'){
if('xwx' == $type){
// 触发拉取代码的脚本
exec('./shell/applet.sh',$output);
}
logg($type." output:".json_encode($output));
}
logg($type.':'.$rowData['user_name']." commit to branch:".$rowData['ref']);


if($rowData['ref'] == 'refs/heads/upload'){
if('xwx' == $type){
// 触发拉取代码的脚本
exec('./shell/upload-applet.sh',$output);
}
logg($type." output:".json_encode($output));
}

function logg($data){
$text = '['.date('Y-m-d H:i:s').'] '.$data."\n";
//file_put_contents('./hook'.date('ym').'.log',$text,FILE_APPEND);
file_put_contents('./hook.log',$text,FILE_APPEND);
}
//Setting-Intergrations
//http://demo.sundayle.com/applet.php?type=xwx

11