项目使用了gitlab托管,以前部署代码都是登录服务器,然后git pull代码。这样每次需要发布代码,都需要登录,太繁琐。很早就了解到 gitlab支持 webhook,能够自动同步代码。今天尝试搭建成功了。

原理介绍

  1. 配置gitlab当push动作的时候,访问服务器上的一个链接比如pangxieke.com/tb.php

  2. tb.php里面写着一行代码,会让服务器git pull相应项目的代码到web目录。

  3. pull结束,代码就在web目录了,我们只要重新访问网站就可以了。

核心就是push的时候,gitlab会调用服务器上的脚本,服务器上的脚本就会从git重新拉取项目文件。同时还需要加入安全性的设计。

配置ssh密钥

先在服务端生成一对你的SSH密钥,因为之后服务器要用ssh方式免账号密码从gitlab上pull代码。用ssh-keygen在服务器上生成密钥,或者你已经有密钥了就跳过这一步。

因为项目配置的nginx和php的用户为www,所以代码执行时以www用户,所以需要www用户的ssh密钥

服务器添加www的密钥

修改www用户,允许登录,项目配置完成后,再修改回nologin

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

su wwwcat ~/.ssh/id_rsa.pub

//如果没有ssh-keygen

gitlab中配置ssh密钥

有了密钥之后,复制你的公钥,在你的gitlab profile个人资料里,找到SSH的目录,粘贴保存进去就可以了。这样gitlab上就有了你web服务器的公钥了,就可以正常SSH了。

也可以使用部署密钥。不同的项目,可以共用相同部署密钥,但记得在对应项目设置中启动此密钥

服务器脚本

先使用www用户调用sh脚本,如果成功,下一步是通过php执行脚本。
这里我们先使用www用户测试,需要用www用户登录服务器测试。

su www

如果不能成功,可能是设置了www用户为nologin,使用上述方法开启即可。

/home/www 下放了1个sh脚本, 内容如下

#!/bin/bashcd /home/www/www.pangxieke.com/usr/bin/git pull origin master

//或者 强制pullgit fetch --allgit reset --hard origin/master

然后使用www用户执行此脚本,测试是否能够获取代码。如果成功后,下一步就是通过钩子执行此脚本

php执行脚本

php通过exec函数执行脚本代码tb.php。需要调用exec函数,如果发现不成功,有可能php.ini配置中禁用了exec函数,重新开启即可

//作为接口传输的时候认证的密钥$valid_token = '87ea722e507383fb651ff0515b588b';//调用接口被允许的ip地址

$client_token = $_GET['token'];$project = $_GET['project']; //多个项目$client_ip = $_SERVER['REMOTE_ADDR'];$fs = fopen('./auto_hook.log', 'a');fwrite($fs, 'Request on ['.date("Y-m-d H:i:s").'] from ['.$client_ip.']'.PHP_EOL);if ($client_token !== $valid_token){    echo "error 10001";    fwrite($fs, "Invalid token [{$client_token}]".PHP_EOL);    exit(0);}

$json = file_get_contents('php://input');$data = json_decode($json, true);fwrite($fs, 'Data: '.print_r($data, true).PHP_EOL);//这里也可以执行自定义的脚本文件update.sh,脚本内容可以自己定义。if($project == 'pangxieke'){    $res = exec("/home/www/tb.sh", $result);}else if($project == 'pangxieke2'){    $res = exec("/home/www/tb2.sh", $result);}

fwrite($fs, 'Data: '.print_r($result, true).PHP_EOL);fwrite($fs, '======================================================================='.PHP_EOL);$fs and fclose($fs);var_dump($result);

然后通过浏览器访问测试

www.pangxieke.com/tb.php?token=87ea722e507383fb651ff0515b588b&project=pangxieke

如果访问后,能够返回git信息,就是代表成功。这样就可以配置gitlab的触发器

如果失败,可以查看auto_hook.log日志

为支持多个项目 配置了project参数,可以部署多个项目。只需要在gitlab钩子中配置时,使用不同的project参数。

www.pangxieke.com/tb.php?token=87ea722e507383fb651ff0515b588b&project=pangxiekewww.pangxieke.com/tb.php?token=87ea722e507383fb651ff0515b588b&project=pangxieke2

gitlab钩子设置

然后就可以push代码到仓库,然后查看代码是否部署成功

部署完成记得修改www用户为nologin

来源:http://www.pangxieke.com/linux/1252.html

互联网、金融、通信 DevOps 转型落地经验,就在 GOPS 2020 · 深圳站

近期好文推荐:

重磅!2020 年 DevOps 持续交付标准和技术运营标准评估报名正式启动!

远程办公条件下,DevOps 如何加快研发交付

持续交付体系在高德的实践历程

有了自动化就是 DevOps?浅谈 DevOps 的反模式

交付全链路数据,苏宁消费金融在 DevOps 度量设计的思考

流程可视化的利器:Jenkins BlueOcean

我只是下了个订单,鬼知道我在微服务里经历了什么…

DevOps 时代的软件过程改进探讨

震惊!DevOps CI/CD 竟然对抗击新冠期间的工作开展有这么大的作用?

“DevOps时代”公众号诚邀广大技术人员投稿。

