赞
踩
在自己的服务器上打通git远程仓库以及利用gitee提供的webhook来实现php项目的自动部署,刚开始一切都很顺利,大致步骤如下:
1、新建仓库
这样就可以了
2、确保windows本地是安装了git的,没有就安一个,然后cmd执行
- git config --global user.name "小小鬼Leo"
- git config --global user.email "540882814@qq.com"
3、进入到进到php的www目录,然后执行以下代码
git clone git@gitee.com:xiaoxiaogui/test.git
4、这时候我们可以在test目录下增加文件,我这里加的111.txt
5、右键选择Git Bash Here,然后执行以下代码
- git add .
-
- git commit -m '第一次提交代码'
-
- git push -u origin master
然后,可以在仓库里看到,已经多了一个111.txt文件
至此,本地到gitee仓库的环节已经打通,下一步,配置webhooks钩子程序,用来在本地每一次push代码到gitee仓库的时候,自动部署代码到我们的web的服务器
6、以下代码就是钩子程序,把这个钩子程序部署到自己的web服务器上,并且要外部可以访问
- public function index(){
- // 检测IP,gitee 180.76.198.77
- // if (!in_array($_SERVER['REMOTE_ADDR'], $allowIpArr)) {
- // echo '非法IP:' . $_SERVER['REMOTE_ADDR'];
- // exit(0);
- // }
-
- // 获取请求参数
- //$headers = getallheaders();
- $body = json_decode(file_get_contents("php://input"), true);
- // 请求密码
- $password = 'gwuido124wdgq4dmif';
-
- // 验证提交分支是否为master
- if (!isset($body['ref']) || $body['ref'] !== 'refs/heads/master') {
- echo '非主分支' . $body;
- exit(0);
- }
-
- // 验证提交密码是否正确
- if (!isset($body['password']) || $body['password'] !== $password) {
- echo '密码错误';
- exit(0);
- }
-
- // 验证成功,拉取代码
- $path = $body['project']['path'];
- $command = 'cd /var/www/html/' . $path . ' && git pull 2>&1';
- $res = shell_exec($command);
- return json($res);
- }
获得访问地址https://test.mylifestyle.top/hooks
然后就把这个访问地址复制,去gitee的仓库详情-管理-添加webhook
填写到url地址栏,然后点击添加按钮
7、在我们自己的web服务器去生成公钥,然后把公钥内容复制到gitee仓库-管理-部署公钥管理,生成公钥的方法请按SSH 公钥设置 | Gitee 产品文档所说的去做,这里不赘述
8、然后在我们自己的web服务器上去git clone git@gitee.com:xiaoxiaogui/test.git
9、这里基本上就完成了,照理说之后windows本地每一次提交的时候,gitee就会回调我们设置的webhook的钩子程序去同步代码到我们的web服务器上,但是实际却会报
error: cannot open .git/FETCH_HEAD: Permission denied
这个时候是因为.git文件夹的权限问题,只需要cd到test目录下,给git目录加权限
- chmod -R 777 .git/
-
- chmod -R 777 .
然后继续,你是不是觉得这下肯定万无一失了?错!大坑来了,又报个这个
- Host key verification failed.
- fatal: Could not read from remote repository.
-
- Please make sure you have the correct access rights
- and the repository exists.
10、这就很让人费解,因为自己手动在服务器上执行git pull都可以,但是通过本地push的方式gitee回调钩子程序中确是要报这个错,就很坑。原来是我们在第7步生成公钥的时候,是生成的root用户的公钥,然而php运行时并不是root用户!怎么破?于是我写了个php程序,把运行时使用的.ssh目录打印出来
- public function test(){
- //查看php执行git命令时所处的用户目录
- $command1 = 'cd ~/.ssh && pwd';
- $res1 = shell_exec($command1);
- return json_encode($res1);
- }
打印结果
/usr/share/httpd/.ssh
网上很多人说,php一般在/var/www/html下运行,所以把/root/.ssh下的公钥文件和know_hosts文件复制过来就是了,并且也不讲原因,导致我走了好多弯路啦,还是这个程序靠谱,建议大家都用程序打印实际执行目录,显而易见,我这里应该把/root/.ssh下的文件移动到/usr/share/httpd/.ssh下,于是执行指令
cp /root/.ssh/* /usr/share/httpd/.ssh/
11、然后windows本地修改一个文件,push 到gitee,查看webhook的请求历史
- From gitee.com:xiaoxiaogui/test
- aa0b584..95b3bd8 master -> origin/master
- Updating aa0b584..95b3bd8
- Fast-forward
- application/index/controller/Index.php | 1 -
- 1 file changed, 1 deletion(-)
嗯,搞定
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。