记录git使用webhook自动同步仓库代码到生产服务器

记录git使用webhook自动同步仓库代码到生产服务器 环境远程仓库来保存记录代码版本当有新的版本合并提交后自动将代码同步到生产服务器。本文以宝塔环境为例来记录使用过程。一、在宝域中安装 webHook在应用中搜索 webHook 会有个宝塔webHook3.0.6 版本会有变化。直接安装即可。如下图安装完以后需要添加Hook点击webhook应用右侧的设置链接会弹出下图对话框点击”添加Hook 填个名称 执行脚本先空着。然后点击上个图即hook列表中的查看密钥如下图注意这里get、POST地址要是可以访问的如果这里显示的是内网IP地址你要转换成外网的。后面param的参数建议写成仓库的地址后面会用到。二、配置git仓库端2.1 配置设置个人令版以阿里云效为例右上角的个人设置找到个人访问令牌如下图然后新建一个令牌设置权限。我们这个只用来读git仓库所以就只选一个就可以了。然后保存好你的令牌字符串。题外话这信令版是一种访问方式其它还有ssh , https 把你的账号密码授权保存到服务器上等这个暂不展开。有兴趣可以自己搜索试试。另一种是git config --global user.email youexample.comgit config --global user.name you name2.2 设置webHook找到你的代码仓库点击设置找到webhooks 不周的git服务商位置不太一样。gitee的略有区别。点击新建webhookURL 就是你在Bt中可看密钥那个对话框下面的get/postURL。token就是你查看的密钥。三、写同步代码#!/bin/bash echo date --date0 days ago %Y-%m-%d %H:%M:%S echo Start $1 branchmaster gitPath/www/wwwroot/abc.com gitHttphttps://username:令牌仓库地址.git echo 商城: $gitPath # 如果目录不存在则创建并克隆 if [ ! -d $gitPath ]; then echo 项目路径不存在新建并克隆 mkdir -p $gitPath cd $gitPath # 直接克隆到当前目录无需临时目录 git clone $gitHttp . # 克隆后目录已存在 .git无需额外操作 else cd $gitPath # 如果目录存在但没有 .git可能是非仓库目录需要克隆 if [ ! -d .git ]; then echo 目录存在但没有 .git重新克隆 # 备份原有内容可选 mv $gitPath $gitPath.bak mkdir -p $gitPath cd $gitPath git clone $gitHttp . fi fi # 确保当前目录是仓库根目录且 origin 正确 cd $gitPath # 更新远程地址确保使用带令牌的地址 sudo git remote set-url origin $gitHttp 2/dev/null || git remote add origin $gitHttp echo 拉取最新的项目文件 # 直接拉取并强制重置到远程分支 sudo git fetch origin sudo git reset --hard origin/$branch echo 设置目录权限 chown -R www:www $gitPath echo End这里着重说一点gitHttp这个变量的构成https://用户名:令牌仓库地址。用户名就是你同步git仓库时用的用户名在云效里是在HTTPS密码处查看其它平台自己找。仓库地址就在代码库的代码中查看这个要不知道就没办法了。注意一点组合完后后面是没有httpshttps放到了前面。最后把脚本复制到bt的webHook中下图点“编辑”即可。四、测试1. 在bt中测试脚本在这里点测试。会手动执行你的脚本代码。2. 测试远程是否有效。在仓库管理中找到webhook点测试。看是否驱动了webhook.3. 合并自动驱动。你根据这个触发事件来合并代码看是否会驱动。补充一点这连接用的是个人令牌。还有一个可以用公钥来连接的配置方法如下1. 在linux命令行执行下面操作生成证书。sudo -u www ssh-keygen -t rsa -C xxxxxx.com第一个提示输入key的目录 直接回车。过程中会有提示 Enter passphrase 让输入密码直接回车不要输入。查看公钥cat /home/www/.ssh/id_rsa.pub然后在云效中找到自己的项目点击“新建密钥”把id_rsa.pub 内容复制到这里。然后你的代码需要稍改动一下。#!/bin/bash echo #输出当前时间 date --date0 days ago %Y-%m-%d %H:%M:%S echo Start $1 branchmaster #判断宝塔WebHook参数是否存在 #if [ ! -n $1 ]; then # echo 项目参数不能为空 # echo End # exit #fi # 服务器上项目的路径$1是传过来的参数 gitPath/wwwroot/authabc # 你自己的仓库 SSH 地址 gitHttp账号codeup.aliyun.com/****auth.git echo Web站点路径$gitPath #判断项目路径是否存在 if [ -d $gitPath ]; then cd $gitPath #判断是否存在git目录 if [ ! -d .git ]; then echo 在该目录下克隆 git git clone $gitHttp gittemp mv gittemp/.git . rm -rf gittemp fi #拉取最新的项目文件 sudo git checkout $branch sudo git reset --hard origin/$branch sudo git pull origin $branch /install/site/logs/webhook.log 21 #设置目录权限 chown -R www:www $gitPath #chmod -R 0755 $gitPath echo End exit else echo 该项目路径不存在 echo End exit fi注意这里的仓库用的是ssh地址其它区别不大。(结束