投稿邮箱:jiachen@greatops.net 或 添加联系人微信:135 2116 9787(同微信)。

点击,立即报名 GOPS 2020 · 深圳站

你点的每个赞,我都认真当成了喜欢

统计gitlab代码行脚本_一点也不复杂, GitLab Webhook 自动部署代码相关推荐

  1. esplise自定义快捷代码补全_【Eclipse】_Eclipse自动补全增强方法 常用快捷键

    一,Eclipse自动补全增强方法 在Eclipse中,从Window -> preferences -> Java -> Editor -> Content assist - ...

  2. python代码写名字_必知必会系列_python代码优雅之道之代码命名约定

    代码的命名约定对代码的提高可读性影响巨大.本文中,我们将总结并向您提供一些关于命名的最佳实践的示例,以帮助您编写更优雅的Python代码,使将来可能阅读和使用您的代码的人(包括您自己)受益. Pyth ...

  3. 统计gitlab代码行脚本_详解代码统计工具cloc--计算文件数、空白行数、注释行和代码行...

    概述 Cloc是一款使用Perl语言开发的开源代码统计工具,支持多平台使用.多语言识别,能够计算指定目标文件或文件夹中的文件数(files).空白行数(blank).注释行数(comment)和代码行 ...

  4. git自动部署代码到服务器windows,Jenkins-在windows上配置自动化部署(Jenkins+Gitlab+IIS)...

    Jenkins-在windows上配置自动化部署(Jenkins+Gitlab+IIS) web部署样例 windows服务部署样例 系统备份 在服务器上创建后缀名为.ps1的文件,例:BackUpD ...

  5. gitlab+jenkins 利用webhook自动构建代码

    每次代码push后,还要去手动点jenkins构建,感觉这一步挺多余的,想省掉这一步.google了下,有很多种方式,这次采用gitlab的webhook来触发jenkins,实现自动构建. 版本 系 ...

  6. 代码编程教学_少儿编程教学环境开发之代码实战篇

    少儿编程教学环境开发之代码实战篇​mp.weixin.qq.com 之前架构选型篇许诺要上自己原型demo的界面图,先把这个许诺给实现了,首先声明,这只是技术原型demo,比起http://code. ...

  7. java 代码 内存泄露_如何用Java编写一段代码引发内存泄露

    Q:刚才我参加了面试,面试官问我如何写出会发生内存泄露的Java代码.这个问题我一点思路都没有,好囧. A1:通过以下步骤可以很容易产生内存泄露(程序代码不能访问到某些对象,但是它们仍然保存在内存中) ...

  8. js中当等于最小值是让代码不执行_网页中JS函数自动执行常用三种方法

    本文为大家分享了在网页中JS函数自动执行常用方法,供大家参考,具体内容如下 一.JS方法 1.最简单的调用方式,直接写到html的body标签里面: 2.在JS语句调用: function myfun ...

  9. 搜索python代码的软件_用python编写一个高效搜索代码工具

    用python编写一个高效搜索代码工具 大多码农在linux环境下使用grep+关键词的命令搜索自己想要的代码或者log文件.今天介绍用python如何编写一个更强大的搜索工具,windows下也适用 ...

最新文章

  1. AI开发人员使用频率最高的10个机器学习平台!
  2. sql获取一张表所有的字段_SQL语句19问
  3. Oracle 11 密码永不过期
  4. 安装容器编排工具 Docker Compose
  5. SQL Server 2005 允许远程连接解配置
  6. Nancy基于JwtBearer认证的使用与实现
  7. mysql碎片处理_mysql优化数据库和mysql数据库碎片处理
  8. java计算机毕业设计企业员工档案管理源码+系统+数据库+lw文档+mybatis+运行部署
  9. 大数据时代的大数据技术与应用有哪些
  10. asp.net实现一个简易购物车功能。
  11. linux操作系统 第12章 网络与通信应用
  12. Laravel Collect集合用pluck取多维数组中某个字段值
  13. Duang!Markdown
  14. 矩阵求逆_伴随矩阵法
  15. 在python中设置静态变量
  16. 2021年中国汽车座椅行业发展现状及进出口状况分析:我国汽车座椅出口数量再创新高 [图]
  17. 简谈FPGA的上电复位
  18. Wireshark修改数据包
  19. 爬虫 — 大众点评商户信息的爬取和文字反爬
  20. runspec 的选项说明(spec2006官方文档的翻译)

热门文章

  1. python文件读read()、readline()、readlines()对比
  2. C语言socket getsockopt() setsockopt()函数(获取和设置套接口的选项?)
  3. 拉格朗日乘数法(一种寻找变量受一个或多个条件所限制的多元函数的极值的方法)
  4. 静态网页和动态网页的区别(转载)
  5. python2.7配置tensorflow1.5.0和keras2.1.6
  6. 随e行安全层在与远程计算机初始化,g3随e行怎么用_g3随e行怎么安装_随e行wlan无法登陆...
  7. Java进阶:CyclicBarrier基本使用
  8. richtextbox自动滚动到最下面_工业自动化直线运动部件大全,导轨、轴承、衬套、丝杠、导向轴简介说明...
  9. 2020年终总结一下吧
  10. 使用远程工具连接提示**Host *** is not allowed to connect to this mysql server**拒绝连接错误