普通公司小项目,传统更新线上代码是每次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 评论