使用码云,GitHub进行版本控制,并通过WebHook进行自动部署

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

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

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

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

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

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

  

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

码云版:

<?php
$data = json_decode(file_get_contents('php://input'),true);

// 码云WebHooks中配置的密码
$password = "123456";

// 你本地的项目路径
$path = "/data/wwwroot/test";

// 判断密码
if ($data['password'] === $password) {
    echo shell_exec("id -a");
    echo shell_exec("cd {$path} && /usr/bin/git reset --hard origin/master && /usr/bin/git clean -f && /usr/bin/git pull 2>&1");
    exit();
}

http_response_code(404);

GitHub版:

<?php

// GitHub项目 Settings/Webhooks 中的 Secret
$secret = "123456";

// 你本地的项目路径
$path = "/data/wwwroot/test";

// 验签
$signature = $_SERVER['HTTP_X_HUB_SIGNATURE'];

if ($signature) {
    $hash = "sha1=" . hash_hmac('sha1',file_get_contents("php://input"),$secret);
    if (strcmp($signature,$hash) == 0) {
        echo shell_exec("id -a");
        echo shell_exec("cd {$path} && /usr/bin/git reset --hard origin/master && /usr/bin/git clean -f && /usr/bin/git pull 2>&1");
        exit();
    }
}

http_response_code(404);

  

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

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

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

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

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

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

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。

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

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

chown -R www.www test 

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

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

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

 

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

这里以gitee为例:

<?php
$data = json_decode(file_get_contents('php://input'),true);

// 码云WebHooks中配置的密码
$password = "123456";

// 你本地的项目路径
$paths = [
    'master' => '/data/www/wwwroot/master','test' => '/data/www/wwwroot/test','develop' => '/data/www/wwwroot/develop',];

// 获取分支名
$ref = explode('/',$data['ref']);
$branch = end($ref);

// 判断密码
if ($data['password'] === $password && 
    $data['total_commits_count'] > 0 &&
    $paths[$branch]
) {
    $path = $paths[$branch];
    
    echo shell_exec("id -a");
    echo shell_exec("cd {$path} && /usr/bin/git checkout {$branch} 2>&1");
    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");
    exit();
}

http_response_code(404);

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

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

sudo -u www git checkout develop

  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


咱们在vscode中使用copilot的过程中,有可能会涉及到个人账号和其他账号的互相切换,在网上找了半天都没找到相应的资料,于是就自己摸索了一下,终于找到了方法。解决思路:经过试验,github copilot插件是使用的vsc
这篇文章给大家介绍怎么在GitHub上快速找到实用资源,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。搜热门:GitHub Trend 和 GitHub Top...
这篇文章主要介绍“github缓存穿透的解决方法是什么”,在日常操作中,相信很多人在github缓存穿透的解决方法是什么问题上存在疑惑,小编查阅了各式资料,整理出...
本篇内容介绍了“github线性回归怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧...
怎样使用GitHub,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。GitHub简介...
今天小编给大家分享一下GitHub的高级搜索方法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下...
这期内容当中小编将会给大家带来有关Github 1.9K Star的数据治理框架Amundsen如何理解,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可...
本篇文章为大家展示了git如何设置代理提升github clone速度,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。github...
本篇内容介绍了“github怎么实现FaceU边框模糊效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理...
本篇内容介绍了“GitHub基础操作有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧...
这篇文章主要介绍了Github操作技巧实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Github操作技巧实例分析文章都会有
今天小编给大家分享一下github设备激活的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大...
本文小编为大家详细介绍“GitHub的命令行工具有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“GitHub的命令行工具有哪些”文章能帮助大家解决疑惑,下面...
本篇内容主要讲解“GitHub网页githubusercontent地址无法访问怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大...
本文小编为大家详细介绍“怎么使用Github Action发布jar到Maven中央仓库”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用Github Action发布jar到Maven...
本文小编为大家详细介绍“GitHub中如何修改默认的分支”,内容详细,步骤清晰,细节处理妥当,希望这篇“GitHub中如何修改默认的分支”文章能帮助大家解决疑惑...
这篇“Github访问速度慢及图片加载慢问题怎么处理”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价
这篇文章主要介绍“vue项目打包上传github并制作预览链接的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue...
这篇文章主要讲解了“访问不了github怎么处理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“访问不了gith...
今天小编给大家分享一下GitHub访问不了怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希