티스토리 뷰

소프트웨어 프로젝트를 수행하면서 source code review 는 중요한 사항 중의 하나이다. “A complete software development platform”라고 말하는 Phabricator 도 이를 위하여 Code Review 와 Audit 이라는 두가지 방법을 제공한다. 관련된 문서는 phabricator의 도움말에서 찾아볼 수 있다. 

User Guide: Review vs Audit


(Phabricator 주요 어플리케이션)


사후 리뷰하는 audit 방식은  매뉴얼을 보면 이해하는데 큰 어려움은 없다. 하지만 phabricator의 사전 review 방식은 조금 복잡하다. Git을 사용하는 개발자에게 Github 의 pull request나 gerrit 의 code review 방식은 직관적이라 이해하는데 큰 어려움은 없지만, phabricator 는 gitmercurialsubversion 세 종류의 SCM을 지원하고, 이를 위한 공용 code review 시스템이기 때문에 git 이외에도 arcanist 라는 client utility 사용방법과 phabricator differential  review 시스템 운용 방법을 이해하여야 한다. 그리고 필요에 따라서 phabricator herald notification rule을 이용한 알림조건 설정도 알아야 한다. 

이와 같은 복잡한 때문에 프로젝트 도입 및 교육이 어려울 수 있지만, 이 부분만 넘긴다면 phabricator 의 maniphest (issue tracking), phriction (wiki), diffusion (code repository), audit (post review), differential (pre review) 등이 모두 연계된 개발 시스템 운용이 가능해진다.

아래에서는 SCM 은 git 만 한정하여서 설명한다.


1. Audit

Phabricator는 code review 기능이 issue task, git repository 등에 잘 통합되어 있다. 예를 들면 phabricator diffusion (source repository)에서 아래 예처럼 라인에 코멘트를 달고 원하는 사람에게 이슈를 제기 할 수 있다. 이 기능이 phabricator audit 기능이다.   

 

(Audit 리뷰 예)


Audit은 “post-push code review”로 쉽게 말해서 git commit 한 후에 서버에 올라온 patch 내역을 보고 review를 하는 방식이다. 즉, git server push (phabricator diffusion)된 상태에서 review를 하는 것이기 때문에 commit에 대해서 reject을 할 수는 없고, “Accept Commit”, “Raise Concern” 두 가지로만 선택을 할 수 있다. 

기본적으로 repository에 있는 모든 commit 에 대하여 이와 같이 comment를 달고 “Raise Concern”으로 해당 committer 에게 이슈를 제기할 수 있다. 이와 같이 한 경우 해당 항목은 “Accept Commit”하기 전까지는 phabricator audit 에 “Open Audits”로 확인 할 수 있게 된다. 


(Audit 내부 메뉴)


이를 실제 개발에 적용하기 위하여는 Phabricator Herald 를 이용하여 조건에 맞는 commit code 에 자동으로 auditor 로 추가하는 방식으로 운영하는 것이 좋아 보인다. 

Herald 는 phabricator notification rule 로 다양한 조건을 설정하여 원하는 다음 action을 설정할 수 있다. 이 기능을 이용하여 특정 repository, committer, source directory, commit string 등을 조건으로 잡아 해당 commit 에 자동으로 auditor 로 자신을 추가하면 된다. 이렇게 하면 phabricator audit 에 “open audits”로 해당 사항이 등록되고, 설정에 따라 e-mail 등으로 알림을 받을 수 있다. 


이 audit 기능을 이용하여 문제가 된 commit 에 대한 해결은 수정된 코드를 새로 commit 해서 이를 review 하여 조건부로 최종 “Accept Commit”을 하여야 한다. 


실제로 운영을 해보면 이 기능은 repository 에 있는 코드 중 문제를 발견하여 이슈를 제기할 때는 유용하나 메인 코드 리뷰로 활용 하기에는 무언가 부족해 보인다. 


2. Differential

Differential은 gerrit 과 유사하게 repository에 push 되기 전에 사전에 review를 할 수 있는 방법이다. 아래 그림과 같이 differential 로 review를 올린 patch는 별도로 관리되어 리뷰가 완료되면 phabricator diffusion (source repository)로 land 를 할 수 있다. Differential 과 diffusion history 는 모두 phabricator maniphest task와 연계가 가능하므로 review 이력을 포함한 모든 사항을 기록으로 하나의 시스템에 관리할 수 있는 장점이 있다. 


(Differential 내부 메뉴)


앞에서도 이야기 하였듯이 gitmercurialsubversion SCM 을 지원을 위한 differential 이기 때문에 코드 리뷰를 위해서는 arcanist 라는 client utility 를 사용하여야 한다.


