利用WebHook实现自动部署Git代码
目录
类型
coding 钩子
github 钩子
环境
服务端:阿里云虚拟主机(Ubuntu16.04)
coding 自动部署 WebHook3.0
Windows 10 开发环境
部署
服务器虚拟主机配置
coding 代码托管配置
本地代码提交
服务端配置
1、创建web服务器用户目录
这里以www用户为例,不同的环境请根据自己环境自行修改
sudo mkdir /var/www/.ssh
sudo chown -R www:www /var/www/.ssh/
2、生成公钥(两个)
git用户公钥(个人公钥通用)
部署公钥(部署公钥用以部署项目, 只针对项目)
其实配置一个个人公钥就可以,也就是通用公钥了
3、用户公钥(
用于git clone时认证权限
ssh-keygen -t rsa -C "Tinywan@gmail.com"# 然后一直回车就行# 生成的文件通常是 /root/.ssh/id_rsa,如果非root用户请查看提示上的路径
4、部署公钥(非必需)
sudo -Hu www ssh-keygen -t rsa # 请选择 "no passphrase",一直回车下去#sudo cat /var/www/.ssh/id_rsa.pub # 这个只是针对单个项目的sudo cat /home/www/.ssh/id_rsa.pub # 查看生成的密钥内容,复制全部
-Hu www 命令:
-u 代表切换到哪一个用户,这里说的是www
-H 代表切换HOME环境变量的值,也就是password文件中www用户对应的home目录
5、准备钩子文件
在你的站点目录建立一个目录hook,我这里站点目录为:/home/www/web/,所有hook文件路径为:/home/www/web/hook,在hook目录新建index.php文件
参考demo
<?phperror_reporting(1);// 生产环境web目录$web_path = '/home/www/web/hook/auto-test';
$user = 'www';
$group = 'www';//作为接口传输的时候认证的密钥$valid_token = '1954FD0D6';//调用接口被允许的ip地址$valid_ip = array('192.168.14.2','192.168.14.1','192.168.14.128');
$client_ip = $_SERVER['REMOTE_ADDR'];$fs = fopen('./auto_hook.log', 'a');
fwrite($fs, 'Request on ['.date("Y-m-d H:i:s").'] from ['.$client_ip.']'.PHP_EOL);$json_content = file_get_contents('php://input');
$data = json_decode($json_content, true);fwrite($fs, 'Data: '.json_encode($data).PHP_EOL);
fwrite($fs, '======================================================================='.PHP_EOL);
$fs and fclose($fs);if (empty($data['token']) || $data['token'] !== $valid_token) { exit('aInvalid token request');
}$repo = $data['repository']['name'];$cmd = "cd $web_path && git pull";
shell_exec($cmd);
在hook目录下建立一个自己coding 项目名(只是为了统一,你可以新建一个其他的):auto-test
最后的目录结构为:
├── hook
│ ├── auto-test
│ │
│ └── index.php
6、修改目录权限
chmod -R u+x /home/www/web/hook
7、域名解析
解析一个域名到Linux系统,使用Nginx做一个代理,nginx虚拟主机配置信息如下:
server {
server_name auto.tinywan.com;
set $root_path /home/www/web/hook; root $root_path; location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=/$1 last;}} location ~ \.php$ { fastcgi_pass unix:/var/run/php7.1.9-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; fastcgi_connect_timeout 10000; fastcgi_send_timeout 6000; fastcgi_read_timeout 6000;}
}
以上域名 auto.tinywan.com已经被A记录到Linux外网IP了,阿里云域名解析
8、验证的hook钩子目录的index.php文件可以访问
访问:http://auto.tinywan.com/index.php输出:error request // 表示可以正常访问
9、配置git
git config --global user.name "Tinywan"git config --global user.email "Tinywan@gmail.com" # 邮箱请与conding上一致
10、配置公钥
复制:/home/www.ssh/id_rsa.pub内容到个人设置页https://coding.net/user/account/setting/keys,【新增公钥】添加即可
id_rsa.pub 文件内容
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABBBABAQChrujULy3U56wS5jLJ0rAJMtv2MNABhbqU1kaiiiyUGFz9+Ndwel8o4dW4whmFRWBodDppc2gpDcF/UM6v7DLzHYOd/38BDp0vRz+zhgZ0BCfyeUV958tpTI6uQyjFil3jwDrKvDqeS4eVnb1fJZfnk/utcFCkVSjhae1sBqM10bkaQmsmwLKr7fN6DeUox9nYkknDqaD645wYplW/qFAXItHOaaZzgTpbAuEb4uss0BCtiutsDFsJwcuXlAsvg4xwsTmagdlz+FhTksCnGALcB10kaz0EY2g9NOHVCqQ4QU4TyNmUVwBHYfj6LAGALO4NAHfwErzKgqfRhBLzDsKB www@Tinywan
11、配置 WebHook
选择项目(auto-test) > 设置 > 【WebHook】 > 【新建 WebHook】 > 粘贴你的hook/index.php所在的网址:http://auto.tinywan.com/index.php, 令牌可选,但是建议写上。
稍过几秒刷新页面查看hook状态,显示为绿色勾就OK了
12、服务端初始化项目
我们需要先在服务器上clone一次,以后都可以实现自动部署了
sudo -Hu www git clone https://git.coding.net/Tinywan/auto-test.git /home/www/web/hook/auto-test/ --depth=1
13、Windows客户端
(1)开发端也克隆一份代码
$ git clone https://git.coding.net/Tinywan/auto-test.gitCloning into 'auto-test'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.Checking connectivity... done.
(2)新建文件index.php
<?phpecho "Hell Coding";
(3)提交本地的代码
$ git add ./$ git commit -m "test hook"$ git push -u origin master
(4)查看服务端文件是否已经更新
├── auto-test
└── index.php
发现目标目录里就刚才提交的index.php文件了
立即访问:http://auto.tinywan.com/auto-test/index.php
钩子file_get_contents(‘php://input’)接受的文件内容
{"ref": "refs/heads/master",
"before": "90d67c99a3077a7a6823c50a95275812471ecf47",
"commits": [
{"committer":
{"name": "Tinywan","email": "756684177@qq.com"},
"web_url": "https://coding.net/u/Tinywan/p/auto-test/git/commit/3e55e1c6aa0d064ba4fede1556f0e2bb14c0bed3",
"short_message": "json_encode($_SERVER)\n",
"sha": "3e55e1c6aa0d064ba4fede1556f0e2bb14c0bed3"}
],
"after": "3e55e1c6aa0d064ba4fede1556f0e2bb14c0bed3","event": "push","repository": {"owner":
{"path": "/u/Tinywan","web_url": "https://coding.net/u/Tinywan","global_key": "Tinywan","name": "Tinywan","avatar": "/static/fruit_avatar/Fruit-14.png"},"https_url": "https://git.coding.net/Tinywan/auto-test.git","web_url": "https://coding.net/u/Tinywan/p/auto-test","project_id": "3351025","ssh_url": "git@git.coding.net:Tinywan/auto-test.git","name": "auto-test","description": "auto-test"},"user": {"path": "/u/Tinywan","web_url": "https://coding.net/u/Tinywan","global_key": "Tinywan","name": "Tinywan",
"avatar": "/static/fruit_avatar/Fruit-14.png"},
"token": "1954FD0D6"
}
可能会遇到的问题
1、在网上按照步骤一步一步将公钥和部署公钥配置完成点击跳转参考地址
2、coding上可以成功ping的通,可是阿里云Linux服务器上面没有反应(文件没有自动部署呀)
首先判断hook脚本有没有执行。所以将脚本换成简单的脚本测试
看看是不是文件没有权限或者钩子文件有问题
token 配置无效问题
我已经在这里讨论了配置了token,但是接受不到
token 生成技巧
如:https://www.tinywan.com/进行md5加密:1989BC88338CB4DABEF20BD7C54FD0D6
配置一个共有的webhooks
为了不让每个项目都新建一个钩子
web目录结构
.
├── webhooks-test
│ └── index.php├── hook
│ └── auto_hook.log
nginx 配置
coding设置任何一个项目(webhooks-test)的hook地址为
http://webhook.tinywan.com/index.php
本地提交代码即可测试
Github自动部署
对于个人项目而言,有的人项目托管在github上,线上访问地址放在自有服务器上。平时自己开发的话,要先push到github,在到自己服务器上pull下来(服务器上装了git),特别麻烦。
github有个webhook,可以在push之后触发,这样我们就可以利用钩子出发服务器脚本,执行pull命令拉取最新代码了。
配置这个钩子,有几点坑需要提一下
1、我们服务器上的web文件,大多是用户和用户组都是www,所以平时运行那些PHP文件,也都是www用户运行的。那么我们就必须以www用户来吧代码仓库clone下来,
然后以www的身份去生成ssh密钥
ssh-keygen -t rsa -C "your_email@youremail.com"
生成之后记得把公钥放在github里的项目配置里。
2、github里有两种请求方式可供选择,一种是表单式post,我们可以正常用$_POST接收,还有一种是json式post,PHP只能用php://input去接收了,每次调取url都是带着密钥的,你需要判断密钥对,在pull,否则任何人都可以pull了
下面是github密钥的算法PHP版本
钩子代码
3、由于执行shell命令涉及到 php的exec方法,默认是不开启这个方法的,需要你去php.ini开启它
下图是钩子访问url的时候的返回数据
HeadersConnection: keep-alive
Content-Length: 22Content-Type: text/html; charset=UTF-8Date: Sun, 22 Jul 2018 02:26:23 GMTServer: Tinywan-server/1.0Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
Transfer-Encoding: chunkedVary: Accept-Encoding
X-Content-Type-Options: nosniff
X-Frame-Options: deny
X-XSS-Protection: 1; mode=block
BodyaInvalid token request
为什么我的提交记录不被github记录呢,为什么无法点亮小绿点?
git config --global user.name "your name" //配置用户名和github名称一致 否则不计入提交次数
git config --global user.email "your email" //配置emai
利用WebHook实现自动部署Git代码相关推荐
- 在gitlab 中使用webhook 实现php 自动部署git 代码
在技术团队讨论中,我们决定从svn 迁移到 git ,于是使用了gitlab,代码自动部署使用了webhook 在服务器上 1.开启PHP需要的环境支持 服务器环境必须先安装git 环境,webhoo ...
- webhook php自动部署,git利用webhook实现自动部署
在项目部署时,之前采用的方式是登录服务器手动去pull代码,这样做很麻烦而且在服务器管理上也存在一些风险,github和gitlab都提供有webhook功能,可以在项目发生某些变化时,系统向指定的U ...
- 利用gitHook实现自动部署
gitHook 当进行开发的环境在本地,而运行的环境要在服务端时,每一次提交代码都需要在服务端pull一次.而利用git的hooks功能,能够让我们省去这一步,下面我就以码云的webhooks为例,实 ...
- Jenkins之自动部署、代码安全扫描、自动化接口测试
搭建Jenkins wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo rpm -- ...
- 设置webhook_使用 WebHook 来自动部署 NodeJS 项目!
前言 在我们本地开发好一个 NodeJS 项目,如果想要给别人看的话一般来说都是需要部署到服务器上面的.如果你使用 github 或者 coding 这里代码托管的服务,只需要在服务器安装好环境且安装 ...
- jenkins使用webhook实现自动部署
最近有这样一个需求,git仓代码频繁提交,服务器需要同步更新,每天jenkins jobs要更新个十来次,容易打断手上正在做的事情.如果git代码提交和服务器代码更新两个动作可以联动,那会非常省事. ...
- gitlab 钩子 php,gitlab通过webhook.php自动部署标签
//git webhook 自动部署脚本 $savePath = "/home/house/wxorder/"; $requestBody = file_get_contents( ...
- 拒绝用户“root”@“localhost”的访问(使用密码:yes)_使用PHP和Github Webhook实现自动部署
前言 一般情况下,我们每次在使用Github时,每次push完代码后,都要手动到服务器上git pull一次,如果是vue之类的项目还要npm i和npm build. 当然我们可以写sh脚本来进行部 ...
- 记录-gitlab自动部署-git拉取代码失败构建失败 + linux系统升级git(yum安装 + 源码安装)
遇见的问题 fatal: git fetch-pack: expected shallow list 在使用gitlab自动构建部署时,遇到的一个问题我第一次构建部署的时候成功了,但是后面再去部署构建 ...
最新文章
- AI 天气预报准确度高于气象台,一张 GPU 1秒预测未来 90 分钟天气
- c++Primer再学习-练习Todo
- java不会自动提示_eclispe中打点不会提示的解决方法,以及自动补全
- HDU1258 DFS
- linux--GCC简单用法
- JVM 堆内存设置原理
- 6个用好大数据的秘诀
- git中Bash基本操作命令
- 冰点下载器的使用方法
- pc端软件怎么做性能测试,企点PC端性能测试——UI卡顿分析
- 史上最全的oracle常用知识总结
- java生产者消费者 阻塞_java之使用阻塞队列实现生产者,消费者模式
- 利用浏览器制作一款包含3D效果的演示文案
- JavaScript制作页面倒计时器
- IO模块软件处理方案
- Android 新版个税计算小demo程序
- iOS-Cannot find interface declaration for 'XX', superclass of 'XX'
- 选择企业最合适的人才 —— 谈谈因人设岗与因事设岗
- python int 转byte,byte转int
- Endnote中的参考文献是网页,应该如何设置呢?
热门文章
- 金蝶kis商贸采购单商品代码_金蝶KIS商贸高级版操作常见问题解答
- 计算机二级python考试大纲2020_【2020年9月全国计算机二级Python考试大纲】- 环球网校...
- kafka 不同分区文件存储_Kafka 系列(二)文件存储机制与Producer架构原理怎样保证数据可靠性??...
- 实用网站 |懒人爱学习
- mysql数字辅助表_关于数字的经典SQL编程问题:数字辅助表
- JSON数据格式转换(StringBuffer拼接json串)大全及用法
- 微信全文搜索优化之路
- 移动视频监控摄像机分类与优势浅析
- Python调用C语言函数
- MySQL服务器状态变量