gitlab通过webhook自动化部署

问题描述:

以往开发时需要频繁上传代码到服务器很麻烦,能否将提交到版本控制的代码自动同步到服务器呢,答案是可行的

如果使用的是SVN的话服务器搭建SVN可以自动同步代码,这里不做介绍,下面以github,php环境为例介绍,其他环境类似

原理:

当git仓库发生变动时(推送,合并等),利用web钩子向服务器发送一条指令,服务器收到请求后,去相应的目录 git pull 代码

以gitlab  和PHP为例

实现:

配置ssh部署秘钥

修改/etc/passwd文件,使www用户具有可登录权限
现在我们要登进www账户,创建ssh文件,然后连一下gitlab
 

vim /etc/passwd

;www:x:22:22:www:/var/www:/usr/sbin/nologin
www:x:22:22:www:/var/www:/bin/bash

当自动化部署完成后,要该回到原来的配置,因为www用户默认是不允许登录服务器的。

按以下步骤操作:

  1. 执行 su www 命令切换为www用户。
  2. 执行 ssh-keygen 命令,将生成的公钥(位置在/home/www目录下),添加到gitlab中的项目中

gitlab服务器自动化部署代码_gitlab

gitlab中部署秘钥里填入当前生成的ssh秘钥

gitlab服务器自动化部署代码_git自动化部署_02

然后在网站目录下执行下 git pull 把代码拉取一次
完成后把www账户的login权限去掉

webhook配置

1.服务端脚本server.php,valid_token为授权码,确保外网可以访问到

<?php
error_reporting(1);
$valid_token='erd6e2r3';

$client_token = $_SERVER['HTTP_X_GITLAB_TOKEN'];
$client_ip = $_SERVER['REMOTE_ADDR'];
if ($client_token !== $valid_token) die('token验证失败!');
$valid_ip = array('118.31.85.105'); //这里填你的gitlab服务器ip
if (!in_array($client_ip, $valid_ip)) die('Ip mismatch!');

error_log("log start :'.".shell_exec("cd /www/wwwroot/server && git pull"),3,"/www/wwwroot/weball/erver/errorsgitlab.log");

2.gitlab 配置web钩子

gitlab服务器自动化部署代码_webhook_03

3.服务端配置git ,并git clone 此项目 ,

4.点击测试 确认是否正常