我们通常需要在 PUSH 代码到远程仓库时,线上环境会自动进行代码同步,这时候就需要用到WebHook,它会自动回调我们设定的http地址。

通过请求我们自已编写的脚本,来拉取代码,实现与远程仓库代码的同步。

一、我们先创建一个本地仓库

  1. echo "# 测试" > README.md
  2. git init
  3. git add README.md
  4. git commit -m "test"

在码云或 GitHub 上创建一个空仓库,比如:test,然后让本地仓库与远程仓库关联。

  1. git remote add origin https://gitee.com/xxx/test.git
  2. git push -u origin master

  

二、在本地仓库,添加WebHook文件,并提交到版本库

码云版:

  1. <?php
  2. $data = json_decode(file_get_contents('php://input'), true);
  3.  
  4. // 码云WebHooks中配置的密码
  5. $password = "123456";
  6.  
  7. // 你本地的项目路径
  8. $path = "/data/wwwroot/test";
  9.  
  10. // 判断密码
  11. if ($data['password'] === $password) {
  12. echo shell_exec("id -a");
  13. echo shell_exec("cd {$path} && /usr/bin/git reset --hard origin/master && /usr/bin/git clean -f && /usr/bin/git pull 2>&1");
  14. exit();
  15. }
  16.  
  17. http_response_code(404);

GitHub版:

  1. <?php
  2.  
  3. // GitHub项目 Settings/Webhooks 中的 Secret
  4. $secret = "123456";
  5.  
  6. // 你本地的项目路径
  7. $path = "/data/wwwroot/test";
  8.  
  9. // 验签
  10. $signature = $_SERVER['HTTP_X_HUB_SIGNATURE'];
  11.  
  12. if ($signature) {
  13. $hash = "sha1=" . hash_hmac('sha1', file_get_contents("php://input"), $secret);
  14. if (strcmp($signature, $hash) == 0) {
  15. echo shell_exec("id -a");
  16. echo shell_exec("cd {$path} && /usr/bin/git reset --hard origin/master && /usr/bin/git clean -f && /usr/bin/git pull 2>&1");
  17. exit();
  18. }
  19. }
  20.  
  21. http_response_code(404);

  

三、登陆线上服务器,为用户生成 SSH 秘钥,并配置码云或GitHub的项目公钥。

配置公钥主要的作用是免去每次 git 操作时需要输入密码。

注意,这里,我们要为 www 用户或 nobody 用户生成 ssh 秘钥,别搞错了。webhook 调用时,是 php 脚本当前执行的用户。

具体是哪个用户可以通过 echo shell_exec('id -a'); 来查看。

  1. sudo mkdir -p /home/www/.ssh
  2. sudo chown -R www.www /home/www/.ssh
  3. sudo -Hu www ssh-keygen -t rsa

一路回车,直到结束,系统会在用户的家目录,生成 id_rsa 和 id_rsa.pub 两个文件,即 id_rsa 密钥 和 id_rsa.pub 公钥。

  1. cat /home/www/.ssh/id_rsa.pub

然后在 码云 项目管理 -> 公钥管理 -> 添加公钥 ,把 id_rsa.pub 中的内容添加。

在GitHub 账号 -> Setting -> SSH and GPG keys ,把 id_rsa.pub 中的内容添加。

然后分别在码云和 GitHub 项目配置WebHook,注意地址必须能外网访问的。

四、登陆线上服务器,并使用 ssh 协议 clone 项目

注意,我们配置了项目的 ssh 公钥,拉取项目要走 ssh 协议,而不是 https。

  1. sudo -u www git clone git@gitee.com:xxx/test.git

注意,如果报错,  fatal: 不能创建工作区目录 'test': 权限不够 ,则需要创建一个同名 test 目录,并把目录所属用户修改成 www。

  1. chown -R www.www test

修改权限,注意你PHP运行时的用户是谁,一般为www,也有可能是 nobody

  1. sudo chown -R www .
  2. sudo chmod -R g+s .
  3. sudo -u www git pull

在本地提交文件,就可以看到代码自动同步到线上服务器了。

五、基于不同分支,来同步不同目录下的代码

这里以gitee为例:

  1. <?php
  2. $data = json_decode(file_get_contents('php://input'), true);
  3.  
  4. // 码云WebHooks中配置的密码
  5. $password = "123456";
  6.  
  7. // 你本地的项目路径
  8. $paths = [
  9. 'master' => '/data/www/wwwroot/master',
  10. 'test' => '/data/www/wwwroot/test',
  11. 'develop' => '/data/www/wwwroot/develop',
  12. ];
  13.  
  14. // 获取分支名
  15. $ref = explode('/', $data['ref']);
  16. $branch = end($ref);
  17.  
  18. // 判断密码
  19. if ($data['password'] === $password &&
  20. $data['total_commits_count'] > 0 &&
  21. $paths[$branch]
  22. ) {
  23. $path = $paths[$branch];
  24.  
  25. echo shell_exec("id -a");
  26. echo shell_exec("cd {$path} && /usr/bin/git checkout {$branch} 2>&1");
  27. echo shell_exec("cd {$path} && /usr/bin/git reset --hard origin/{$branch} && /usr/bin/git clean -f && /usr/bin/git pull origin {$branch} 2>&1");
  28. exit();
  29. }
  30.  
  31. http_response_code(404);

