使用Github或Gitlab的Webhooks实现代码自动更新部署(Ubuntu20.04)
1、安装ssh服务
root@Ubuntu:~# apt-get install openssh-server
2、部署php
root@Ubuntu:~# add-apt-repository ppa:ondrej/php
root@Ubuntu:~# apt-get update
root@Ubuntu:~# apt-get install php-fpm php-mysql php-curl php-json php-zip php-dev # php-dev可选
root@Ubuntu:~# /etc/init.d/php7.4-fpm start
3、部署nginx
root@Ubuntu:~# apt-get install nginx
4、配置nginx支持php
root@Ubuntu:~# vim /etc/nginx/sites-enabled/default
location ~ \.php$ {
include snippets/fastcgi-php.conf; # # With php-fpm (or other unix sockets):
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
# # With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
} location /webhook {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
5、创建php测试文件
root@Ubuntu:/var/www/html# vim index.php
<?php phpinfo(); ?>
6、创建php脚本(注意:html目录权限要设置为777)
root@Ubuntu:/var/www/html# vim script.php (与gitlab webhook对接)
<?php
//$valid_token = 'secret_token';
//$client_token = $_SERVER['HTTP_X_GITLAB_TOKEN'];
//if ($client_token !== $valid_token) die('<br />Token mismatch!');
echo $_SERVER['REMOTE_ADDR'];
$valid_ip = array('127.0.0.1'); //这里填你的gitlab服务器ip
$client_ip = $_SERVER['REMOTE_ADDR'];
if (!in_array($client_ip, $valid_ip)) die('<br />Ip mismatch!');
exec("cd /var/www/html/;mkdir phptest");
//exec("cd /var/www/html/; git pull origin master 2>&1", $output);
//var_dump($output); 这样可以用浏览器调试输出
?>
root@Ubuntu:/var/www/html# vim script.php (与github webhook对接)
<?php
date_default_timezone_set("Asia/Shanghai"); // 填写自己项目根目录绝对路径
$applicationPath = "/var/www/html/game/public";
// 这里是在 github webhooks页面设置的 Secret
$secret = "project"; // 获取github webhooks 请求头中的签名
$signature = $_SERVER['HTTP_X_HUB_SIGNATURE'];
if (!$signature) {
return http_response_code(404);
} // github webhooks 请求体 Payload 内容
$payloadJson = file_get_contents("php://input");
$content = json_decode($payloadJson, true);
list($algo, $hash) = explode("=", $signature, 2); // 组装 webhooks 请求信息
$pushInfo = "{$content['head_commit']['author']['name']} 在 " . date('Y-m-d H:i:s') . PHP_EOL;
$pushInfo .= "向 {$content['repository']['name']} 项目的 {$content['ref']} 分支 " .PHP_EOL;
$pushInfo .= "push 了 " . count($content['commits']) . " 个commit: " . PHP_EOL; // 验签
$payloadHash = hash_hmac($algo, $payloadJson, $secret);
if ($hash === $payloadHash) {
$ret = shell_exec("cd {$applicationPath} && sudo git pull origin main");
$responseLog = "Success: " . PHP_EOL;
$responseLog .= $pushInfo . $ret . PHP_EOL . PHP_EOL;
} else {
$responseLog = "Error: " . PHP_EOL;
$responseLog .= "{$pushInfo} 验签失败" . PHP_EOL . PHP_EOL;
} // 输出响应内容,可在 github webhooks - Recent Deliveries 中的 Response Body 中查看
echo $responseLog; // 记录 webhooks 请求日志
file_put_contents("/tmp/webhooks.log", $responseLog);
?>
7、配置sudo
root@project:~# visudo
# User privilege specification
root ALL=(ALL:ALL) ALL
www-data ALL=(ALL:ALL) NOPASSWD:/usr/bin/git
8、访问http://127.0.0.1/script.php执行脚本
9、Nginx日志出现"Access to the script '/var/www/html/webhook' has been denied (see security.limit_extensions)"错误解决办法
1、修改配置文件中security.limit_extensions选项为空
root@Ubuntu:~# vim /etc/php/7.4/fpm/pool.d/www.conf
398 ; Limits the extensions of the main script FPM will allow to parse. This can
399 ; prevent configuration mistakes on the web server side. You should only limit
400 ; FPM to .php extensions to prevent malicious users to use other extensions to
401 ; execute php code.
402 ; Note: set an empty value to allow all extensions.
403 ; Default Value: .php
404 ;security.limit_extensions = .php .php3 .php4 .php5 .php7
405 security.limit_extensions =
2、修改php.ini文件中选项cgi.fix_pathinfo=1
root@Ubuntu:~# vim /etc/php/7.4/fpm/php.ini
791 ; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's
792 ; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
793 ; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting
794 ; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting
795 ; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
796 ; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
797 ; http://php.net/cgi.fix-pathinfo
798 cgi.fix_pathinfo=1
参考链接:
https://www.jianshu.com/p/00bc0323e83f
https://www.cnblogs.com/-wenli/p/13420106.html # python webhook
https://qq52o.me/2482.html
https://www.jianshu.com/p/bab37843abc7
使用Github或Gitlab的Webhooks实现代码自动更新部署(Ubuntu20.04)的更多相关文章
- 使用webhooks进行代码的自动化部署
AutoMaticDeployment---自动部署 项目简介 使用Github的webhooks进行代码的自动化部署 本项目是个人最近搞的一个小工具,自己最近在用hexo部署个人博客(地址:http ...
- devops持续集成,Centos7.6下gitlab+jenkins(pipeline)实现代码自动上线
持续集成 gitlab+jenkins(pipeline)实现代码自动上线 环境准备:Centos7.6版本ip:192.168.0.13 主机名:gitip:192.168.0.23 主机名:jen ...
- 使用 SVN Hook 实现服务器端代码自动更新
之前的做法是客户端提交代码之后,再去服务器端项目中 svn up 一下来更新代码,让服务器端的项目更新到最新版本.可以编写一个 post-commit 钩子脚本来实现服务器端代码的自动更新,它在 SV ...
- 分享下使用 svn,测试服务器代码自动更新、线上服务器代码手动更新的配置经验
分享下使用 svn,测试服务器代码自动更新.线上服务器代码手动更新的配置经验 利用SVN的POST-COMMIT钩子自动部署代码 Linux SVN 命令详解 Linux SVN 命令详解2 使用sv ...
- Git github webhook 自动更新/部署代码 php自动更新脚本
这几天尝试了利用github的webhook,当代码更新到github,我们的测试服务器自动更新最新的gitbub仓库代码. 先列几个大概步骤,有时间再补充详细 1 . 服务器生成ssh key,一般 ...
- 如何一键部署项目&&代码自动更新
my-deploy : 由nodejs写的一个自动更新工具,理论支持所有语言(php.java.c#)的项目,支持所有git仓库(bitbucket.github等). Github 效果如何? 如果 ...
- Jenkins去GitLab拉取Java代码自动打包
jenkins的部署 一.部署git 1)先检查系统是否已经自带了git,如果有,就卸载 $ rpm -qa | grep git && rpm -e git --nodeps 2)开 ...
- 建立apk定时自动打包系统第三篇——代码自动更新、APP自动打包系统
我们的思路是每天下班后团队各成员在指定的时间(例如下午18:30)之前把各自的代码上传到SVN,然后服务器在指定的时间(例如下午18:30)更新代码.执行ant 打包命令.最后将apk包存放在指定目录 ...
- linux svn hooks代码自动更新至项目
由于开发移动端web,ui需要及时看到样式变化,所以通过svn hooks(钩子)来提交文件,然后再把文件同步到测试服务器项目目录,步骤如下: 1.进入 /home/svn/cmall/hooks ( ...
- gitlab和Django实现push自动更新
1.设置webhook gitlab->setting->webhook:http://121.143.191.166:7000?token=23028-b396-12e5-9912-ba ...
随机推荐
- 【必看】RuoYiVuek框架-数据源动态新增、配置如此简单!
应用场景 系统用户只能访问系统配置的数据源(可动态新增修改的) RuoYi Vue 框架源码 点我跳转 实现方式 1.系统提供 Yml文件配置 + Druid加载数据源 + @DataSource注解 ...
- C#/.net程序调用python
C#/.net程序调用python C#的优势在于window下的开发,不仅功能强大而且开发周期短.而python则有众多的第三方库,可以避免自己造轮子,利用C#来做界面,而具体实现使用python来 ...
- dotnet core 托管
1.托管形式 dotnet core的托管形式分为 进程内托管(InProcess).进程外托管 (OutOfProcess) 新建的Web程序csproj带有 <AspNetCoreHosti ...
- yile接口
后台接口: ---------------------------更改订单状态接口(需要主站长账号权限,主站要有接口权限)更改订单状态(可批量更新),如需退款/退单请用订单退款退单接口,如需更新订单数 ...
- Day 23 23.2:逆向前期准备
逆向前期准备 环境安装 pip install PyExecJS(自己pip安装,安装成功后,最好重启下cmd终端和pycharm,或者重启电脑) 安装node.js开发环境:安装好了之后,记得重启电 ...
- lg8365题解
容易发现我们一定会先加后乘,使用调整法可以证明这个结论. 并且可以发现除了\(a_i\)值为\(1\)的数外(假设他们的\(a\)值和为\(s\)),其他的数最多只会选\(1\)个做加法操作(设如果其 ...
- BOOK01:《过目不忘的读书法》
BOOK01:<过目不忘的读书法> 01 区分"信息"和"知识" 一年之后过时的是"信息",十年也不过时的是"知识&q ...
- Django中遇到的问题
1.如右上角无Dj的 Django标识 解决方法1: 关闭Pycharm 重启创建项目,进入到Django的所在目录下 解决方法2: 方法3: 第一步: 第二步: 第三步: 第四步: 2.如下图:显示 ...
- nacos启动报错
Caused by: com.alibaba.nacos.api.exception.NacosException: Nacos Server did not start because dumpse ...
- vue+element form 动态改变rules校验数据
优化:确定secondRules的数据在secondFlag改变之前进行赋值 可以用$nextTick来执行,不用setTimeOut ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...