Gerrit 사용

다른 포스트에서 이어집니다.

프로젝트의 추가

프로젝트를 추가하는 방법에는 기본적으로 세 가지가 있다고 한다.

나는 web page를 통해 생성을 시도해본다.

Gerrit Web page를 통해 프로젝트 생성

Projects > Create New Project 로 가서 Project Name에 temp를 입력하고 생성해본다.

이러면 원래 지정해두었던 ~/repository 디렉토리 안에 새로운 temp.git 이라는 저장소가 생성된다.

사용자 추가 (Server side)

사용자의 추가는 gerrit 사용자 계정에서 아래 명령을 통해 추가한다. 이전에 admin을 추가했었다.

$ htpasswd ~/opt/gerrit/etc/passwords user

해당 사용자로 처음 로그인을 시도하면 이름, 이메일 및 SSH public key를 넣으라고 나온다.

이름과 이메일을 넣고, SSH public key는 다음과 같이 생성하여 넣으면 된다.

만약, 이전에 smtp 설정을 하지 않았다면 새 사용자의 email 인증은 진행할 수 없다.

SSH public key 생성 (Client side)

아래와 같이 생성된 key의 내용을 복사하여 gerrit에 넣고 Add를 눌러 추가한다.

$ cd ~
$ mkdir .ssh
$ cd .ssh
$ ssh-keygen # 전부 그냥 엔터
$ cat id_rsa.pub # 여기 나오는 내용이 SSH public key이다.

Project clone (Client side)

새로 추가한 user 계정에서 gerrit 접속 후 projects > List > temp로 가면 현재 프로젝트를 clone할 수 있는 주소를 알 수 있다.

http와 ssh로 나뉘어 제공되며, 나는 ssh로 clone 해본다.

git clone ssh://user@192.168.0.99:29418/temp

push 1차 실패

파일 생성 후 push를 시도해본다.

$ touch b
$ git add -A
$ git commit -m "[temp] touch b"
$ git push
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 231 bytes | 0 bytes/s, done.
Total 2 (delta 0), reused 0 (delta 0)
remote: Branch refs/heads/master:
remote: You are not allowed to perform this operation.
remote: To push into this reference you need 'Push' rights.
remote: User: user
remote: Please read the documentation and contact an administrator
remote: if you feel the configuration is incorrect
remote: Processing changes: refs: 1, done
To ssh://user@192.168.0.99:29418/temp
! [remote rejected] master -> master (prohibited by Gerrit)
error: 레퍼런스를 'ssh://user@192.168.0.99:29418/temp'에 푸시하는데 실패했습니다

직접 push할 수 있는 권한이 없다.

검색을 해보면 이전에는 git review라는 명령어가 있었던 것 같은데 지금은 존재하지 않는다.

$ git remote -v 해서 temp 저장소에 대한 정보를 보면 master의 merge가 refs/heads/master로 되어있는 것을 확인할 수 있다.

하지만 gerrit을 통해 code review를 받기 위해서는 refs/for/master 로 push를 해야한다고 한다.

The refs/for/ prefix is used to map the Gerrit concept of “Pushing for Review” to the git protocol.

시키는대로 한다.

$ git push origin HEAD:refs/for/refs/heads/master

push 2차 실패

또 실패했다. 다행인 것은 에러가 다르다.

Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 231 bytes | 0 bytes/s, done.
Total 2 (delta 0), reused 0 (delta 0)
remote: Processing changes: refs: 1, done
remote: ERROR: missing Change-Id in commit message footer
remote:
remote: Hint: To automatically insert Change-Id, install the hook:
remote: gitdir=$(git rev-parse --git-dir); scp -p -P 29418 user@192.168.0.99:hooks/commit-msg ${gitdir}/hooks/
remote: And then amend the commit:
remote: git commit --amend
remote:
To ssh://user@192.168.0.99:29418/temp
! [remote rejected] HEAD -> refs/for/refs/heads/master (missing Change-Id in commit message footer)
error: 레퍼런스를 'ssh://user@192.168.0.99:29418/temp'에 푸시하는데 실패했습니다

Change-Id가 없단다. 추적을 위해 반드시 필요한 부분이니 또 시키는대로 해본다.

$ scp -p -P 29418 user@192.168.0.99:hooks/commit-msg .git/hooks/
$ git commit --amend #그냥 저장만 하고 나오자.

git log를 쳐보면 Change-Id가 생성된 것을 확인할 수 있다. 기쁜 마음으로 git push origin HEAD:refs/for/refs/heads/master 해보자.

드디어 성공했다.

Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 278 bytes | 0 bytes/s, done.
Total 2 (delta 0), reused 0 (delta 0)
remote: Processing changes: new: 1, refs: 1, done
remote:
remote: New Changes:
remote: http://192.168.0.99:80/1 [temp] touch b
remote:
To ssh://user@192.168.0.99:29418/temp
* [new branch] HEAD -> refs/for/refs/heads/master

Gerrit에서 확인하기

브라우저로 가서 gerrit에 들어가본다.

My > Changes 로 가면 방금 push한 commit을 확인할 수 있다.

administrator 또는 reviewer group에 속한 사람의 계정으로 접속하면 코드를 확인 및 점수를 줄 수 있고 commit을 submit (merge)할 수 있다.

자신의 commit에 변경사항이 발생하면 email로도 알려준다. 좋은 세상이다.

참조

Share