使用WebHook自动部署项目
今天在laravist.com看到了这个 Webhook 自动部署Git项目 这个教学视频,之前本身也想作这样作一个利用Git WebHook的自动化部署,但老是不成功,今天看到视频就想着再次尝试一下,虽然有视频参考但仍是遇到了一些坑,在这里我写下本身的部署过程.
注:
1.我是在de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(199, 37, 78); border-radius: 4px; " >coding.netde>作的操做,其余相似git库应该能够参考使用.
2.个人Web环境运行用户是de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(199, 37, 78); border-radius: 4px; " >wwwde>,因此部分操做会切换到de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(199, 37, 78); border-radius: 4px; " >wwwde>用户下.
3.须要把de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(199, 37, 78); border-radius: 4px; " >shell_exec()de>或者de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(199, 37, 78); border-radius: 4px; " >exec()de>两个函数从de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(199, 37, 78); border-radius: 4px; " >php.inide>的de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(199, 37, 78); border-radius: 4px; " >disable_functionde>中取消.
4.Web环境的运行用户须要Web部署目录的读写权限.
过程.
1.在de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(199, 37, 78); border-radius: 4px; " >coding.netde>新建一个库
2.在服务器上生成一个用来部署的Git Key:de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(199, 37, 78); border-radius: 4px; " >sudo -Hu www ssh-keygen -t rsade>
3.添加部署key到项目的部署公钥中.
4.在服务端执行克隆操做:de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(199, 37, 78); border-radius: 4px; " >sudo -Hu www git clone git@git.coding.net:XXXXXX/XXXXXXde>
5.添加一个可访问的部署文件deploy.phpphp
de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: inherit; padding: 0.5em; color: rgb(248, 248, 242); border-radius: 0px; display: block; background: rgb(35, 36, 31);" ><?php error_reporting(1); $target = '/www/web/imwhere/weixin/weiphp'; // 生产环境web目录 $token = '**************';//自定义token $json = json_decode(file_get_contents('php://input'), true); if (empty($json['token']) || $json['token'] !== $token) { exit('error request'); } $cmd = "cd $target && git pull"; exec($cmd); de>
6.添加deploy.php的连接到WebHook中.
7.本地push更新到coding.net服务端自动部署.html
推荐参考:
1.使用Git部署网站:http://www.imwhere.cn/index.php/archives/3/
2.利用WebHook实现PHP自动部署Git代码:http://m.aoh.cc/149.html
3.Webhook 自动部署Git项目:https://laravist.com/series/something-that-a-little-helpful/episodes/3
4.关于LINUX子目录须要父目录X权限的问题:http://www.imwhere.cn/index.php/archives/39/
5.coding.net WebHook 参数:https://open.coding.net/webhook.htmlgit
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------web
公钥有两个:1. git用户公钥,2. 部署公钥:shell
git用户公钥json
1
2
3
|
ssh-keygen -t rsa -C "admin@xsooo.com"
# 而后一直回车就行
# 生成的文件一般是 /root/.ssh/id_rsa,若是非root用户请查看提示上的路径
|
部署公钥服务器
sudo -Hu www ssh-keygen -t rsa # 请选择 “no passphrase”,一直回车下去ssh
建立和修改目录权限:ide
1
2
|
mkdir /home/wwwroot/website.com/hook
chown -R www:www /home/wwwroot/website.com/hook
|
写入钩子文件:函数
1
|
sudo -Hu www touch /home/wwwroot/website.com/hook/index.php
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
<?php
error_reporting(1);
$target = '/home/wwwroot/website.com'; // 生产环境web目录
$token = '您在coding填写的hook令牌';
$wwwUser = 'www';
$wwwGroup = 'www';
$json = json_decode(file_get_contents('php://input'), true);
if (empty($json['token']) || $json['token'] !== $token) {
exit('error request');
}
$repo = $json['repository']['name'];
// $cmds = array(
// "cd $target && git pull",
// "chown -R {$wwwUser}:{$wwwGroup} $target/",
// );
// foreach ($cmds as $cmd) {
// shell_exec($cmd);
// }
// 感谢@墨迹凡指正,能够直接用www用户拉取代码而不用每次拉取后再修改用户组
// $cmd = "sudo -Hu www cd $target && git pull"; 有问题
$cmd = "cd $target && git pull"; 改成这个
shell_exec($cmd);
|
确保你的hook文件能够访问:http://example.com/hook/index.php,钩子准备完成。
1
2
3
|
sudo -Hu www git config --global credential.helper store # 永久保存
sudo -Hu www git config --global user.name "Bantes"
sudo -Hu www git config --global user.email "admin@xsooo.com" # 邮箱请与conding上一致
|
复制de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; padding: 2px 4px; color: rgb(199, 37, 78); border-radius: 4px; " >/root/.ssh/id_rsa.pubde>内容到我的设置页的SSH公钥里添加便可(https://coding.net/user/account/setting/keys)
复制de style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; padding: 2px 4px; color: rgb(199, 37, 78); border-radius: 4px; " >/home/www/.ssh/id_rsa.pubde>的内容并添加到部署公钥:
选择项目 > 设置 > 部署公钥 > 新建 > 粘贴到下面框并确认
选择项目 > 设置 > WebHook > 新建hook > 粘贴你的hook/index.php所在的网址。好比:http://example.com/hook/index.php, 令牌可选,可是建议写上。
稍过几秒刷新页面查看hook状态,显示为绿色勾就OK了。
1.咱们须要先在服务器上clone一次,之后均可以实现自动部署了:
1
|
sudo -Hu www git clone https://git.coding.net/yourname/yourgit.git /home/wwwroot/website.com/ --depth=1
|
这个时候应该会要求你输入一次Coding的账号和密码,由于上面咱们设置了永久保存用户名和密码,因此以后再执行git就不会要求输入用户名和密码了。
**!!注意,这里初始化clone必需要用www用户**
2.往Coding.net提交一次代码测试:
在本地clone的仓库执行:
1
2
|
git commit -am "test hook" --allow-empty
git push
|
OK,稍过几秒,正常的话你在配置的项目目录里就会有你的项目文件了。