LINUX.ORG.RU

uwsgi + python + venv + popen - не работает

 , , , ,


1

1

Привет, пытаюсь написать ресивер для гитовских веб хуков.

Все отлично, но в конце мне надо выполнить команду git pull.

И все работает когда скрипт запущен руками, но когда он запущен из под uwsgi , то все.

Если я использую gitpython, то на uwsgi он выдает fatal: unable to fork Если я использую Popen, то при запуске через uwsgi в stdout тишина и ничего не происходит. но при запуске с консоли все работает.


...

pullcmd = ["/usr/bin/git","--git-dir=/var/www/test-repo/.git,"--work-tree=/var/www/test-repo/","pull"]
    p = subprocess.Popen(pullcmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    print(p.stdout.readline())
    print(p.stderr.readline())
    logging.info(p.stdout.readline())
    logging.info(p.stderr.readline())

# or with gitpython
#g = git.cmd.Git(git_dir)
#try:
    #    g.pull()
    #except git.exc.CommandError as e:
        #print(e)
    #    return json.dumps({'status': str(e)}) , 500

cat app.ini 
[uwsgi]
module = wsgi:app


master = true
processes = 5

socket = /tmp/webhook.sock
chmod-socket = 660
vacuum = true

die-on-term = true
 cat wsgi.py 
#!/usr/bin/env python3



from webhook import app


if __name__ == "__main__":
    app.run()
cat /etc/systemd/system/webhook.service 
[Unit]
Description=uWSGI instance webhook
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/opt/webhook
Environment="PATH=/opt/webhook/env/bin"
#Environment="GIT_PYTHON_GIT_EXECUTABLE=/usr/bin/git"
ExecStart=/opt/webhook/env/bin/uwsgi  --ini /opt/webhook/app.ini
#ExecStart=/usr/bin/uwsgi  --ini /opt/webhook/app.ini

[Install]
WantedBy=multi-user.target

★★★★

Последнее исправление: constin (всего исправлений: 1)

Ответ на: комментарий от Cirno

gunicorn не пробовал?

пока нет. решил написать сюда, может что-то скажет, «ха, ерунда, потому что вот». Те хочу понять почему.

Думал, что дело в venv, но вот же работает:

/opt/webhook# source env/bin/activate
(env) root@ubuntu-2gb-nbg1-2:/opt/webhook# python3 webhook.py 
 * Serving Flask app "webhook" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
b'Updating c483513..985103e\n'
b'From git.xxxxx.com:xxxx/test-repo\n'

constin ★★★★
() автор топика
Ответ на: комментарий от Cirno

попробовал, тоже самое - тишина в stdin/err от popen

constin ★★★★
() автор топика
Последнее исправление: constin (всего исправлений: 1)

запихал /usr/bin/touch /tmp/llllllll и получил это.

значит все же оно не видит дальше venv

FileNotFoundError: [Errno 2] No such file or directory: ‘/usr/bin/touch /tmp/llllllll’: ‘/usr/bin/touch /tmp/llllllll’

constin ★★★★
() автор топика
Ответ на: комментарий от constin

touch заработал с shell=True

p = subprocess.Popen(pullcmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

git все равно молчит

constin ★★★★
() автор топика

в общем, убрал venv. без него работает

constin ★★★★
() автор топика

я идиот. p.stdout.readline()) выдает не весь аутпут, а только последнюю пустую строку:))

constin ★★★★
() автор топика

У питона вроде должны быть человеческие биндинги к libgit2, используй же их, не форкай процессы в вебхуках.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.