使用码云git的webhook实现生产环境代码的自动pull

普通公司小项目,传统更新线上代码是每次ftp/sftp上传,或提交到svn/git后再ssh到线上环境中去手动拉取代码,十分麻烦,虽然用上了版本控制,逼格还是不够高啊!
现在的线上仓库都支持hook技术,可以很方便的实现代码的自动化管理。比如我现在使用gitee.com仓库的webhook功能,监听master分支有push动作时,可以自动通过设置的hook通知生产环境中的脚本执行git pull拉取代码,自动更新,非常方便。

1. 设置并使用公钥实现免密码
目标环境中使用

ssh-keygen -t rsa -C "xxxxx@zh30.com"
#cat ~/.ssh/id_rsa.pub 查看公钥信息

一路回车生成公钥,在码云项目管理-部署公钥管理中,提交这个公钥串。
修改项目.git/config文件的url为如下格式

[remote "origin"]
url = git@gitee.com:xxxxx/xxx.git

git pull 测试

2. 根目录或其它位置放一个php文作用webhook的通知接口,内容如下:

// 本地仓库路径 项目目录
$local = '/home/wwwroot/your_project';

// 密码 gitee项目管理webhook中设置
$password = '654321';

//如果请求体内容为空,返回错误
$payload = file_get_contents('php://input');
if (!$payload) {
header('HTTP/1.1 400 Bad Request');
die('HTTP HEADER or POST is missing.');
}

// 如果启用验证,并且验证失败,返回错误
// gitee默认返回json,解析json后验证密码
$data = json_decode($payload, true);
if(empty($data) || $data['password'] != $password) {
header('HTTP/1.1 403 Permission Denied');
die('Permission denied.');
}

// 如果仓库目录不存在,返回错误
if (!is_dir($local)) {
header('HTTP/1.1 500 Internal Server Error');
die('Local directory is missing')}

//输出执行结果 包括错误信息,在gitee webhook中可以查看和测试
echo shell_exec("cd {$local} && git pull 2>&1");
die("done " . date('Y-m-d H:i:s', time()));

3. 码云项目管理中,webhooks管理,添加,配置这个php的地址和对应的明文密码。保存测试,页面下方会显示最后一次的脚本执行信息。

4. 执行出错的话,很多时候是权限问题。php脚本一般是由www或www-data等帐户权限来执行,所以整个项目目录对此帐户要有权限读写,比如全局chown -R www:www .。
可能需要把/root/.ssh和/root/.gitconfig 拷贝到/home/www中。

真的非常好用,现在就不需要再登录到ssh上手动git pull更新了,本地开发完测试完成后,直接push到git后,线上就自动更新了~~

参考文章:使用webhooks自动部署Github、GitLab、Gitee代码

本文链接:https://my.lmcjl.com/post/11.html

展开阅读全文

4 评论

留下您的评论.