Git post-recieve hook 来运行 virtualenv、Django 和各种 python 脚本

Posted

技术标签:

【中文标题】Git post-recieve hook 来运行 virtualenv、Django 和各种 python 脚本【英文标题】:Git post-recieve hook to run virtualenv, Django & various python scripts 【发布时间】:2020-11-13 21:14:49 【问题描述】:

我已经成功使用 Git post-receive hook 将文件从本地推送到服务器一段时间了,在我的 post-receive 文件中使用以下内容:

#!/bin/sh  

git --work-tree=/home/myuser/myproject/app --git-dir=/home/myuser/myproject/myproject.git checkout -f 

现在我还想启动虚拟环境,在使用post-receive 将文件推送到服务器后运行 Django manage.py 和各种 python 脚本。

基于其他question,我在我原来的post-receive 文件中添加了以下内容:

#!/bin/sh  

git --work-tree=/home/myuser/myproject/app --git-dir=/home/myuser/myproject/myproject.git checkout -f 
source /home/myuser/venv/bin/activate
python /home/myuser/myproject/manage.py makemigrations
python /home/myuser/myproject/manage.py migrate
python /home/myuser/myproject/app/python_script1.py
python /home/myuser/myproject/app/python_script1.py
sudo systemctl restart gunicorn

但似乎虚拟环境没有启动给我错误:

remote: hooks/post-receive: 4: hooks/post-receive: source: not found

此外,剩余的错误似乎与虚拟环境未启动有关。 manage.py 不执行并出现以下错误:

SyntaxError: invalid syntax
remote:   File "/home/myuser/myproject/manage.py", line 16
remote:     ) from exc

python 脚本似乎可以运行,但由于虚拟环境没有启动,它们没有找到模块。

路径、文件名等都是正确的。编辑添加:Django、python 脚本和虚拟环境成功独立运行,用户没有 sudo 密码权限,例如 user ALL = NOPASSWD: /bin/systemctl restart gunicorn

编辑添加:远程服务器是 Ubuntu 18

我的代码有什么明显错误或缺失的地方吗?

【问题讨论】:

【参考方案1】:

结果证明解决方案非常简单。我只需要改变shebang。

来自:#!/bin/sh

收件人:#!/bin/bash

【讨论】:

以上是关于Git post-recieve hook 来运行 virtualenv、Django 和各种 python 脚本的主要内容,如果未能解决你的问题,请参考以下文章

Git Hook开发实践总结

sh 一个git pre commit hook,它使用gradle包装器运行测试任务

sh 一个git pre commit hook,它使用gradle包装器运行测试任务

sh 一个git pre commit hook,它使用gradle包装器运行测试任务

sh 一个git pre commit hook,它使用gradle包装器运行测试任务

sh 一个git pre commit hook,它使用gradle包装器运行测试任务