<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://workspace.onionmixer.net/wiki/index.php?action=history&amp;feed=atom&amp;title=Gitolite_and_hook</id>
	<title>Gitolite and hook - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://workspace.onionmixer.net/wiki/index.php?action=history&amp;feed=atom&amp;title=Gitolite_and_hook"/>
	<link rel="alternate" type="text/html" href="https://workspace.onionmixer.net/wiki/index.php?title=Gitolite_and_hook&amp;action=history"/>
	<updated>2026-04-04T10:00:16Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://workspace.onionmixer.net/wiki/index.php?title=Gitolite_and_hook&amp;diff=408&amp;oldid=prev</id>
		<title>Onionmixer: 내용추가</title>
		<link rel="alternate" type="text/html" href="https://workspace.onionmixer.net/wiki/index.php?title=Gitolite_and_hook&amp;diff=408&amp;oldid=prev"/>
		<updated>2013-04-22T11:38:44Z</updated>

		<summary type="html">&lt;p&gt;내용추가&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;;Gitolite에 대한 후킹 시스템&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==서문==&lt;br /&gt;
&lt;br /&gt;
sitaramc/gitolite 는 Git 저장소를 편하게 사용할 수 있도록 호스팅해주는 좋은 도구입니다. Gitolite 는 사용자 정의 후킹을 추가할 수 있습니다만, 몇가지 이유로 인해 내가 원하는것을 찾아야할 필요가 있었습니다.(저장소별로 구분되는 post-receive)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이런 필요성때문에 나는 다양한 작업을 자동화하기 위해 저장소에 대한 post-receive 후킹을 사용자 정의로 설정하는 가이드를 작성했습니다. 이제 시작해 보도록 하겠습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Gitolite의 준비==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;주의: 이것을 진행하는데는 Gitolite v3 를 쓴다고 가정하고 있습니다만 몇가지를 조정하면 v2 에서도 사용할 수 있습니다&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
지금부터 작업할 후킹 시스템은 Gitolite 관리 저장소 안에 거의 존재하는 경우가 없을겁니다만, 원하는 작동을 보장받기 위해 먼서 서버측(git를 운영하고있는곳의 home directory)의 .gitolite.rc 파일의 일부를 변경해야 작동됩니다.&lt;br /&gt;
&lt;br /&gt;
* $LOCAL_CODE 의 값을 &amp;quot;$ENV{HOME}/.gitolite/local-code&amp;quot; 로 설정해줍니다(이렇게 하면 hook 이 작동될 수 있습니다)&lt;br /&gt;
* $GIT_CONFIG_KEYS 를 &amp;quot;.*&amp;quot; 으로 변경합니다. (이렇게 하면 나중에 hooks.run 을 사용할 수 있습니다.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
파일을 저장한뒤 이러한 변경 내용을 적용하려면 쉘에서 gitolite setup(gentoo에서는 /usr/bin/gl-setup 이 됩니다) 을 실행합니다. 파일을 저장하고 이러한 변경 내용을 적용하려면 쉘에서 gitolite setup 을 실행합니다. 이제 다음의 내용을 진행해서 로컬컴퓨터에 대한 관리자 저장소 아래쪽에 local-code 디렉토리 구조를 설정하면 됩니다:&lt;br /&gt;
&lt;br /&gt;
:gitolite-admin&lt;br /&gt;
::conf&lt;br /&gt;
::keydir&lt;br /&gt;
::local-code&lt;br /&gt;
:::hooks&lt;br /&gt;
::::common&lt;br /&gt;
:::::hooks.d&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==후킹시스템(The hooking system)==&lt;br /&gt;
&lt;br /&gt;
이 시스템은 2개의 컴포넌트를 가지고 있는데, hooks.d 디렉토리와 후크 자체에서 적절한 후크를 실행하는 post-receive 후크가 그것입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
아래에 있는 코드는 post-receive 를 위한 파일의 내용으로서 저장소에 정의되며 후킹된경우 호출을 처리하는 코드입니다. (local-code/hooks/common/ 아래쪽에 코드를 위치시키면 됩니다):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===post-receive===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
run_hook () {&lt;br /&gt;
  echo -en &amp;quot;\e[1;33m$4..\e[00m &amp;quot;&lt;br /&gt;
  echo $1 $2 $3 | $GIT_DIR/hooks/hooks.d/$4&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
echo -en &amp;quot;\e[1;33mRunning hooks..\e[00m &amp;quot;&lt;br /&gt;
&lt;br /&gt;
while read oldrev newrev refname; do&lt;br /&gt;
  if [ &amp;quot;$refname&amp;quot; =  &amp;quot;refs/heads/master&amp;quot; ]; then&lt;br /&gt;
    hooks=$(git cat-file blob $newrev:.hooks 2&amp;gt;/dev/null)&lt;br /&gt;
    if [ -n &amp;quot;$hooks&amp;quot; ]; then&lt;br /&gt;
      # Repo-local hooks defined in .hooks.&lt;br /&gt;
      for hook in $hooks; do&lt;br /&gt;
        run_hook $oldrev $newrev $refname $hook&lt;br /&gt;
      done&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    # Global hooks for this repo (ie. set in Gitolite config).&lt;br /&gt;
    hooks=$(git config --get hooks.run)&lt;br /&gt;
    [ -z &amp;quot;$hooks&amp;quot; ] &amp;amp;&amp;amp; continue&lt;br /&gt;
&lt;br /&gt;
    for hook in $hooks; do&lt;br /&gt;
      run_hook $oldrev $newrev $refname $hook&lt;br /&gt;
    done&lt;br /&gt;
  fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\e[1;32mDone.\e[00m&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
나는 이 방법이 따로 설명이 필요없는 깔끔한 방법이라고 믿습니다만, 이것에 대한 설명이 필요한경우 의견을 주시기 바랍니다 :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===저장소에있는 hook를 사용가능하게 만들기===&lt;br /&gt;
&lt;br /&gt;
이것들은 gitolite.conf 에서 직접 정의되어 있으므로 앞에서 언급한대로 이렇게 저장소에서 후킹되도록 설계되어 있습니다. 예를 들자면 내 홈페이지에 있대로 따라해보시면 됩니다(코딩라인에 주의해주세요):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
repo    web/..*&lt;br /&gt;
  C = @zanea&lt;br /&gt;
  RW+ = @zanea&lt;br /&gt;
  config hooks.run = nginx-deploy notify &amp;lt;- hook 파일을 지정해주는 LINE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&lt;br /&gt;
&lt;br /&gt;
또한 사용자는 저장소 자체 내부의 .hook 파일에서 한 줄로 후크를 지정할 수 있습니다.(wild repos 에 유용합니다)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===간단하게 hook 배포하기===&lt;br /&gt;
&lt;br /&gt;
이 코드는 내가 셋업한 환경을 위해 동작하는 코드입니다(nginx에서 사용되죠). 하지만 수정하는것이 어렵지는 않습니다. (그리고 local-code/hooks/common/hooks.d/ 에 위치하게 됩니다):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====nginx-deploy====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
read oldrev newrev refname&lt;br /&gt;
&lt;br /&gt;
# Get project name from current directory (without .git)&lt;br /&gt;
PROJECT=$(basename &amp;quot;$PWD&amp;quot;)&lt;br /&gt;
PROJECT=${PROJECT%.git}&lt;br /&gt;
&lt;br /&gt;
# Where the checkout should reside&lt;br /&gt;
WWW_DIR=/www/${PROJECT}&lt;br /&gt;
&lt;br /&gt;
# Where logs should reside&lt;br /&gt;
LOG_DIR=/www/logs/${PROJECT}&lt;br /&gt;
mkdir -p $LOG_DIR ; chmod 770 $LOG_DIR/../ ; chmod 770 $LOG_DIR&lt;br /&gt;
&lt;br /&gt;
# Checkout the website&lt;br /&gt;
mkdir -p $WWW_DIR&lt;br /&gt;
GIT_WORK_TREE=$WWW_DIR git checkout -q -f $newrev&lt;br /&gt;
chmod -R 770 $WWW_DIR&lt;br /&gt;
&lt;br /&gt;
# Replace some template values in our nginx.conf&lt;br /&gt;
sed -i -e &amp;quot;s_{{WEBDIR}}_${WWW_DIR}_g&amp;quot; -e &amp;quot;s_{{LOGDIR}}_${LOG_DIR}_g&amp;quot; -e &amp;quot;s_{{PROJECT}}_${PROJECT}_g&amp;quot; ${WWW_DIR}/nginxkkk.conf&lt;br /&gt;
&lt;br /&gt;
# Symlink the nginx config to the nginx directory and tell nginx to reload&lt;br /&gt;
sudo ln -sf ${WWW_DIR}/nginx.conf /etc/nginx/sites-enabled/${PROJECT}.conf &amp;amp;&amp;amp; sudo nginx -s reload&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\e[1;32mSuccessfully deployed ${PROJECT}.\e[00m&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
그리고 해당되는 Gitolite config 에 맞는 자리에 위치시키면 되는데, 당신은 바로 git commit -a; git push 를 실행함으로서 당신의 admin repository 에 세팅한 후크가 동작하는걸 확인할 수 있습니다! 이 아래쪽에 제공되는 barebones 후크를 사용해보세요:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====test-print====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
read oldrev newrev refname&lt;br /&gt;
echo &amp;quot;$(pwd), $GIT_DIR, $oldrev $newrev $refname&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이 코드가 잘 동작한다면, 사용자가 정의한 저장소에 정의된 test-print hook 에 git push 된 결과가 사용자의 터미널에 출력되는것 확인할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===추가로 할 수 있는것들===&lt;br /&gt;
&lt;br /&gt;
처음 hook 를 사용하고 싶었던 이유중 가장 큰것은 코드스타일 검사를 자동화해서 [http://www.codeshack.co.nz/ CodeSnack] 에서 프로젝트를 위한 문서를 생성하게 하려는 것이었습니다. 우리는 운좋게도 PHP를 많이 사용하는 유틸리티는 [http://www.phpmd.org/ PHPMD], [https://github.com/sebastianbergmann/phpcpd sebastianbergmann/phpcpd](PHP Copy/Paste Detector), [http://pear.php.net/package/PHP_CodeSniffer PHP_CodeSniffer] 등과 같이 PHP 코드의 스타일 검사를 바깥쪽에서 수행하는 방법이 있습니다. 비슷한 도구로 [https://github.com/sebastianbergmann/phpunit sebastianbergmann/phpunit] 그리고 unit 의 테스트와 문서화를 위한 [http://www.phpdoc.org/ phpDocumentor 2] 등이 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
git hook 을 사용하면 Redmine 아래에서 관리되고 있는 프로젝트에 대한 어떤 &amp;#039;&amp;#039;나쁜&amp;#039;&amp;#039; 결과 또는 버그에 대한 레포트를 전부 모니터링을 할 수 있으며, 뿐만아니라 항상 프로젝트 문서를 최신으로 유지할 수 있고, 새로운 코드가 저장소에 들어가는 것에 대한 결과를 알 수 있습니다 :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==example code==&lt;br /&gt;
&lt;br /&gt;
file :: ~/.gitolite.rc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$GL_BINDIR = &amp;quot;/usr/bin&amp;quot;;&lt;br /&gt;
$LOCAL_CODE = &amp;quot;$ENV{HOME}/.gitolite/local-code&amp;quot;;&lt;br /&gt;
$GIT_CONFIG_KEYS = &amp;quot;.*&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==참고문서==&lt;br /&gt;
&lt;br /&gt;
* 번역원문 :: http://demonastery.org/2012/09/a-hooking-system-for-gitolite/&lt;br /&gt;
* http://gitolite.com/gitolite/rc.html &amp;lt; search &amp;#039;&amp;#039;&amp;#039;LOCAL_CODE&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;GIT_CONFIG_KEYS&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* http://gitolite.com/gitolite/git-config.html &amp;lt; search &amp;#039;&amp;#039;&amp;#039;GIT_CONFIG_KEYS&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* http://askubuntu.com/questions/227577/how-to-set-local-code-in-gitolite&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
	</entry>
</feed>