Arcanist 도 php scripts 이기 때문에 arcanist manual 에 있는 방법과 같이 git 에서 받아 적당한 directory 에 설치해 주고 path 를 설정해주면 된다 (Windows용으로 설치방법도 매뉴얼에 나와있다).

some_install_path/ $ sudo apt-get install php php-curl

some_install_path/ $ git clone https://github.com/phacility/libphutil.git

some_install_path/ $ git clone https://github.com/phacility/arcanist.git

some_install_path/ $ ./arcanist/usr/bin/arc upgrade


설치 후에는 phabricator server와 연동이 필요하다. 이를 위한 사항은 arcanist quick start guide 를 참고하여 ‘arc install-certificate’ 로 phabricator conduit API key를 등록한다. 

이와 같은 과정을 거치면 arcanist 를 이용하여 phabricator differential 로 code review 를 할 준비가 완료된다. 


실제 코드 리뷰는 임시 프로젝트를 만들어서 몇번의 연습을 거치며 프로젝트에 어떤 방식으로 적용할 지를 고민하여야 할 것이다. 

Differential 을 이용한 review 방식은 기본적으로 pull request 이다. 즉, 개발자는 소스를 수정하기 전에 먼저 feature branch 를 하고, 이에 대하여 local repository commit 을 하고, 이를 phabricator differential review 에 올리는 것이다. Reviewer 가 수정된 내역을 accept 하면 개발자는 직접 arcanist utility 를 이용하여 phabricator repository 에 land 한다. 


이를 위한 주요 command 는 다음과 같다. 


1) Feature Branch

Maniphest 의 issue 를 수정하기 전에 먼저 arcanist 를 이용하여 feature branch 한다. 

$ arc feature T1234


T1234 branch 이름으로 이와 같이 maniphest 의 task number 로 하면 자동으로 연동된다. 이 과정은 git 으로는 다음과 같은 과정과 유사하다. 

$ git pull

$ git checkout -b T1234 HEAD


이와 같이 feature branch 를 한 상태에서 코드를 수정하여 필요한 만큰 local commit을 한다. branch는 git branch 이므로 여러 task 를 동시에 수정하고 있다면 적절히 git checkout command 를 이용하여 branch 이동을 하면서 작업하면 된다. 


2) Code Review

해당 feature branch 를 code review 요청하려면 아래와 같이 원하는 branch 로 이동하여 arc diff 를 실행하여 리뷰를 요청한다. 

$ arc diff


Reviewer와 해당 사항에 대한 적절한 커멘트를 입력해주면 phabricator differential 에 등록된다. 해당 사항은 reviewer 가 accept 하기 전까지는 추가 수정 후 git commit 과 arc diff 를 이용하여 수정 사항을 재 리뷰 요청할 수 있다. 


Reviewer 의 리뷰 진행 상황은 phabricator 에 접속하여 differential 에서 확인이 가능하지만 arc list command 로도 shell 상에서 review 여부를 확인 할 수 있다. 


3) Landing

최종적으로 reviewer 가 accept 한 경우 개발자는 직접 code 를 repository 에 landing 할 수 있다. 기본적인 command는 아래와 같다. 

$ arc land


Git의 경우 local commit 은 재수정이 가능하여(mutable) git rebase 를 이용하여 merge 하거나 재수정이 가능하다. Arcanist 에서도 위와 같이 옵션 없이 arc land 를 수행하면 feature branch 의 patch set 을 합쳐서(--squash) phabricator repository 에 commit 한다. 

이렇게 하나로 합쳐져서 commit 되는 것이 어색하게 보인다면 arc land 에 --merge 옵션을 주면 된다. 이외에도 아래와 같이 help 를 보면 몇가지 도움될 만한 방식이 있다.

$ arc land --help


Merge 방식을 default 로 하고 싶다면 arcanist user guide 를 참고하여 history.immutable 을 설정하면 된다. 

이와 같이 하면 local 의 feature branch 는 master branch 에 merge 되고 없어지게 된다. 


3. 요약

새로운 arcanist 를 익히고, 이의 branch merge 방식에 대하여 어느정도 익혀야 된다는 단점은 있지만, 이에 대하여 어느정도 익숙해진다면 differential(code review), diffusion(repository), maniphest(issue tracking) 이 서로 연동되어 이력을 남길 수 있게 된다. 

아래의 예에서 T673 은 maniphest id, D59 는 differential id, rHU4ebbd1ef5d1 은 diffusion id (rHU 는 repository callsign, 4ebbd1ef5d1 은 commit id) 로 아래와 같이 상호 링크가 된다. 



저작자 표시
신고
댓글
댓글쓰기 폼