当前位置:博客首页>>分享经验 >> 阅读正文

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

作者: 郑晓 分类: 分享经验 发布于: 2018-05-31 23:53 浏览(2,622) 评论(4)


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

       

本文采用知识共享署名-非商业性使用 3.0 中国大陆许可协议进行许可,转载时请注明出处及相应链接。

本文永久链接: https://www.zh30.com/webhook-git-pull.html

使用码云git的webhook实现生产环境代码的自动pull:目前有4 条留言

用户评论头像 ljx发表于 2018年08月27日 17:31[回复]

老哥, 你这个文本编辑器(博文内容)不怎么好看, 不打算换一个么

    用户评论头像 郑晓发表于 2018年08月28日 11:36[回复]

    麻烦,不想弄。

      用户评论头像 哈哈发表于 2018年09月19日 13:23[回复]

      我看还好,哈哈~

用户评论头像 小橙子发表于 2018年06月07日 01:11[回复]

对我这个小白来说有点干