想买大牛打工仔 發表於 2023-6-24 00:00:00

用gitlab的webhooks更新网站

<p>git有hooks钩子,但不太喜欢用ftp或者http方式同步更新其他服务器的网站。所以选择了gitlab,因为gitlab有webhooks。github也有webhooks,不过github太高富帅了,还是自己搭一个gitlab,安全又放心,关键是免费。</p>
<p>操作过程如下:</p>
<p>我的是php</p>
<p>要放在服务器上的目录: /home/wwwroot/mysite</p>
<p>在项目跟目录下面新建一个hooks.php,输入以下代码</p><pre class="brush:bash;toolbar:false">//网站目录

$www_file='/home/wwwroot/mysite/';

//打开网站目录下的hooks.log文件 需要在服务器上创建 并给写权限

$fs = fopen($www_file.'hooks.log', 'a');

fwrite($fs, '================ Update Start ==============='.PHP_EOL.PHP_EOL);

//自定义字串掩码 用于验证

$access_token = 's7kjjhh8767laq29KLJK9089883hjjkgfdrrpipoinmw';

//接受的ip数组,也就是允许哪些IP访问这个文件 这里是gitlab服务器IP
$access_ip = array('8.8.8.8');

//获取请求端的ip和token

$client_token = $_GET['token'];
$client_ip = $_SERVER['REMOTE_ADDR'];

//把请求的IP和时间写进log

fwrite($fs, 'Request on ['.date("Y-m-d H:i:s").'] from ['.$client_ip.']'.PHP_EOL);

//验证token 有错就写进日志并退出
if ($client_token !== $access_token)
{
echo "error 403";
fwrite($fs, "Invalid token [{$client_token}]".PHP_EOL);
exit(0);
}

//验证ip
if ( !in_array($client_ip, $access_ip))
{
echo "error 503";
fwrite($fs, "Invalid ip [{$client_ip}]".PHP_EOL);
exit(0);
}

//获取请求端发送来的信息,具体格式参见gitlab的文档

$json = file_get_contents('php://input');
$data = json_decode($json, true);

//如果有需要 可以打开下面,把传送过来的信息写进log
//fwrite($fs, 'Data: '.print_r($data, true).PHP_EOL);

//执行shell命令并把返回信息写进日志

$output=shell_exec("cd $www_file &amp;&amp; git checkout master &amp;&amp; git pull origin master 2&gt;&amp;1");
fwrite($fs, 'Info:'. $output.PHP_EOL);

fwrite($fs,PHP_EOL. '================ Update End ==============='.PHP_EOL.PHP_EOL);

$fs and fclose($fs);</pre><p>做完这些后,就可以push到gitlab端了</p>
<p>有个问题说明一下,对于MVC来说,gitlab的请求并不会走路由,所以不要用路由方式来加这个文件</p>
<p>接着登陆网站服务器</p><pre class="brush:bash;toolbar:false">$ vi /etc/passwd</pre><p>查看这个文件,然后查看www的根目录</p>
<p>我这里是 /home/www</p>
<p>运行which git 我这里得到 /usr/local/bin/git</p>
<p>记住这两个目录</p>
<p>接着把gitlab中项目的ssh key对应的秘匙id_rsa放入/home/www/.ssh里</p>
<p>.ssh需要700的权限</p><pre class="brush:bash;toolbar:false">$ chmod -R 700 .ssh</pre><p>接着给网站目录www权限</p><pre class="brush:bash;toolbar:false">$ chown -R www:www /home/wwwroot/mysite</pre><p>进入网站目录</p><pre class="brush:bash;toolbar:false">cd /home/wwwroot/mysite</pre><p>初始化git 并设置权限</p><pre class="brush:bash;toolbar:false">$ git init
$ chmod -R g+s .git
$ chown -R www:www .git</pre><p>接着配置git</p><pre class="brush:bash;toolbar:false">$ git remote add origin</pre><p>完成上面的操作后就可以手动自行第一次pull操作了 从远程获取</p><pre class="brush:bash;toolbar:false">sudo -u www /usr/local/bin/git pull origin master</pre><p>最后进入gitlab中项目settings设置 在web hooks里</p>
<p>URL写</p>
<p>http://www.mysite.com/hooks.php?token=s7kjjhh8767laq29KLJK9089883hjjkgfdrrpipoinmw<br>
这里的token要和你在hooks.php的token一致</p>
<p>做完这些以后就可以pull了,做一次提交,看是不是同时自动更新了网站</p>
<p>最后:如果web hooks不能正常工作的话,可以看下hooks.log看下执行的信息</p>
<p>补充两个问题:</p>
<p>1.在手动创建/home/www/.ssh 文件夹后,不能忘了改变这个文件夹的所有者,不然会出现无法写入know_hosts的问题</p><pre class="brush:bash;toolbar:false">$chown -R www:www /home/www/.ssh</pre><p>2.因为代码中使用到了shell_exec这个函数,一般配置php的时候都禁止了,需要打开shell_exec</p>
<p>在php.ini的disable_functions 的列表里删除shell_exec</p>
<p>再重新启动php-fpm服务就可以了</p>
頁: [1]
查看完整版本: 用gitlab的webhooks更新网站