使用码云,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
使用码云,GitHub进行版本控制,并通过WebHook进行自动部署的更多相关文章
- 利用github的webhook进行自动部署
利用github的webhook进行自动部署 github提供了webhook功能,大概意思就是,当你提交了代码,git检测到你进行了push,可以调起你一个你知道的url. 这个功能有什么用了?比如 ...
- IDEA将项目上传至码云/GitHub托管
怎么将本地的项目放到码云或者GitHub去托管了?(以码云为例) 一.创建远程项目 第一步:点击创建项目 第二步:填写项目相关信息 第三步:复制远程的项目地址,注意:此处码云官方已经给出上传项目方法, ...
- Git初次使用总结,安装到上传代码,多平台[码云|github]
安装步骤 1.选择安装路径 2.选择创建图标,选择安装Git Bash和Git GUI 3.选择创建开始菜单 4.选择:use git and optional unix tools from the ...
- PyCharm+git+码云实现project版本控制
1.安装git https://git-scm.com/downloads 2.PyCharm中配置 3.申请码云 4.PyCharm中安装码云插件 右键选择,重启Pycharm. 重新打开PyCha ...
- 解决本地项目推送到码云(github),上提示:failed to push some refs to ...
本地项目上传github 命令如下: 1.git init 2.git add . 3.git commit -m "init" 4.git remote add origin ...
- 码云&Github 个人代码资源快速查找
1.Siri SiriShortCut
- git之sourceTree使用github和码云的代码小结
16.使用git出现的错误记录 15. Permission denied (publickey)错误: git远程库与本地库同步 git设置ssh公钥 Bad escape character ' ...
- git的基本操作命令和码云的注册使用
Git文件操作文件的四种状态版本控制就是对文件的版本控制,要对文件进行修改.提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上. Untracke ...
- 码云IntelliJ IDEA
将项目从码云clone到IntelliJ IDEA https://blog.csdn.net/wust_lh/article/details/68068176 用IDEA上传本地项目到码云/Gith ...
随机推荐
- 简单搭建docker registry
已知信息: 服务端IP:192.168.7.2xx 客户端IP:192.168.7.1xx 服务端: docker registry中镜像本地映射地址:/Users/dockergit/private ...
- 关于ssh的几个功能
这个有许多介绍的. 通过ssh可以实现远程shell命令行登录,x window登录,端口转发,scp文件复制,本地与远程命令间的管道连接,sftp文件传输与管理,包括同步,以及rsync文件同步,还 ...
- 剑指Offer-42.和为S的两个数字(C++/Java)
题目: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. 分析: ...
- table+分页+模糊查询
这个分页超级棒嘞. 网页链接:http://www.cssmoban.com/cssthemes/7528.shtml
- python之字符串的拼接总结
加号连接 1.通过+号连接起来 逗号连接 2.通过都好连接起来 但是,这里值得注意的是,只能用于print打印,赋值组操作会生成元组 直接连接 3.直接连接中间有无空格均可 %连接 在python2. ...
- java对象引用测试
代码 java中初始化一个实例,这个实例对应的只是对象的一个地址,并不是对象本身.将这个实例赋值给别的实例时,新实例也是指向对象的地址,两个实例实际指向的是同一个实例.对新实例赋值,老实例也会同时改变 ...
- java高并发系列 - 第20天:JUC中的Executor框架详解2之ExecutorCompletionService
这是java高并发系列第20篇文章. 本文内容 ExecutorCompletionService出现的背景 介绍CompletionService接口及常用的方法 介绍ExecutorComplet ...
- ASP.NET MVC教程四:ASP.NET MVC中页面传值的几种方式
准备 在Models文件夹里面新添加Student实体类,用来模拟从Controller向View传递数据,Student类定义如下: using System; using System.Colle ...
- Python语法易错点
列表.数组赋值 a = [1,6] b = a * 2 b[0] = -9999 print(a) print(b) [1, 6] [-9999, 6, 1, 6] a = [1,6] b = a b ...
- .netcore 文件上传转为base64位字符串
.netcore文件上传Api接口,和正常的webForm提交类似,只是用postman测试接口时,记得给form表单命名,否则获取上传文件数量一直为0 后端代码 using System; usin ...