1. Введение и функции Webhook
Webhook, как следует из названия, — это хук, короче говоря, он может инициировать определенное действие в конкретной ситуации. Например, когда в удаленном репозитории git выполняются push, tag и другие операции, код автоматически извлекается и компилируется на стороне удаленного сервера. Ниже приведены сгенерированные файлы, связанные с Webassembly, после того, как код был отправлен на удаленное хранилище, и код был автоматически извлечен для компиляции (.js,.wasm) и номер версии отправить в демоверсию в удаленном репозитории.
Во-вторых, демонстрационная реализация
1. Настройки склада (например, gitee)
Прежде всего, вам необходимо иметь права администратора проекта, щелкните вверху домашней страницы проекта.управлять, затем нажмите под левым менюWebHooksдля входа на страницу настроек, показанную на скриншоте ниже.
]В приведенном выше интерфейсе я добавил Webhook, тип триггера — push, а также пароль. Когда вы отправите код в удаленный репозиторий, он отправит запрос POST с установленным паролем на указанный здесь URL-адрес. Конечно, вы также можете проверить другие типы операций.
2. Реализация PHP-кода
- hooks.php
<?php
// 本地仓库路径
$local = '/data/wwwroot/default/hooks/laserbox';
// 安全验证字符串,为空则不验证
$token = '123456';
// payload为字符串,需要经过解析
$payload = file_get_contents('php://input');
if (!$payload) {
header('HTTP/1.1 400 Bad Request');
die('HTTP HEADER or POST is missing.');
}
$content = json_decode($payload, true);
// 如果启用验证,并且验证失败,返回错误
if ($token && $content['password'] != $token) {
header('HTTP/1.1 403 Permission Denied');
die('Permission denied.');
}
//最后会执行一个脚本编译代码,然后再push代码到远程
//所以会重复触发WebHooks,因此此处判断是否是本地的推送
if($content['commits'][0]['author']['name'] == 'handsomeTaoTao'){
header('HTTP/1.1 403 Permission Denied');
die('self push.');
}
/*
* 这里有几点需要注意:
*
* 1.确保PHP正常执行系统命令。写一个PHP文件,内容:
* `<?php echo shell_exec('ls -la')`
* 在通过浏览器访问这个文件,能够输出目录结构说明PHP可以运行系统命令。
*
* 2、PHP一般使用www-data或者nginx用户运行,PHP通过脚本执行系统命令也是用这个用户,
* 在通过浏览器访问这个文件,能够输出目录结构说明PHP可以运行系统命令。
*
* 2、PHP一般使用www-data或者nginx用户运行,PHP通过脚本执行系统命令也是用这个用户,
* 所以必须确保在该用户家目录(一般是/home/www-data或/home/nginx)下有.ssh目录和
* 一些授权文件,以及git配置文件,如下:
* ```
* + .ssh
* - authorized_keys
* - config
* - id_rsa
* - id_rsa.pub
* - known_hosts
* - .gitconfig
* ```
*
* 3.在执行的命令后面加上2>&1可以输出详细信息,确定错误位置
*
* 4.git目录权限问题。比如:
* `fatal: Unable to create '/data/www/html/awaimai/.git/index.lock': Permission denied`
* 那就是PHP用户没有写权限,需要给目录授予权限:
* ``
* sudo chown -R :www-data /data/www/html/awaimai`
* sudo chmod -R g+w /data/www/html/awaimai
* ```
*
* 5.SSH认证问题。如果是通过SSH认证,有可能提示错误:
* `Could not create directory '/.ssh'.`
* 或者
* `Host key verification failed.`
*
*/
// shell_exec函数默认是禁止的,无法使用的话需要进php.ini修改相关配置
//执行shell时,没有sudo仿佛会执行不成功,只执行一小段,加了sudo之后执行成功,可以为运行php的用户添加sudo权限,参考资料有相关问题
echo shell_exec("cd {$local} && sudo sh ./autoCompiled.sh");
die("done " . date('Y-m-d H:i:s', time()));
- autoCompiled.sh
#!/bin/sh
source /data/git/emsdk/emsdk_env.sh // 载入命令,否则在命令行中无法使用emcc等编译用的命令
cd /data/git/Webassembly-Lib/Demo/ // 进入到执行命令的目录中
git pull
rm -f src/version.h
git rev-list HEAD | sort > config.git-hash
LOCALVER=`wc -l config.git-hash | awk '{print $1}'`
if [ $LOCALVER \> 1 ] ; then
VER=`git rev-list origin/master | sort | join config.git-hash - | wc -l | awk '{print $1}'`
if [ $VER != $LOCALVER ] ; then
VER="$VER+$(($LOCALVER-$VER))"
fi
if git status | grep -q "modified:" ; then
VER="${VER}M"
fi
VER="$VER $(git rev-list HEAD -n 1 | cut -c 1-7)"
GIT_VERSION=r$VER
else
GIT_VERSION=
VER="x"
fi
rm -f config.git-hash
cat version.h.template | sed "s/\$FULL_VERSION/$GIT_VERSION/g" > src/version.h
# 编译和提交代码
make
git add .
git commit -m 'Auto Compiled By handsomeTaoTao'
git push
3. Заключение
В настоящее время в этой демонстрации реализована лишь относительно простая функция, которую можно дополнительно оптимизировать, например, когда браузер обращается к адресу, он отображает информацию о том, была ли последняя компиляция успешной, а в случае неудачи выводит сообщение об ошибке. , что удобно для отладки.
использованная литература
stackoverflow: php-sudo-in-shell-exec
Документация по конфигурации Gitee
Github, GitLab, Gitee используют веб-хуки для автоматического развертывания кода