gitlab 有一个 webhooks 的功能,可以在指定分支 push 事件触发时,自动调用 URL 部分,这个可以 URL 可以是一个 PHP 脚本,里面包含了 git pull 等 bash 执行的语句,这样,每次提交代码到 gitlab,测试站(或者项目相关之类的站点)会自动拉去最新的代码,方便测试。

而宝塔面板里有一个 webhook 的插件,可以生成一个 URL,每次调用这个 URL,就可以执行一次 bash 脚本。其中的脚本可以自定义。这边的自动 pull 脚本如下:

if test $1 = 'xxx'
then
    echo '代码更新开始:' $(date '+%Y-%m-%d %H:%M:%S')
    cd /path/to/xxx
    git pull origin master
    echo '代码更新完成:' $(date '+%Y-%m-%d %H:%M:%S')
fi

以上脚本需要修改三个部分:$1 是外部带入的参数,对应 URL 中的 param。这个参数值这边考虑为项目名称和文件名称,path/to/xxx 为需要切换到的项目目录。最后是 pull 命令的执行,一般第一次需要指定 origin 源,这边对应的分支可以是 master,也可以是测试分支。

但在把宝塔 webhook 生成的 URL 添加到 gitlab 中的 webhook 后,测试调用发现,宝塔的 webhook 调用次数显示已调用,但日志里包括项目下 git log 都显示没有执行 pull。

代码更新开始: 2022-06-22 16:52:02
代码更新完成: 2022-06-22 16:52:02

看到其他更新成功的 webhook 日志,中间是有 pull 的内容的,即使当前分支为最新版本,也会显示一个 Already up-to-date.

一开始以为是 webhook 执行脚本的用户权限不够,但通过在 bash 中增加 who 输出发现,脚本执行者就是 root。

之后想到可以在 bash 中嵌套执行 bash,写一个 sh 脚本,然后设置这个文件的用户及用户组等等,但这依然没有效果。

然后想到可以获取 git pull 执行结果,再输出来看是否报错或者什么内容。网上找到两种方式获取命令执行结果:

  • 使用反引号 ``,例如:`a=`echo "hello world"
  • 使用 $(),例如:a=$(echo "hello world")

但这样依然没有任何的结果输出。

最后同事说找个一个教程,重启一下宝塔,重启之后测试好了。