我为我的Laravel应用程序做了这个后合并git钩子:它基本上检查已更改的文件和执行匹配的命令(运行迁移、编译资产等等)。
#!/bin/bash
set -ex
CHANGED_FILES="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"
changed() {
echo "$CHANGED_FILES" | grep -q "$1"
}
if [[ "$USER" == "root" || "$USER" == "ec2-user" ]]; then
sudo chown -R www-data: htdocs
fi
if changed composer.lock; then
docker-compose run --rm worker bash -c "composer install"
fi
if changed "migrations\|seeders"; then
docker-compose run --rm worker php artisan migrate --force --seed
fi
if changed .blade.php$; then
docker-compose run --rm worker php artisan view:clear
fi
if changed .php$; then
docker-compose run --rm worker bash -c "php artisan cache:clear && php artisan route:clear"
fi
if changed "yarn.lock$\|.js$\|.scss$"; then
docker-compose run --rm node bash -c "yarn && yarn prod"
fi
if changed httpd.conf; then
docker-compose up -d --force-recreate apache
fi
docker-compose restart worker
exit 0如果我手动启动钩子,./.git-hook/post-merge (它在一个非常规文件夹中,所以钩子本身是提交的),它可以工作,但是当它由git执行时,它总是在创建容器之后挂起。这只发生在AMI linux上,它在我的mac上运行得很好。
输出如下所示
$ git pull
remote: Enumerating objects: 21, done.
remote: Counting objects: 100% (21/21), done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 13 (delta 8), reused 0 (delta 0), pack-reused 0
Decompressione degli oggetti in corso: 100% (13/13), 1.44 KiB | 490.00 KiB/s, fatto.
Da bitbucket.org:[my-private-repo]
ec60a04..def0d31 master -> origin/master
Aggiornamento di ec60a04..def0d31
Fast-forward
.git-hooks/post-merge | 2 +-
htdocs/app/Http/Controllers/ApiController.php | 25 ++++++++++++++++++++++---
2 files changed, 23 insertions(+), 4 deletions(-)
++ git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD
+ CHANGED_FILES='.git-hooks/post-merge
htdocs/app/Http/Controllers/ApiController.php'
+ [[ ec2-user == \r\o\o\t ]]
+ [[ ec2-user == \e\c\2\-\u\s\e\r ]]
+ sudo chown -R www-data: htdocs
+ changed composer.lock
+ echo '.git-hooks/post-merge
htdocs/app/Http/Controllers/ApiController.php'
+ grep -q composer.lock
+ changed 'migrations\|seeders'
+ echo '.git-hooks/post-merge
htdocs/app/Http/Controllers/ApiController.php'
+ grep -q 'migrations\|seeders'
+ changed '.blade.php$'
+ echo '.git-hooks/post-merge
htdocs/app/Http/Controllers/ApiController.php'
+ grep -q '.blade.php$'
+ changed '.php$'
+ echo '.git-hooks/post-merge
htdocs/app/Http/Controllers/ApiController.php'
+ grep -q '.php$'
+ docker-compose run --rm worker bash -c 'php artisan cache:clear && php artisan route:clear'
Creating www_worker_run ... doneCreating www_worker_run ... done是我最后看到的东西,然后输出停止(我等了几分钟就放弃了)
感谢@fredrik,我有更多的信息:挂起的命令是这个docker-compose run --rm worker bash -c 'php artisan cache:clear && php artisan route:clear',但是我可以在2.5秒内从shell运行它。
$ docker-compose run --rm worker bash -c 'php artisan cache:clear && php artisan route:clear'
Creating www_worker_run ... done
Application cache cleared!
Route cache cleared!发布于 2021-08-26 18:16:15
正如@fredrik所指出的,问题是git没有一个交互式终端,所以docker-复合命令正在失败。
-T选项仅适用于此。
来自docker run -h
-T Disable pseudo-tty allocation. By default `docker-compose run` allocates a TTY.https://stackoverflow.com/questions/68859202
复制相似问题