2010-12-27 4 views
7

나는 사람들이 컴파일하지 않는 자바 코드를 푸는 것을 막는 git 업데이트 훅을 추가하고 싶다. 이상적으로 javac를 호출하고, 결과를보고, 푸시를 허용하거나 거부합니다.어떻게하면 컴파일되지 않는 코드를 푸시하지 못하게 할 수 있습니까?

내가 막기를 원하는 가장 일반적인 예는 변경 사항을 모두 커밋하지 않아 누군가가 빌드를 위반하는 것입니다. 그러나 git hook이 서버가 아닌 클라이언트에서 실행된다는 것을 이해하고 있으므로 위와 같은 상황이 발생해도 후크는 여전히 푸시를 허용합니다.

커밋이 불완전한 사람이 빌드를 중단하지 못하게하는 가장 좋은 방법은 무엇입니까?

UPDATE

:

모든 도움을, 감사 후크 작업의 기본 버전을 얻었다! 업데이트 후크에서

발췌 :

### make sure code compiles 
## currently does this by copying the state of the repository as of the pushed code and attempting to build it 

# for now, hard coded as C:\Windows\Temp 
copydir="/c/Windows/Temp/git_hook_compile_copy" 

echo "making copy of $newrev to $copydir" >&2 
rm -rf "$copydir" 
mkdir "$copydir" 
git archive $newrev | tar -x -C $copydir/ 
if [ "$?" != "0" ]; then 
    echo "*** unable to make copy of code" >&2 
    exit 1 
fi 
echo "attempting to build $newrev" >&2 
"$ANT_HOME/bin/ant" -file "$copydir/appropriatePath/build.xml" 
if [ "$?" != "0" ]; then 
    echo "*** code does not compile" >&2 
    exit 1 
fi 

(이주의는 윈도우 환경과 환경 변수가 정의되는) ANT_HOME (따라서 JAVA_HOME에 의존)

답변

4

망할 놈의 서버와 클라이언트가 다르지 않다 많이 ;-). "클라이언트"에서 실행되는 모든 후크는 서버에서 동일한 이벤트가 발생하는 경우 "서버"에서 실행됩니다.

예를 들어, update 후크는 완전히이 범주에 속합니다. 분기가 업데이트 된 후에 호출되며이 훅이 0이 아닌 상태를 반환하면 업데이트가 취소됩니다. 따라서 컴파일을 거기에 넣고 결과를 반환 할 수 있습니다. 후크에서 인쇄 한 모든 메시지는 콘솔에 커밋 한 사용자에게 표시됩니다. 이것은 빌드 스크립트에서 오류 메시지를보고 고칠 수 있기 때문에 매우 편리합니다.

두 개의 컴파일을 동시에 실행하더라도 git 저장소는 업데이트 훅에서 "old refname"인수를 사용하기 때문에 커밋을 잃지 않습니다. 그러나 커미터가 컴파일을 대기하고, 다른 사람이 자신의 푸시 버튼을 눌러서 ref를 푸시하지 않을 수도 있습니다.

기본 자식 저장소에는 update 후크 (이름이 update.sample)의 멋진 예가 포함되어 있습니다. 확실한 예가 필요한 경우 참조하십시오.

그러나 컴파일이 너무 길고 커밋 비율이 코드를 컴파일 할 수있는 빈도를 초과하는 경우 고급 솔루션을 사용할 수 있습니다. 댓글 작성자는 Google에서 '지속적인 통합'을 제안합니다.

+6

푸시마다 프로젝트를 컴파일하는 것은 엄청나게 비쌉니다. 그렇다면 '지속적인 통합'이 Google의 목표입니다. – 9000

+0

연속 통합의 경우 +1. –

+0

지속적인 통합에 관해서는 필자도 큰 팬이며 허드슨을 주요 프로젝트로 사용합니다. 이 프로젝트는 사이드 프로젝트이며 사람들이 빌드를 깨뜨리는 코드를 체크인 할 수 없도록하는 간단한 방법을 원합니다.이 방법으로는 다른 사람 (이 경우 스크립트를 실행하는 가상 시스템)은 깨진 빌드를 체크 아웃 할 수 없습니다. – Zugwalt

1

우리는 개발자가 수행하는 작업의 경로와 다른 사람이 보는 것에 gerrit을 지정하여이 작업을 수행합니다. 다른 사람들을 위해 실수를 저지르는 데는 두 사람이 걸립니다.

buildbot (코드를 "공개"하기 전에 모든 시스템에서 빌드를 실행할 수있는 방식으로 연속 통합 용)도 사용합니다.

+0

+1 : 제릿 용. 그리고 라이브 데모가 있습니다 : https://review.source.android.com/ –

관련 문제