12/04/2020

Gerrit(Git Review)

1. Gerrit(Git Review) 

이전부터 Git Review의 기능 궁금했는데 정확한 사용용도를 잘 몰랐으며, 최근 다시 repo를 사용하면서 다시 용도가 궁금하여 정리하려고 
검색했더니, 너무 많은 좋은 자료들이 많아 사용용도를 쉽게 알게되었다. 

아래 글을 읽어보면, 프로그래머의 Source를 Review하여, Source를 관리해주는 기능으로 보이며, 사용해보지는 않았지만, 
대충 이기능으로 회사마다 조금씩 정형화된 Code Convention 기능을 지킬수 있는 기능으로 보이며,  
더불어 글을 읽어보면, Source에 점수 주어 관리한다고 하는데, 어떻게 소스를 자세히 검토하는지와 문제가 되는 코드들을 찾아 
자동으로 검토를 해준다고 하니, 각 기능들이 궁금하다. 

별도로 추가도 소스검증기능도 가능할 것 같은데, 나중에 시간이 되면 한번 설치를 해보고 사용을 해봐야 자세히 알것 같다. 

네이버의 Git Review 자세한 설명 
  https://d2.naver.com/helloworld/6033708

Git Review , Code Review라는 기능이라고 하는데, 검색을 더 해보고, 곰곰히 생각을 해보면, 소규모 프로젝트에는 필요는 없을 것 같다.


1.1 Google의 Gerrit 기본구조

우선 두명의 개발자 개발하고 공인된 Repository를 공유한다고 한 후 이를 CI를 Jenkins로 별도의 Build Server로 사용하면 구성될 것이다.
네이버는 CI를 Jenkins로 위주로 구성했다고 한다. 
구글은 CI를 Jenkins 대신 Bazel을 사용한다고 하는데, 아직 사용을 해보지 못했다. 


https://gerrit-review.googlesource.com/Documentation/intro-how-gerrit-works.html



개발자는 Push로 고친소스를 올리면, Reviewer 이를 받아 확인 후 검증하고 최종적으로 Submit되는 구조이다.
Reviewer들은 Google을 보면 같이 일하는 Co-Worker들인 것으로 보이는데, 많은 Reviewer들이 존재하며 어떻게 선정이 되는지 구성단계가 궁금하다.
본인이 원하는 사람에게만 Review를 하는 것인지, 아니면, 단계가 별도로 존재하는지, 기타 등등 부분이 궁금하다. 


https://gerrit-review.googlesource.com/Documentation/intro-how-gerrit-works.html


Gerrit(Git Review)를 사용하고자 하면 상위와 같이 Git Repository 와 Gerrit(Git Review)가 같이 존재해야하는데, 
Github와 같이 외부 Repository를 사용한다면, 그 방법도 알아야 할 것 같은데, Github도 보면 Code Review 기능을 별도로 제공해주고 있다.

Code Review로 각 검색을 해보면, 각각의 Gitlab / Bitbucket / Github 다 존재하는 것으로 보인다. 

Gerrit(Git Review) 동작그림


1.2 AOSP(Android Open Source Project) Review

우선 Google에서 어떻게 사용하는지 궁금해서 아래 사이트를 전부 가입 후 Code Review 기능을 확인 
AOSP를 보면 CHANGE 구성에 따라 Open / Merge/ Abandoned 되는데, 각 변화마다 Code Review를 하도록 한다. 

  1. Open: Code를 수정하여 제안 
  2. Merge: 두 개의 Branch들을 합치는 것 
  3. Abandoned: 삭제되는 부분 (생략)

  • CHANGE->OPEN 기능 (기능추가하여 넣어 Review 단계)
각 개발자가 소스를 수정하여, 각 옵션을 설정후 수정된 소스를 Reviewer에게 제안하는 단계로 보인다. 



  • CHANGE->OPEN-> Subject (각 세부이슈)
구글의 Android Gerrit를 보면 reviewr가 한명이 아니라 보통 1명 이상으로 구성으로 하는 것 같으며, 여러개의 옵션이 존재한다  


https://android-review.googlesource.com/c/platform/frameworks/base/+/1502382

