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)的更多相关文章

  1. 使用webhooks进行代码的自动化部署

    AutoMaticDeployment---自动部署 项目简介 使用Github的webhooks进行代码的自动化部署 本项目是个人最近搞的一个小工具,自己最近在用hexo部署个人博客(地址:http ...

  2. devops持续集成,Centos7.6下gitlab+jenkins(pipeline)实现代码自动上线

    持续集成 gitlab+jenkins(pipeline)实现代码自动上线 环境准备:Centos7.6版本ip:192.168.0.13 主机名:gitip:192.168.0.23 主机名:jen ...

  3. 使用 SVN Hook 实现服务器端代码自动更新

    之前的做法是客户端提交代码之后,再去服务器端项目中 svn up 一下来更新代码,让服务器端的项目更新到最新版本.可以编写一个 post-commit 钩子脚本来实现服务器端代码的自动更新,它在 SV ...

  4. 分享下使用 svn,测试服务器代码自动更新、线上服务器代码手动更新的配置经验

    分享下使用 svn,测试服务器代码自动更新.线上服务器代码手动更新的配置经验 利用SVN的POST-COMMIT钩子自动部署代码 Linux SVN 命令详解 Linux SVN 命令详解2 使用sv ...

  5. Git github webhook 自动更新/部署代码 php自动更新脚本

    这几天尝试了利用github的webhook,当代码更新到github,我们的测试服务器自动更新最新的gitbub仓库代码. 先列几个大概步骤,有时间再补充详细 1 . 服务器生成ssh key,一般 ...

  6. 如何一键部署项目&&代码自动更新

    my-deploy : 由nodejs写的一个自动更新工具,理论支持所有语言(php.java.c#)的项目,支持所有git仓库(bitbucket.github等). Github 效果如何? 如果 ...

  7. Jenkins去GitLab拉取Java代码自动打包

    jenkins的部署 一.部署git 1)先检查系统是否已经自带了git,如果有,就卸载 $ rpm -qa | grep git && rpm -e git --nodeps 2)开 ...

  8. 建立apk定时自动打包系统第三篇——代码自动更新、APP自动打包系统

    我们的思路是每天下班后团队各成员在指定的时间(例如下午18:30)之前把各自的代码上传到SVN,然后服务器在指定的时间(例如下午18:30)更新代码.执行ant 打包命令.最后将apk包存放在指定目录 ...

  9. linux svn hooks代码自动更新至项目

    由于开发移动端web,ui需要及时看到样式变化,所以通过svn hooks(钩子)来提交文件,然后再把文件同步到测试服务器项目目录,步骤如下: 1.进入 /home/svn/cmall/hooks ( ...

  10. gitlab和Django实现push自动更新

    1.设置webhook gitlab->setting->webhook:http://121.143.191.166:7000?token=23028-b396-12e5-9912-ba ...

随机推荐

  1. Postgresql WAL日志浅析

    一.预写日志(WAL) 预写式日志(Write Ahead Log,WAL)是保证数据完整性的一种标准方法.简单来说,WAL的中心概念是数据文件(存储着表和索引)的修改必须在这些动作被日志记录之后才被 ...

  2. PostgreSQL控制文件讲解及案例

    PostgreSQL控制文件内容: 主要分为是三部分,初始化静态信息.WAL及检查点的动态信息.一些配置信息. 我们可以用过pg_controldata命令直接读取PostgreSQL控制文件内容: ...

  3. pat乙级 1019 数字黑洞

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> ...

  4. 红米手机LineageOS Root(实操)

    https://magiskcn.com/ 机型:红米note8 采用Magisk进行root,LineageOS官网的suroot包不会玩,安装失败 从LineageOS系统包中解压出boot.im ...

  5. java 转发重定向

    首先我们要知道: (1)request.getRequestDispatcher()是请求转发,前后页面共享一个request ; 这个是在服务端运行的,对浏览器来说是透明的.(2)response. ...

  6. 基于线程的并行-Python 并行编程学习笔记(一)

    前言 最近写一些模拟集群智能的算法,虽然机制简单,但是随着个体的增加,设计的计算量就比较大了,尤其是加上matplotlib进行动态展示,使得运算量骤增,看着画面也比较卡.之前想把算法转化成c++代码 ...

  7. 监控系统grafana常见问题合集

    监控系统搭建完毕后,使用中确实存在不少的习惯问题. 系统组成: 展示界面:Grafana 核心系统:Promethus snmp监控:SNMP Exporter ping监控:Blackbox Exp ...

  8. HTTP知识点

    HTTP 请求/响应的步骤:(工作原理) 客户端连接到 Web 服务器 一个 HTTP 客户端,通常是浏览器,与 Web 服务器的 HTTP 端口(默认为 80)建立一个 TCP 套接字连接.例如,h ...

  9. The emulator process for AVD Pixel_4_XL_API_30 was killed 问题

    转载请注明来源:https://www.cnblogs.com/Sherlock-L/p/14946317.html 问题: 因为工作关系接触到了Android Studio,新建了4和11系统的模拟 ...

  10. (已解决)用phpstudy8创建个数据库(非root),结果没有访问权限。

    1. 问题 用phpstudy_pro,即最新版本,创建非root用户的数据库,然后后台访问它却提示没有权限. 2. 解决办法 进入系统自带的user表,修改权限.具体操作如下: a. 首先找到自己用 ...