1

以下は私のgithookです:

import os
print 'hi from draj pre-receive githook'
import gitlab, subprocess

gitlab ubuntu インスタンスに ssh して実行すると、「hi from draj pre-receive githook」が正しく出力され、正常に終了します。

ただし、githook がインストールされているリポジトリにプッシュすると、次のようになります。

remote:     import os, gitlab, subprocess
remote: ImportError: No module named gitlab
To https://gitlab.learningdollars.com/root/00-boilerplate-draj.git
 ! [remote rejected] master -> master (pre-receive hook declined)

私はこれらの2つの投稿を見ました: How can I run a virtualenv python script as a git pre-commit hook and remote: ImportError: No module named gitlabで、環境変数が問題の原因であることを示唆しているようです。

そこで、環境を出力するように githook を変更しました。

import os
print 'hi from draj pre-receive githook'
print 'os.environ: ', os.environ
import gitlab, subprocess

そこで、gitlab インスタンスで pre-receive フックを直接実行したところ、次の結果が得られました。

hi from draj pre-receive githook
os.environ:  {'LANG': 'en_US.UTF-8', 'USERNAME': 'root', 'TERM': 'xterm-256color', 'SHELL': '/bin/bash', 'MAIL': '/var/mail/root', 'SUDO_UID': '[OBFUSCATED]', 'SUDO_GID': '[OBFUSCATED]', 'SUDO_COMMAND': '/var/opt/gitlab/git-data/repositories/root/00-boilerplate-draj.git/custom_hooks/pre-receive', 'LOGNAME': 'root', 'USER': 'root', 'HOME': '/home/ubuntu', 'PATH': '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin', 'SUDO_USER': 'ubuntu', 'LS_COLORS': '[OBFUSCATED]'}

しかし、pre-receive フックを呼び出すプッシュを実行しようとすると、次のようになります。

(venv)Govindas-MacBook-Pro:boilerplate_draj govindadasu$ git push origin master
Counting objects: 2, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 284 bytes | 0 bytes/s, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: hi from draj pre-receive githook
remote: os.environ:  {'HOME': '', 'GIT_DIR': '.', 'LD_LIBRARY_PATH': '', 'GL_ID': 'user-1', 'PATH': '/opt/gitlab/bin:/opt/gitlab/embedded/bin:/opt/gitlab/embedded/libexec/git-core:/opt/gitlab/embedded/libexec/git-core:/opt/gitlab/bin:/opt/gitlab/embedded/bin:/bin:/usr/bin'}
remote: Traceback (most recent call last):
remote:   File "/var/opt/gitlab/git-data/repositories/root/00-boilerplate-draj.git/custom_hooks/pre-receive", line 9, in <module>
remote:     import gitlab, subprocess
remote: ImportError: No module named gitlab
To https://gitlab.learningdollars.com/root/00-boilerplate-draj.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://gitlab.learningdollars.com/root/00-boilerplate-draj.git'

しかし、これらの記事で提供されていないのは、gitlab をインポートできるようにするために、pre-receive githook を使用して環境を正確に変更する方法です。

4

1 に答える 1

0

remote: ImportError: No module named gitlab had a hint towards the solution but it didn't work for me since bash pre-receive hooks didn't work on my gitlab instance only python ones did. So I created a generic pre-receive:

#!/usr/bin/env python
import os, subprocess
subprocess.call(['/usr/bin/python2.7', './custom_hooks/pre-receive.py'])

and as you can see just invoked the actual pre-receive from it using an installation of python which was working in an environment that had gitlab installed.

于 2016-07-01T01:23:01.163 に答える