상위는 각 이슈에 대한 부분이며, 각 기능은 정확하게 다 파악하지 못했지만, 자동 Submit 부터 이를 검증 그리고, 
LINT 사용여부 비롯하여 다양한 사람에게 Review를 통해 검증부터 우측에 연관된 부분을 우측에 링크를 비롯하여, 
아래에는 이 이슈에대한 소스의 히스토리를 제공해주고 있다. 

구조를 보면, 자동소스 검토는 LINT 와 Treehugger Robot 사용하는 것으로 보이며, 많은 동료들이 검증 하는 것으로 보이며, 
Gerrit이 소스 검토를 비롯하여, 각 기능에 대한 좋은 Community 역할을 해주는 것으로 보인다. 


  • CHANGE->MERGE  
각 개발자가 소스 Confirm이 되고 최종적으로 두 개의 Branch가 각각 Merge할 것이며, 이를  Reviewer 설정하여 이를 점검한다. 



  • CHANGE->MERGE->Subject (각 이슈)  
각 개발자가 소스 Confirm되었고, 이를 실제 하나로 합치는 작업인데, 주로 이부분에서 많은 문제가 발생할것이다. 
개별소스는 각 테스트를 했으나, 소스가 합쳐지면서 생기는 문제들이 주로 일텐데, 이런부분도 각 Review를 통해 하는 것으로 보인다. 



Treehugger Robot
Git의 Tree를 관리해주는 Robot으로 보이는데, 추후에 직접 Gerrit를 설치 후 기본으로 들어있는지 외부 Robot인지 봐야 할 것 같음 

LINT
소스검증 Tool로 이용이 되며, Google에서 사용중 


Android Git Review System 확인
  https://android-review.googlesource.com/

Gerrit Git Review 확인 

AOSP(Android Open Source Project)


1.3 Repo 설명 

Repo 사용법은 아래의 Google Manual을 보면 될 것 같으며, 추후 분석은 아래 예제를 보면 될 것 같다. 
추후 Repo 기반으로 Project를 관리를 할 경우 나중에 다시 한번 제대로 세부사용법을 자세히 알야하 할 것 같다. 


Repo 사용예제 


1.4  GIT 관리 와 Gerrit 관리 문서 


구글문서들로 Git에 대한 기본 Concep 부터 세부문제사항에 대한 예제가 자세히 설명되어있으며, Gerrit에 대한 실제 사용법 및 예제가 나와있다. 

정리가 너무 잘되어 있어 보기 및 이해하기가 더욱 수월하지만, 막상 사용하려면 골치 아픈것 같다. 

Git explained: Git Concepts and Workflows (필독 및 이해)


2. Gerrit 설치 및 기본실행 확인


현재 Gerrit 의 필요성은 거의 없지만, 일단 설치 해보고, 실행하여 구성을 확인을 해보자. 

  • 설치전 확인사항 
  1. Open JDK 설치
  2. Hostname 설정 


  • Gerrit  기본설치 
Google의 Gerrit 메뉴얼대로 간단하게 설치 및 테스트

$ wget https://gerrit-releases.storage.googleapis.com/gerrit-3.1.3.war 

$ mkdir gerrit_test
$ 
$ export GERRIT_SITE=`pwd`/gerrit_test
$ echo $GERRIT_SITE

// 실행 후 GERRIT_SITE에 각 파일 및 관련구성이 설치되며 제대로 되면, 아래 Config의 HTTP로 접속가능 
$ sudo java -jar gerrit*.war init --batch --dev -d $GERRIT_SITE

$ ls gerrit_test/  // 자동생성되며, 아래 설정도 자동으로됨 
bin  cache  data  db  etc  git  index  lib  logs  plugins  static  tmp

