程序员

gitlab通过webhook自动部署

2018-07-23  本文已影响101人  a68202ac066c

前置条件

最近在撸一个个人项目,虽然是个人项目,但是觉得用ftp传代码不太好,都21世纪了,我们要用现代的方式来管理、部署代码。于是希望能有一个本地push代码之后,线上服务器就能更新代码的功能。

开发环境如下
1.本地有一个开发环境
2.阿里云有个服务器
3.代码通过gitlab管理
本文只针对个人开发者,团队开发感觉需要有更加严谨的流程。

原理、步骤说明

1、本地发起push请求后,gitlab触发一个钩子
2、触发gitlab钩子后,使用gitlab webhook调用阿里云服务器的一个链接,例:xxx.example.com/pull.php
3、pull.php里面执行代码,从gitlab git pull代码

配置流程

1.编写服务端脚本

脚本核心部分如下

exec("cd /var/www/html/; git pull"); //先定位到相应目录,然后git pull

当然这也并不安全,所以我们需要加上一些验证,在gitlab webhook处可以配置一个token,so,我们加上个token验证

<?php
$valid_token = 'secret_token';
$client_token = $_SERVER['HTTP_X_GITLAB_TOKEN'];
if ($client_token !== $valid_token) die('Token mismatch!');
exec("cd /var/www/html/; git pull origin master");
//exec("cd /var/www/html/; git pull origin master 2>&1", $output);
//var_dump($output); 这样可以用浏览器调试输出
?>
2、给脚本另开个端口

毕竟这个不是业务代码不是,放在一起总觉得哪里不对劲

server {
    listen 4567;
    listen [::]:4567;
    
    server_name example.com;
    root /var/www/script;
    index index.html; 

    location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }
   
    location / { 
        try_files $uri $uri/ =404;
    }}

重启一下nginx

$ nginx -t
$ /etc/init.d/nginx restart
3、编辑www账户的账号权限
有几个要注意的地方
1.开放出去的web根目录www有没有权限编辑?
2.www 能不能连上gitlab?
3.脚本里的exec函数有么有被禁用?
第一个问题

假设项目的web根目录是/var/www/,那我们把这个文件夹交给www账户,不然他是没权限操作的

$ chown -R www:www /var/www/
第二个问题

www访问不到正常账户的.ssh文件夹,so 连不上gitlab
现在我们要登进www账户,创建ssh文件,然后连一下gitlab
1、放开www账户访问限制

vim /etc/passwd
;www:x:22:22:www:/var/www:/usr/sbin/nologin
www:x:22:22:www:/var/www:/bin/bash
2、生成ssh秘钥

你能找到这篇文章,我就默认这部你懂啦,把生成的ssh秘钥往gitlab上配一下,然后执行下 git pull把gitlab的公钥记下来
完成后把www账户的login权限去掉

第三个问题

到了这部,如果你的这个文件访问没有任何输出,好像什么事都没有发生的样子,那就去检查下php.ini里面exec函数是否被禁用,改完之后重启下php-fpm

然后应该就可以用啦

副记

1、gitlab的webhook在哪里??

这个我找了好久,一度以为这个功能被去掉了。
点进项目后,左侧setting,然后integrations


image.png

然后就是配置webhook的界面了


image.png

nice~enjoy your self
如果对你有帮助,点个赞再走啦~

文章参考https://www.jianshu.com/p/00bc0323e83f,阿里嘎多

上一篇下一篇

猜你喜欢

热点阅读