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. centos7 部署 loonflow

    a workflow engine base on django 基于django的工作流引擎系统(通过http接口调用,可以作为企业内部统一的工作流引擎,提供诸如权限申请.资源申请.发布申请.请假. ...

  2. 使用expect在实现跨机器拿日志

    1.shell脚本 config_file_path=$1 #集群的ip port=$2 #获取集群服务端口中的日志 sjc=$3 #时间戳 user_name="sdbadmin" ...

  3. navigator跳转

    navigator跳转  open-tab="switchTab"/open-type="navigate" <navigator url="/ ...

  4. ModuleNotFoundError:No module named 'past' 问题及解决方法

    训练YOLOX时报错 ModuleNotFoundError:No module named 'past' 解决方法 使用pip安装对应的package:future pip install futu ...

  5. Django,Flask中的request

    request的结构获取 class Upload(Resource): def post(self): print(curPath) print(request.files['file'].__di ...

  6. 记录下vue表单验证

    公共common文件夹下建立validate.js /* 是否邮编*/ export function validateMail(rule, value,callback) { const reg = ...

  7. Docker - Can't resolve instance hostname.

    Docker容器无法解析主实例主机名 在为redis集群搭建哨兵的时候遇到这个异常 解决方案:在配置文件中添加: ALLOW_EMPTY_PASSWORD=yes 参考文档:linux - redis ...

  8. 力扣(leetcode)题库0001-python3

    试一下leetcode的题库,不知道对于我这种小白要多长时,但是目标已经种下,去做就是了.You can do anything you set your mind to. 题目:题库链接 中:给定一 ...

  9. Centos7忘记root密码,修改root密码及其他用户密码

    具体步骤: 1.重启系统,在开机过程中,快速按下方向键↑和↓.在引导程序页面暂停. 2.选择第一行(背景高亮即为选中),按下键盘上的e,进入编辑模式 3.将光标一直移动到 LANG=en_US.UTF ...

  10. 【SSO单点系列】(5):CAS4.0 之JDBC

    deployerConfigContext.xml 修改对应添加以下代码 <bean id="SearchModeSearchDatabaseAuthenticationHandler ...