$ tree -d -L 3 --charset unicode gerrit_test   // Gerrit 의 기본구조 
.
|-- bin     // Gerrit 의 Service 기능 
|-- cache   // Gerrit 의 Cache  
|-- data
|-- db       // Gerrit 의 DataBase로 Account 관리 
|-- etc      // Gerrit 의 설정부분 
|   `-- mail
|-- git             // Gerrit 의 BasePath 설정되며, git 정보만 생성됨
|   |-- All-Projects.git
|   |   |-- branches
|   |   |-- hooks
|   |   |-- logs
|   |   |-- objects
|   |   `-- refs
|   `-- All-Users.git
|       |-- branches
|       |-- hooks
|       |-- logs
|       |-- objects
|       `-- refs
|-- index
|   |-- accounts_0011
|   |-- changes_0057
|   |   |-- closed
|   |   `-- open
|   |-- groups_0008
|   `-- projects_0004
|-- lib
|-- logs
|-- plugins
|-- static
`-- tmp
    `-- gerrit_7861426947991176346_app

  • 설치된 Gerrit 기본실행확인 
상위 ASOP Git Review 와 거의 유사한 구조로 구성되어 실행됨



  • 상위 Sin in Admin으로 로그인 후 Repository에서 각 TEST Project 생성 
Repository를 추가하면,  상위 git directory에 Git 새로 생성되고, 관리가 시작되며, 생성시 아래와 같이 다양한 옵션들을 줄 수 있다.  



  • Gerrit Project 생성법 
basepath는 상위 git 디렉토리를 말하며, 그 기반으로 생성 

  • Gerrit Project 생성후 기본사용법
Gerrit의 기본 사용법인 것 같으며, 이 기반으로 추후 사용해봐야 할 것 같다.


  • Gerrit 전체설정 확인 
설정을 변경한 후에는 반드시 gerrit를 restart 해줘야함 
//hostname:8080으로 접속가능 및 기본 Project는 git 
$ cat  $GERRIT_SITE/etc/gerrit.config  // 자동생성되며, 아래 설정도 이미 JDK 와 Hostname을 설정했음 
[gerrit]
        basePath = git
        canonicalWebUrl = http://voyage:8080/
        serverId = 122d56c1-e454-4468-b7f0-68bc8c27f593
[container]
        javaOptions = "-Dflogger.backend_factory=com.google.common.flogger.backend.log4j.Log4jBackendFactory#getInstance"
        javaOptions = "-Dflogger.logging_context=com.google.gerrit.server.logging.LoggingContext#getInstance"
        user = jhlee
        javaHome = /usr/lib/jvm/java-8-openjdk-amd64/jre
[index]
        type = lucene
[auth]
        type = DEVELOPMENT_BECOME_ANY_ACCOUNT
[receive]
        enableSignedPush = false
[sendemail]
        smtpServer = localhost
[sshd]
        listenAddress = *:29418
[httpd]
        listenUrl = http://*:8080/
[cache]
        directory = cache
[plugins]
        allowRemoteAdmin = true


Google Gerrit(Git Review) Config


  • Gerrit Service 기본제어 
아래 처럼 쉽게 gerrit.sh Service를 제어가 가능하며, 부팅시 자동실행하고자 하면 init Script에 추가 
// Gerrit Service 중단/시작/재시작
$ $GERRIT_SITE/bin/gerrit.sh stop
$ $GERRIT_SITE/bin/gerrit.sh start
$ $GERRIT_SITE/bin/gerrit.sh restart


기본 Quick Gudide를 보면 될 것이며, Install Guid에서 세부내용을 확인 
Gerrit PlugIn들  

2.3 Gerrit 의 Github 연결 

  • Github 사용자를 위한 Gerrit연결방법
상위와 같이 Gerrit를 설치 후 Gerrit 과 외부 Github를 연결하는 방법은 보면, 중간에서 Git을 가로채서 Git 명령어를 수행하여, 
이를 Gerrit이 모두 Github의 최종 Push권한을 갖는 것으로 보이며, 
.git/config 과 git Pull Request (Gerrit에서 지원못함) 부분을 좀 더 확인을 해봐야 할 것 같다. 


  • Github 사용자 위한 Gerrit  
별도의 Gerrit을 설치 없이 사용가능한 것 같은데, 너무 느려서 사용하기를 포기 
  http://gerrithub.io/

  • Github의 Code Review 기능
Github 이외 Gitlab 비롯하여 각각의 Code Review 기능을 제공하고 있으며, 이 기능을 사용하면 될 것 같다.