====== Gitblit ====== * http://gitblit.com Java JGit 기반으로 만들어진 설치가 쉬운 Git 저장소 서버. * 설치도 쉽고 사용법도 쉽지만 성능은 좀 떨어진다. 프로젝트가 대규모가 될 경우 성능저하가 심했다. * [[http://gitblit.com/setup.html|Gitblit 설치/설정]] * [[https://github.com/gitblit/gitblit|GitBlit 소스 리포지토리]] ===== 설치시 주의점 ===== * Tomcat 6.0.10 이상 버전에서는 ''/,\''가 이스케이프되어 URL이 제대로 인식 안되는 문제가 발생한다. * ''CATALINA_OPTS=-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true'' 설정을 하고 톰캣을 실행한다. * WebServer(nginx/apache) 연동시 대용량 데이터를 커밋하려면 요청 데이터 제한 용량을 풀어줘야한다. # nginx 설정 client_max_body_size 1000M; * Git 저장소의 크기가 증가하면 저장소 웹페이지 들어가는 속도가 느려진다. 이때 저장소 설정에서 **크기 계산 무시**, **메트릭 요약 무시**를 체크한다. ==== Gitblit GO ==== * gitblit GO 버전은 HTTP가 꺼져있다. ''gitblit.properties''의 ''server.httpPort = 8080'' 지정 필요. * 압축을 풀고 아래 명령으로 실행 java -server -Xmx1024M -Djava.awt.headless=true -jar gitblit.jar --baseFolder data ===== Hook ===== * Groovy 기반으로 후킹이 가능하다. [[http://gitblit.com/setup.html|Gitblit 설치/설정]] 참조. ==== protect-refs hook ==== * Git을 사용하다가 소스가 롤백 되는 현상이 있는데, 이는 보통 개발자가 Rebase, Reset 등을 하고 커밋을 역행했을 때 발생한다(NON-FAST-FORWARD). * Github은 기본적으로 이 상태에 대해 경고를 내보낸다. * Github 처럼 NON-FAST-FORWARD와 커밋 삭제를 방지하려면 ''protect-refs.groovy'' 훅을 ''preReceiveScripts'' 로 지정한다. * 그 때, ''authorizedTeams''에 NON-FAST-FORWARD와 DELETE 작업을 해도 괜찮은 팀을 명시해주면 해당 팀원만 커밋을 할 수 있다. ===== 기본 API ===== * [[http://download.eclipse.org/jgit/docs/latest/apidocs/|JGit API Doc]] import com.gitblit.GitBlit import com.gitblit.Keys import com.gitblit.models.RepositoryModel import com.gitblit.models.TeamModel import com.gitblit.models.UserModel import com.gitblit.utils.JGitUtils import java.text.SimpleDateFormat import org.eclipse.jgit.lib.Repository import org.eclipse.jgit.lib.Config import org.eclipse.jgit.revwalk.RevCommit import org.eclipse.jgit.transport.ReceiveCommand import org.eclipse.jgit.transport.ReceiveCommand.Result import org.slf4j.Logger ==== 커밋/수정 커밋 메시지 및 파일 정보 확보 ==== [[https://groups.google.com/forum/?fromgroups#!searchin/gitblit/gitblit$20commit$20file$20list/gitblit/bTQU7IAjFBg/S0Mgy0HiJSYJ|Exporting files on post-receive hook. 대한 답변]] 참조 Repository r = gitblit.getRepository(repository.name) for (ReceiveCommand command : commands) { def updateType = command.type def updatedRef = command.refName logger.info("## ${command.type} - ${command.refName}") def commits = JGitUtils.getRevLog(r, command.oldId.name, command.newId.name).reverse() switch (command.type) { case ReceiveCommand.Type.CREATE: case ReceiveCommand.Type.UPDATE: case ReceiveCommand.Type.UPDATE_NONFASTFORWARD: for (def commit in commits) { // commit : org.eclipse.jgit.revwalk.RevCommit logger.info("## commit.fullMessage : ${commit.fullMessage}") // 커밋 로그 메시지 def files = JGitUtils.getFilesInCommit(r, commit) files.each { file -> // 커밋/수정된 파일 정보 file : com.gitblit.models.PathModel logger.info("## Commit File ${file.name} - ${file.path}") } } } } ==== Commit Reject ==== boolean success = true for (ReceiveCommand comment : commands) { if (...) { command.setResult(Result.REJECTED_OTHER_REASON, "${repository.name} 리포지토리에 커밋 실패"); success = false break } } .... // 스크립트 마지막에서 결과리턴 return success ==== Repository Mailing List 정보 확보 ==== * 각 리포지토리의 설정에 보면 메일링 리스트 부분이 있다. * 여기에 이메일 주소를 **공백**으로 구분하여 넣으면, Groovy Script에서 ''List''으로 읽어오는것이 가능하다. * 이 값은 ''data/git/[Repository]/config'' 파일의 ''[gitblit]'' 섹션에 문자열로 저장된다. * 리포지토리에 설정된 ''mailingList'' 값 Repository r = gitblit.getRepository(repository.name) Config config = r.getConfig() def mailinglist = config.getStringList('gitblit', null, 'mailingList') // 'gitblit'은 섹션명, null 은 서브 섹션, 'mailingList'는 설정 키 logger.info("## mailing list ${mailinglist}") * ''data/gitblit.properties''의 ''mail.mailingLists''에 지정한 Gitblit 전역 mailingLists 값 import com.gitblit.Keys List globalMailingLists = gitblit.getStrings(Keys.mail.mailingLists) ==== 메일 발송 ==== * 기본적으로 ''gitblit.sendMail('제목', '내용', [toAddr,...])'' 로 메일을 보낼 수 있다. * ''gitblit.properties''의 ''mail.*'' 프라퍼티에 이메일 서버 정보를 저장해 둘 수 있다. * 메일 발송에 관한 자세한 코드는 Gitblit 배포본의 ''sendmail.groovy''를 참조한다. ==== 작업 대상 Reference 확인 ==== * ''commands'' 객체는 [[http://grepcode.com/file/repo1.maven.org/maven2/org.eclipse.jgit/org.eclipse.jgit/2.2.0.201212191850-r/org/eclipse/jgit/transport/ReceiveCommand.java|ReceiveCommand.java]] 클래스의 컬렉션이다. * 이 ''ReceiveCommand''의 인스턴스에서 ''getRefName()'' 메소드의 결과는 ''refs/heads/[branch_name]]''형태이다. * 이를 통해 작업 대상 브랜치를 알아낼 수 있다.