通过gitlab的webhooks实现git项目的自动部署

1、安装gitlab

2、登录gitlab新建项目,如test

3、在项目settings→Integrations Settings,增加一项,URL是你要部署到的服务器上的一个可以访问的地址,

image.png

auto-deploy.php代码示例:

<?php
// 生产环境web目录
$web_path = '/home/wwwroot/test';

//作为接口传输的时候认证的密钥
$valid_token = 'asdfggg';

//调用接口被允许的ip地址
$valid_ip = array('192.168.8.219','192.168.10.1');
$client_ip = $_SERVER['REMOTE_ADDR'];
file_put_contents('client_ip.log',$client_ip);
if (!in_array($client_ip,$valid_ip)){
    die('ip invalid!');
}

$signature = isset($_SERVER['HTTP_X_GITLAB_TOKEN'])?$_SERVER['HTTP_X_GITLAB_TOKEN']:getHeader()['X_GITLAB_TOKEN'];

if (empty($signature) || $signature !== $valid_token) {
    exit('Invalid token request:'.$signature);
}

$repo = $data['repository']['name'];

echo shell_exec("ls");
$cmd = "cd $web_path && git pull 2>&1";
$out=shell_exec($cmd);
print_r($out);

function getHeader() {
    $headers = array();
    foreach ($_SERVER as $key => $value) {
        if ('HTTP_' == substr($key, 0, 5)) {
            $headers[str_replace('_', '-', substr($key, 5))] = $value;
        }
        if (isset($_SERVER['PHP_AUTH_DIGEST'])) {
            $header['AUTHORIZATION'] = $_SERVER['PHP_AUTH_DIGEST'];
        } elseif (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) {
            $header['AUTHORIZATION'] = base64_encode($_SERVER['PHP_AUTH_USER'] . ':' . $_SERVER['PHP_AUTH_PW']);
        }
        if (isset($_SERVER['CONTENT_LENGTH'])) {
            $header['CONTENT-LENGTH'] = $_SERVER['CONTENT_LENGTH'];
        }
        if (isset($_SERVER['CONTENT_TYPE'])) {
            $header['CONTENT-TYPE'] = $_SERVER['CONTENT_TYPE'];
        }
    }
    return $headers;
}

4、在待部署服务新建相应的目录,并初始化git,如

mkdir /home/wwwroot/test
git init
git remote add origin   此处仅为方便演示使用的http连接,可换为ssh或者https,密码配置请自行搜索搞定
git pull origin master
git branch --set-upstream-to=origin/master master  
git pull

如果从已存在的目录创建的话,可能会出现错误

error: The following untracked working tree files would be overwritten by merge

按下面执行(以防万一,请先备份源目录)

git fetch origin
git clean -f
git reset --hard origin/master

5、将上面目录的所属用户改为你的php容器的账号,比如使用的php-fpm,允许用户为www

chown -R www /home/wwwroot/test

6、在待部署服务器创建第二步中使用的链接

http://test.com/hook/auto-deploy.php

以你的gitlab服务器能够访问为准

7、通过gitlab项目后台设置Integrations中,发起测试

image.png

8、正常情况下,现在提交到master的所有push,待部署服务器都会自动pull下来了~

Enjoy~

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://tranfer.cn/?id=85