我们在本地创建三个目录,分别对应三个分支,其中一个分支代码更新时,则自动同步。

注意,本地通过 sudo -u www git clone xxx 拉取代码后,切换分支时,也需要指定用户,不然会有权限问题。

  1. sudo -u www git checkout develop

  

使用码云,GitHub进行版本控制,并通过WebHook进行自动部署的更多相关文章

  1. 利用github的webhook进行自动部署

    利用github的webhook进行自动部署 github提供了webhook功能,大概意思就是,当你提交了代码,git检测到你进行了push,可以调起你一个你知道的url. 这个功能有什么用了?比如 ...

  2. IDEA将项目上传至码云/GitHub托管

    怎么将本地的项目放到码云或者GitHub去托管了?(以码云为例) 一.创建远程项目 第一步:点击创建项目 第二步:填写项目相关信息 第三步:复制远程的项目地址,注意:此处码云官方已经给出上传项目方法, ...

  3. Git初次使用总结,安装到上传代码,多平台[码云|github]

    安装步骤 1.选择安装路径 2.选择创建图标,选择安装Git Bash和Git GUI 3.选择创建开始菜单 4.选择:use git and optional unix tools from the ...

  4. PyCharm+git+码云实现project版本控制

    1.安装git https://git-scm.com/downloads 2.PyCharm中配置 3.申请码云 4.PyCharm中安装码云插件 右键选择,重启Pycharm. 重新打开PyCha ...

  5. 解决本地项目推送到码云(github),上提示:failed to push some refs to ...

    本地项目上传github 命令如下: 1.git init 2.git add . 3.git commit  -m "init" 4.git remote add origin ...

  6. 码云&Github 个人代码资源快速查找

    1.Siri SiriShortCut

  7. git之sourceTree使用github和码云的代码小结

    16.使用git出现的错误记录  15. Permission denied (publickey)错误: git远程库与本地库同步 git设置ssh公钥 Bad escape character ' ...

  8. git的基本操作命令和码云的注册使用

    Git文件操作文件的四种状态版本控制就是对文件的版本控制,要对文件进行修改.提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上. Untracke ...

  9. 码云IntelliJ IDEA

    将项目从码云clone到IntelliJ IDEA https://blog.csdn.net/wust_lh/article/details/68068176 用IDEA上传本地项目到码云/Gith ...

随机推荐

  1. cookie、localStorage 和 sessionStorage 的使用以及区别

    localStorage 和 sessionStorage 的增删改查: 存储数据: sessionStorage.setItem('key', 'sessionStorage的值'); // 存储数 ...

  2. laravel 5.5.39 升级到 5.5.45 出现 cookie 序列化异常问题的解决

    把项目里的 laravel 5.5.39 升级到 5.5.45 后,出现如下报错: ErrorExceptionopenssl_encrypt() expects parameter 1 to be ...

  3. Linux系统:centos7下搭建ZooKeeper3.4中间件,常用命令总结

    本文源码:GitHub·点这里 || GitEE·点这里 一.下载解压 1.Zookeeper简介 Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供 ...

  4. IdentityServer4 常见问题 - 用户拒绝授权后报错

    1.问题说明 在 IdentityServer4 Web 授权中,一般会有一个显示客户端需要获取用户的那些信息的页面,询问用户是否同意: 在这个页面如果我们点击"No, Do Not All ...

  5. 签名时出错: 未能对** SignTool Error:

    项目在vs2010创建,在2017上运行时报签名时出错.......... 解决方法: 右键项目 - 属性-签名 -  创建测试证书 - 密码可以为空-确定

  6. 剑指offer笔记面试题12----矩阵中的路径

    题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左.右.上.下移动一格.如果一条路径经过了矩阵的某一格,那么该路径 ...

  7. 【前端知识体系-NodeJS相关】对NodeJS模块机制的理解

    1. CommonJS模块规范 1.1 模块引用 var math = require('math'); 1.2 模块定义 [!NOTE] 上下文提供exports对象用于导出当前模块的方法和变量,并 ...

  8. leaflet-webpack 入门开发系列三地图分屏对比(附源码下载)

    前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...

  9. Pandas:DataFrame数据选择方法(索引)

    #首先创建我们的Series对象,然后合并到dataframe对象里面去 import pandas as pd import numpy as np area=pd.Series({,,,}) po ...

  10. ABP入门教程10 - 展示层实现增删改查-控制器

    点这里进入ABP入门教程目录 创建控制器 在展示层(即JD.CRS.Web.Mvc)的Controllers下新建一个控制器CourseController.cs using Abp.Applicat ...