The Gate of the AOSP #4 : Gerrit, Memory & Performance · Gerrit – 코드 리뷰 시스템...
Transcript of The Gate of the AOSP #4 : Gerrit, Memory & Performance · Gerrit – 코드 리뷰 시스템...
Windriver Korea Design Center : 차영호 (youngho.cha at windriver.com)
2013. 3. 29.
The Gate of the AOSP #4 : Gerrit, Memory & Performance
Gerrit – 코드 리뷰 시스템 도입의 필요성 및 사용
11th Kandroid Conference
2 11th Kandroid Conference - www.kandroid.org
Contents
• Code Review System
• Gerrit
• Repo 및 AOSP 코드 기부 경험 공유
3 11th Kandroid Conference - www.kandroid.org
구글 직원의 AOSP 참여 현황
Google Employees
Framework Commiters
Apps/Extra Commiters
20% time
Google Employees
Google 젂체 직원수
37000여명
안드로이드 코드를
한줄이라도 바꿔본 직원 수
600여명
69명
68명
4 11th Kandroid Conference - www.kandroid.org
정말로 구글러들은 외계읶?
• 상당히 적은 인원으로 운영되는 AOSP
• 정말로 그들은 내부에서 외계읶이라도 고문하고 있는 걸까요?
5 11th Kandroid Conference - www.kandroid.org
Guido Van Rossum
• Creator of Python
• 한때 구글러
– 2005 – 2012
• 지금은 Dropbox에 납치되셨습니다.
6 11th Kandroid Conference - www.kandroid.org
Guido 할부지가 구글에서 처음 한 읷
• Mondrian 이라는 코드 리뷰 시스템 소프트웨어를 작성했다고 합니다.
8 11th Kandroid Conference - www.kandroid.org
코드 리뷰의 목적 (in Wikipedia)
• It is intended to find and fix MISTAKES overlooked.
9 11th Kandroid Conference - www.kandroid.org
코드 리뷰의 목적 (from Guido)
• Goal is COOPERATION,
not fault-finding.
12 11th Kandroid Conference - www.kandroid.org
코드 리뷰 시스템
• 코드 리뷰를 개발 Process에 포함하는 것
개발자
리뷰어
QA
소스 저장소 Submitter
13 11th Kandroid Conference - www.kandroid.org
코드 리뷰 소프트웨어
• 코드 리뷰 젃차를 소프트웨어(읷반적으로 웹 게시판형식)로 구현해둔 것. – Mondrian (Google)
– Rietveld (Google)
– Gerrit (Google)
– Phabricator (Facebook)
– ReviewBoard
– Barkeep
– RhodeCode
– GerritForge (Based on Gerrit)
16 11th Kandroid Conference - www.kandroid.org
하지만 현실은…
VCS 저장소
개발자
QA 다른
개발자 Bad Code 다른
개발자 다른
개발자 다른
개발자 다른
개발자 다른
개발자
QA QA QA QA
17 11th Kandroid Conference - www.kandroid.org
코드 리뷰 시스템
개발자
리뷰어
QA
소스 저장소 Submitter
Bad Code
Bad Code
18 11th Kandroid Conference - www.kandroid.org
이 외에도…
• 버그 개수 감소
• 팀원의 트레이닝 도구로 홗용
• 코드 가독성 증가 및 품질 상승
• 코드 세부 구현사항에 대한 기록 보존
• 팀 역량의 상향 평준화
• 디버깅 시간 및 프로젝트 수행 기간 단축
22 11th Kandroid Conference - www.kandroid.org
Mondrian
• Written by Guido Van Rossum
• Written with Python
• Announced in 2006
• Integrate with Perforce
• Hosted and Used at Google Internally
23 11th Kandroid Conference - www.kandroid.org
Rietveld
• Written by Guido Van Rossum
• Written with Python
• Announced in 2008
• Integrated with Subversion
• Host on Google App Engine
• Used by Chrome Project
24 11th Kandroid Conference - www.kandroid.org
Gerrit
• Gerrit (2008-2012)
– Written by Sean O. Pearce
– fork from Rietveld
– Integrated with Git
– add Access Control List feature
• Gerrit2 (2008 - )
– Rewritten Gerrit with JavaEE
– Used by Android Project
25 11th Kandroid Conference - www.kandroid.org
Gerrit의 특징
• 여러가지 홖경에서 운영 가능
– jvm만 설치되어 있으면 PC에서도 운영가능
– 표준 servlet container를 지원
• 여러가지 읶증 방식 지원
– http/ldap/openid
• 여러가지 database지원
– mysql/pgsel/h2(내장 DB)
26 11th Kandroid Conference - www.kandroid.org
Gerrit의 기능
• Git 저장소
– jgit을 이용해서 git 저장소 구현
• Access Control List
– 그룹단위로 사용자의 권한 설정 가능
– git의 기능 및 저장 위치별로 그룹 설정 가능
• fetch, push, tag, branch…
– 특정 그룹에게 검증 범위를 지정 가능
• review, verify, submit…
• Source Review Board
– 임시 git branch를 자동으로 생성해서 코드를 올릴 수 있고, 그
코드에 대해서 평가할 수 있는 웹 보드 시스템 제공
27 11th Kandroid Conference - www.kandroid.org
Gerrit의 읶터페이스
• for Human
– 웹 읶터페이스
• for External Integration
– ssh
• 커맨드라읶 읶터페이스
• 2개의 커맨드 제공
– git
» git protocol 구현
– gerrit
– REST api
• json형식으로 gerrit의 데이터 제공
28 11th Kandroid Conference - www.kandroid.org
DVCS(Git) Workflow
Remote DVCS
Repository
User1’s Local VCS Repository
User2’s Local VCS Repository
push
fetch
commit merge rebase
commit merge rebase
push
fetch
Working Branch
29 11th Kandroid Conference - www.kandroid.org
Gerrit Workflow
User1’s Local Git
Repository
User2’s Local Git
Repository
fetch
push
commit merge rebase
commit merge rebase
Working Branch
Pending Commit
merg
e
Gerrit
Repository
30 11th Kandroid Conference - www.kandroid.org
Gerrit Detailed Workflow
push commit to refs/for/branch
notify to reviewers
code quality review
IP review
Build Run
Testcases
comments&vote
merge the change into working branch
abandon
approved not approved
http://goo.gl/Kwcxo 참조
31 11th Kandroid Conference - www.kandroid.org
Google Android Source Hosting
Developer PC
android-review. googlesource.com
replicate android. googlesource.com
AOSP
Deckard
Autoverifier
Google Internal
Android Tree
Google Internal
33 11th Kandroid Conference - www.kandroid.org
Repo
• The Multiple Git Repository Tool
• Gerrit을 손쉽게 쓰기위한 스크립트 모음
• AOSP에서는 이 스크립트를 사용하기를
권장합니다.
34 11th Kandroid Conference - www.kandroid.org
Repo의 기능
• 여러 개의 git 저장소를 저장 및 배치.
• 저장소의 내용이 변경되면 rebase 적용.
• 의존성을 확읶해서, 필요한 커밋 다운로
드.
• Gerrit에 손쉽게 커밋을 업로드.
35 11th Kandroid Conference - www.kandroid.org
Windows에선 못써요.
• Linux 및 MacOSX에서만 동작합니다.
– Python으로 작성된 스크립트 입니다.
– 윈도용 python이 symlink를 지원하지 않습니다.
• Eclipse 의 Mylyn Gerrit Connector & Mylyn Reviews plugin을 사용하시는 것을 추천합니다.
36 11th Kandroid Conference - www.kandroid.org
코드 기부 목표
• Android SDK에 포함된 에물레이터
의 커널을 개선
– linux 3.4의 ftrace 기능 켜기
37 11th Kandroid Conference - www.kandroid.org
준비작업
• 먼저 http://android-review.googlesource.com 에서 계
정등록 및 설정을 해야 사용 가능
• PC에 repo 스크립트를 다운받고 실행할 수 있도록 설
정
47 11th Kandroid Conference - www.kandroid.org
manifest.xml
• Repo가 초기화 할 git저장소 목록을 제공하는 파읷
• 별도의 git 저장소에 default.xml이라는 파읷이름으로 저장되어 있어야 합니다.
– 예제
• AOSP의 manifest.xml
• CyanogenMod의 manifest.xml
48 11th Kandroid Conference - www.kandroid.org
manifest의 내용
• remote
– name: 이름
– fetch: git 저장소의 프로토콜 및 호스트
– review: 업로드 시 사용할 Gerrit 서버
– 여러 개를 등록할 수 있습니다.
• default
– project 에서 사용할 기본값을 정의합니다.
– revision: project에서 사용할 태그, 브랜치
– remote: 프로젝트에서 사용할 git서버
49 11th Kandroid Conference - www.kandroid.org
manifest의 내용
• project
– name: 프로젝트에서 사용할 원격 git 저장소
• 실제 저장소 위치는 remote의 fetch와 연결되어서 사용
– path: 로컬 파읷시스템에 저장할 위치
– revision: 사용할 브랜치, 태그, 또는 커밋id
– remote: 원격 git 저장소 위치
50 11th Kandroid Conference - www.kandroid.org
그런데 받은 소스중에 커널 소스가 없어요.
• repo init을 실행하면 원격 저장소에 있던 default.xml이 .repo/manifest.xml 로 저장됩니다.
– manifest.xml에 커널 소스는 제외되어 있습니다.
– 필요하면 .repo/manifest.xml을 직접 수정하면 됩니다.
• 하지만 서버에서 변경이 되면 conflict가 발생하기 때문에 다음과 같이 쓰시기를 권장합니다.
51 11th Kandroid Conference - www.kandroid.org
local_manifest.xml
• .repo/local_manifest.xml에 필요한 저장소를 추가하거나 삭제하도록 지정할 수 있습니다.
– 변경하려면 삭제후 추가하면 됩니다.
• 최근에는 .repo/local_manifests/ 디렉토리에 xml을 만들어서 사용하도록 변경되었습니다.
• 참고: manifest.xml의 DTD
54 11th Kandroid Conference - www.kandroid.org
repo sync
• init이후 sync 명령으로 git저장소의 내용을 로컬에 내려받을 수 있습니다.
• 상대 경로로 지정해서 해당 디렉토리만 내려받을 수도 있습니다.
• init 이후 처음 sync는 브랜치 대싞 브랜치의 commit으로 checkout 됩니다.
• 로컬에 변경한 커밋이 존재하면 자동으로 rebase 됩니다.
56 11th Kandroid Conference - www.kandroid.org
git commit
• repo를 이용해서 git저장소를 만들면 커밋할 때 평소와 다른 것을 발견할 수 있습니다.
57 11th Kandroid Conference - www.kandroid.org
signed-off
• commit 할 때 –s 옵션을 붙이면 됩니다.
• 해당 변경사항을 작성한 사람을 뜻합니다. – 변경사항에 대한 법적 책임을 감수하게 됩
니다.
– 공동작업읷 경우에는 여러 개의 signed-off가 들어갈 수 있습니다.
• 또한 변경사항을 해당 프로젝트에 사용해도 괜찮다고 허락한다는 뜻이기도 합니다.
58 11th Kandroid Conference - www.kandroid.org
Change-Id
• repo로 저장소를 만들면 change-id를 생성하는 commit-hook 스크립트가 자동으로 등록됩니다
• Gerrit에서 사용되는 리뷰 항목 구분자
– git commit id와는 관련이 없습니다.
– 커밋 로그에 이 항목이 없으면 gerrit에 등록할 때마다 새로운 리뷰항목으로 생성됩니다.
59 11th Kandroid Conference - www.kandroid.org
repo upload
• Gerrit에 리뷰 항목을 등록합니다.
• 만약 업로드가 완료되지 않은 브랜치가 여러개 존재하면 편집기가 열리면서 어떤 브랜치를 올릴 것읶지 확읶합니다.
• sync나 start 명령과 마찬가지로 특정 프로젝트 디렉토리만 지정해서 작업할 수 있습니다.
63 11th Kandroid Conference - www.kandroid.org
리뷰어 찾아보기.
• 직젂에 해당 부분을 수정한 사람을 리뷰어로 등록
– git blame 명령
– 혹시 커밋에 signed-off 에 등록되어 있는 사람이 더 있으면 그 사람도 등록
– change-id 로 gerrit을 검색해서, 해당 변경사항을 리뷰한 사람이 있으면 그 사람도 등록
• google groups나 freenode의 #android 채널에서 메읶테이너가 누군지 물어보기
64 11th Kandroid Conference - www.kandroid.org
git blame commit id Author Change Date line number code body
68 11th Kandroid Conference - www.kandroid.org
Gerrit의 항목 내려받기
• 여러가지 방법이 존재하지만 하나의 항목을 받으려면 cherry-pick을 추천합니다.
75 11th Kandroid Conference - www.kandroid.org
Conclusion
• 소스 리뷰 소프트웨어는 바람직한 협업을 이끌어 낼 수 있는 유용한 도구 – 구글 직원이라고 모든 것을 알지 못한다.
– 협업을 잘했을 뿐.
• AOSP에 기여하려면 Gerrit에 익숙해져야 함.
• repo를 사용하면 Gerrit을 쉽게 이용할 수 있음.
76 11th Kandroid Conference - www.kandroid.org
References
• Code Review : http://en.wikipedia.org/wiki/Code_review
• Mondrian : http://goo.gl/40joR (PDF 문서)
• Rietveld : https://code.google.com/p/rietveld
• Gerrit : https://code.google.com/p/gerrit
• Chrome Review : https://codereview.chromium.org
• Android Review : https://android-
review.googlesource.com
• Gerrit Command line Manual : http://goo.gl/gzxsj
• Gerrit REST Api Manual : http://goo.gl/8mBIR
77 11th Kandroid Conference - www.kandroid.org
References
• Repo : http://goo.gl/TNeGU
• Mylyn Gerrit Connector :
http://www.eclipse.org/reviews/gerrit/
• Mylyn Reviews : http://www.eclipse.org/reviews/
• AOSP의 manifest.xml : http://goo.gl/l5qis
• CyanogenMod 의 manifest.xml : http://goo.gl/B8aNs
• manifest.xml 의 DTD : http://goo.gl/dYwJq
• repo의 commit-hook 스크립트 : http://goo.gl/0hNyQ