1. 계정 생성

$ sudo htpasswd /opt/gerrit/etc/passwords "pl_user"
$ sudo htpasswd /opt/gerrit/etc/passwords "user"

먼저 "pl_user", "user" 계정을 생성한다.

 

2. Group 생성 및 설정

administrator 계정으로 로그인하여 BROWSE -> Groups -> Creadte New -> Project Leaders 그룹을 생성한다.

 

Members 클릭하여 "pl_user" 계정을 Project Leaders 그룹에 추가한다. 

위와 같이 "user" 계정은 Service Users 그룹에 추가해 준다.

계정이 등록되어 있으면 위와 같이 자동완성처럼 나온다 만약 나오지 않는다면 계정으로 최초 로그인 후에 다시 확인한다.

 

 

root : Administrators

pl_user : Project Leaders

user : Service Users 

 

2. 권한 설정

BROWSE -> All_Projects -> Access에서 권한 설정을 할 수있다. 프로젝트 권한에 대한 Configure은 모두

project.config 파일로 저장되어 있다. project.config를 보면서 간략하게 정리해 보겠다.

 

[project]
	description = Access inherited by all other projects.
[receive]
	requireContributorAgreement = false
	requireSignedOffBy = false
	requireChangeId = true
	enableSignedPush = false
[submit]
	mergeContent = true
[access "refs/*"]
	read = group Administrators
[access "refs/for/*"]
	addPatchSet = group Registered Users
[access "refs/for/refs/*"]
	push = group Registered Users
	pushMerge = group Registered Users
[access "refs/heads/*"]
	create = group Administrators
#	create = group Project Leaders					그룹 생성 권한
	create = group Project Owners
	editTopicName = +force group Administrators
#	editTopicName = +force group Project Leaders			코드리뷰중 Topic 수정 가능
	editTopicName = +force group Project Owners
	forgeAuthor = group Registered Users
	forgeCommitter = group Administrators
#	forgeCommitter = group Project Leaders
	forgeCommitter = group Project Owners
#	forgeCommitter = group Registered Users
#	forgeCommitter = group Service Users
	label-Code-Review = -2..+2 group Administrators
	label-Code-Review = -2..+2 group Project Owners
#	label-Code-Review = -2..+2 group Registered Users		"user" 점수 범위 수정
	push = group Administrators
	push = group Project Owners
	read = group Anonymous Users
	revert = group Registered Users
	submit = group Administrators
#	submit = group Project Leaders				코드리뷰후 submit 권한 부여
	submit = group Project Owners
#	delete = group Project Leaders				프로젝트 삭제 권한
#	label-Verified = -1..+1 group Administrators		코드리뷰 Verified 권한 부여
#	label-Verified = -1..+1 group Project Leaders
[access "refs/meta/config"]
	exclusiveGroupPermissions = read
	create = group Administrators
	create = group Project Owners
	label-Code-Review = -2..+2 group Administrators
	label-Code-Review = -2..+2 group Project Owners
	push = group Administrators
	push = group Project Owners
	read = group Administrators
#	read = group Project Leaders			project -> browse -> 저장소 보는 권한
	read = group Project Owners
	submit = group Administrators
	submit = group Project Owners
[access "refs/meta/version"]
	read = group Anonymous Users
[access "refs/tags/*"]
	create = group Administrators
#	create = group Project Leaders			테그 관련 권한 부여
	create = group Project Owners
#	create = group Service Users
	createSignedTag = group Administrators
#	createSignedTag = group Project Leaders
	createSignedTag = group Project Owners
#	createSignedTag = group Service Users
	createTag = group Administrators
#	createTag = group Project Leaders
	createTag = group Project Owners
#	createTag = group Service Users
	label-Verified = -1..+1 group Project Leaders
[label "Code-Review"]
	function = MaxWithBlock
	defaultValue = 0
	copyMinScore = true
	copyAllScoresOnTrivialRebase = true
	value = -2 This shall not be merged
	value = -1 I would prefer this is not merged as is
	value = 0 No score
	value = +1 Looks good to me, but someone else must approve
	value = +2 Looks good to me, approved
[label "Verified"]
	function = MaxWithBlock
	value = -1 Fails
	value = 0 No score
	value = +1 Verified
	copyAllScoresIfNoCodeChange = true
	defaultValue = 0
[capability]
	administrateServer = group Administrators
	priority = batch group Service Users
	streamEvents = group Service Users

주석처리된 부분이 Gerrit 설치 후 추가된 부분이다.

[label "Verified"] 같은 경우 gerrit 설치할 때, Install Verified label         [y/N]? y 부분으로 생성되었다.

 

 

★★ git push-for-review error  =>>>  and you lack 'forge committer' permission.
■ Reference: refs/heads/* -> Forge Committer Identity 추가


■ Reference: refs/meta/config -> Read -> web browse 보기 기능
■merged 된거 들어가면 revert 있음. revert 하면 open에 생성됨.
■ 테그 생성
Reference: refs/tags/* -> Create Reference  => 생성은 되지만 delete 안됨
Reference: refs/tags/* -> delete Reference  => administrator은 자동으로 됨 (pl_users 추가) -> 테그 삭제 기능
Reference: refs/heads/* -> delete Reference  => 브랜치 삭제 기능
■Global Capabilities -> create Project -> pl_users
■그냥 git push 는 administrator 만 가능. 코드리뷰에 뜨지 않음.

 

권한설정 참고 :

https://www.epicycle.info/2016/11/03/gerrit-acl.html

https://gerrit-review.googlesource.com/Documentation/access-control.html

 

Gerrit Code Review - Access Controls

LDAP groups are Account Groups that are maintained inside of your LDAP instance. If you are using LDAP to manage your groups they will not appear in the Groups list. However you can use them just like regular Account Groups by prefixing your group with "ld

gerrit-review.googlesource.com

 

아래에 적용된 소스입니다.

[project]
	description = Access inherited by all other projects.
[receive]
	requireContributorAgreement = false
	requireSignedOffBy = false
	requireChangeId = true
	enableSignedPush = false
[submit]
	mergeContent = true
[access "refs/*"]
	read = group Administrators
[access "refs/for/*"]
	addPatchSet = group Registered Users
[access "refs/for/refs/*"]
	push = group Registered Users
	pushMerge = group Registered Users
[access "refs/heads/*"]
	create = group Administrators
	create = group Project Leaders
	create = group Project Owners
	editTopicName = +force group Administrators
	editTopicName = +force group Project Leaders
	editTopicName = +force group Project Owners
	forgeAuthor = group Registered Users
	forgeCommitter = group Administrators
	forgeCommitter = group Project Leaders
	forgeCommitter = group Project Owners
	forgeCommitter = group Registered Users
	forgeCommitter = group Service Users
	label-Code-Review = -2..+2 group Administrators
	label-Code-Review = -2..+2 group Project Owners
	label-Code-Review = -2..+2 group Registered Users
	push = group Administrators
	push = group Project Owners
	read = group Anonymous Users
	revert = group Registered Users
	submit = group Administrators
	submit = group Project Leaders
	submit = group Project Owners
	delete = group Project Leaders
	label-Verified = -1..+1 group Administrators
	label-Verified = -1..+1 group Project Leaders
[access "refs/meta/config"]
	exclusiveGroupPermissions = read
	create = group Administrators
	create = group Project Owners
	label-Code-Review = -2..+2 group Administrators
	label-Code-Review = -2..+2 group Project Owners
	push = group Administrators
	push = group Project Owners
	read = group Administrators
	read = group Project Leaders
	read = group Project Owners
	submit = group Administrators
	submit = group Project Owners
[access "refs/meta/version"]
	read = group Anonymous Users
[access "refs/tags/*"]
	create = group Administrators
	create = group Project Leaders
	create = group Project Owners
	create = group Service Users
	createSignedTag = group Administrators
	createSignedTag = group Project Leaders
	createSignedTag = group Project Owners
	createSignedTag = group Service Users
	createTag = group Administrators
	createTag = group Project Leaders
	createTag = group Project Owners
	createTag = group Service Users
	label-Verified = -1..+1 group Project Leaders
[label "Code-Review"]
	function = MaxWithBlock
	defaultValue = 0
	copyMinScore = true
	copyAllScoresOnTrivialRebase = true
	value = -2 This shall not be merged
	value = -1 I would prefer this is not merged as is
	value = 0 No score
	value = +1 Looks good to me, but someone else must approve
	value = +2 Looks good to me, approved
[label "Verified"]
	function = MaxWithBlock
	value = -1 Fails
	value = 0 No score
	value = +1 Verified
	copyAllScoresIfNoCodeChange = true
	defaultValue = 0
[capability]
	administrateServer = group Administrators
	priority = batch group Service Users
	streamEvents = group Service Users

 

 

 

 

Project.config를 git clone하여 수정하여 사용가능하다.

 

https://stackoverflow.com/questions/22229536/edit-project-config-in-a-gerrit-project
https://monkeycow.tistory.com/29

'Gerrit' 카테고리의 다른 글

Gerrit Porject 생성 및 Push  (1) 2021.12.05
Gerrit 설치  (0) 2021.12.02

 

1. project 생성

 

 

 

2. SSH 인증 

$ ssh-keygen
$ vi .ssh/id_rsa.pub		#복사하여 gerrit web에서 계정 Setting -> SSH Keys에 넣는다.

 

 

3. Gerrit Clone & Push

 

 

$ git clone "ssh://whatmam@192.168.111.130:29418/test_repo"
$ cd test_repo
$ git add test.config
$ git commit -m "test 1"
$ git push

 

'browse'는 git repogitory의 모든 파일을 보여준다.

'view all'은 code-review를 할때 사용된다.

 

먼저 browse에 들어가보면 정상적으로 push가 된것을 볼 수있다. 

그러나 이건 code-review가 아닌 흔히 아는 git push와 동일하고 'view all'에는 아무것도 보이지 않는다.

gerrit은 code-review를 하기위해선 특정 brach로 push되어야한다. 좀 독특하다.

code-review를 위한 push를 해보자.

 

* Clone with commit-msg hook 로 clone하여 실행

$ git clone "ssh://whatmam@192.168.111.130:29418/test_repo" && scp -p -P 29418 whatmam@192.168.111.130:hooks/commit-msg "test_repo/.git/hooks/"
$ git config --global alias.push-for-review "push origin HEAD:refs/for/master"
$	### test.config 수정
$ git add test.config 
$ git commit -m "for code review test"
$ git push-for-review

기본적으로 Commit-Id가 있어야 push가 가능하다. 또한 push하는 brach가 "HEAD:refs/for/master"인 것을 볼 수 있다.

그래서 hooks를 이용하여 Commit-Id를 자동으로 생성하도록 하면서 push하게 쓰는데 gerrit web에서 Clone with commit-msg hook를 제공하여 한번에 받으면 된다.

좀 더 편한 push를 위해 alias 등록하여 사용하겠다.

 

참고 : https://www.mediawiki.org/wiki/Gerrit/Alternatives_to_git-review

 

이제 아래와 같이 확인하면 된다.

 

"REPLY" 버튼을 누르고 review하면 "submit" 버튼이 생성되어야 하는데 생기지 않는다.

Defalut가 Code-Review 2점이상 verified 1점이상 이여야 submit이 가능하다.. 근데 verified 점수주는게 보이지 않는다.

 

 

All-Projects -> Access 

Reference: refs/heads/* 에 Label Verified Administrators 추가하여 저장

 

이제 정상적으로 submit 버튼이 보인다.

 

 * Merged된 결과 화면

'Gerrit' 카테고리의 다른 글

Gerrit 계정 권한 설정  (0) 2021.12.22
Gerrit 설치  (0) 2021.12.02

<Spec>

  • Ubuntu version : ubuntu-18.04.5-desktop-amd64
  • Gerrit version : 3.4.1.war
  • JDK version : 11.X 이상
  • Database : H2 (Gerrit defalut DB)
  • Git Repository browser : Gitiles (Gerrit defalut DB) 

(참고로, gerrit-3.1.4.war 는 JDK 8.X 이상이면 된다.)

 

 

-Working path

$ pwd
/opt

 

1. Apache2 설치

$ sudo apt-get install apache2
$ sudo apt-get install apache2-utils
$ sudo a2enmod proxy				# 상태 확인
$ sudo a2enmod proxy_http			# 상태 확인
$ sudo service apache2 restart			#apache2 Start
$ systemctl status apache2			#apache2 상태 확인

 

2. Open SSH Server 설치

$ sudo apt-get install openssh-server

 

3. Git 설치

$ sudo apt-get install git

 

4. Gerrit 설치

$ sudo apt install openjdk-11-jre-headless
$ sudo wget https://gerrit-releases.storage.googleapis.com/gerrit-3.4.1.war
$ sudo java -jar gerrit-3.4.1.war init -d /opt/gerrit

 

[sudo] password for whatmam: 
Using secure store: com.google.gerrit.server.securestore.DefaultSecureStore
[2021-12-01 06:33:08,345] [main] INFO  com.google.gerrit.server.config.GerritServerConfigProvider : No /opt/gerrit/etc/gerrit.config; assuming defaults

*** Gerrit Code Review 3.4.1
*** 

Create '/opt/gerrit'           [Y/n]? Y

*** Git Repositories
*** 

Location of Git repositories   [git]: repositories

*** JGit Configuration
*** 

Auto-configured "receive.autogc = false" to disable auto-gc after git-receive-pack.

*** Index
*** 

Type                           [lucene]: 

*** User Authentication
*** 

Authentication method          [openid/?]: http
Get username from custom HTTP header [y/N]? y
Username HTTP header           [SM_USER]: 
SSO logout URL                 : 
Enable signed push support     [y/N]?  

*** Review Labels
*** 

Install Verified label         [y/N]? y

*** Email Delivery
*** 

SMTP server hostname           [localhost]: smtp.gmail.com    
SMTP server port               [(default)]: 465     
SMTP encryption                [none/?]: SSL
SMTP username                  [root]: whatmam@gmail.com
whatmam@gmail.com's password   : 
              confirm password : 

*** Container Process
*** 

Run as                         [root]: 
Java runtime                   [/usr/lib/jvm/java-11-openjdk-amd64]: 
Copy gerrit-3.4.1.war to /opt/gerrit/bin/gerrit.war [Y/n]? Y
Copying gerrit-3.4.1.war to /opt/gerrit/bin/gerrit.war

*** SSH Daemon
*** 

Listen on address              [*]: 
Listen on port                 [29418]: 
Generating SSH host key ... rsa... ed25519... ecdsa 256... ecdsa 384... ecdsa 521... done

*** HTTP Daemon
*** 

Behind reverse proxy           [y/N]? y
Proxy uses SSL (https://)      [y/N]? 
Subdirectory on proxy server   [/]: 
Listen on address              [*]: 192.168.111.130
Listen on port                 [8081]: 8989
Canonical URL                  [http://192.168.111.130/]: 

*** Cache
*** 


*** Plugins
*** 

Installing plugins.
Install plugin codemirror-editor version v3.4.1 [y/N]? y
Installed codemirror-editor v3.4.1
Install plugin commit-message-length-validator version v3.4.1 [y/N]? y
Installed commit-message-length-validator v3.4.1
Install plugin delete-project version v3.4.1 [y/N]? y
Installed delete-project v3.4.1
Install plugin download-commands version v3.4.1 [y/N]? y
Installed download-commands v3.4.1
Install plugin gitiles version v3.4.1 [y/N]? y
Installed gitiles v3.4.1
Install plugin hooks version v3.4.1 [y/N]? y
Installed hooks v3.4.1
Install plugin plugin-manager version v3.4.1 [y/N]? y
Installed plugin-manager v3.4.1
Install plugin replication version v3.4.1 [y/N]? y
Installed replication v3.4.1
Install plugin reviewnotes version v3.4.1 [y/N]? y
Installed reviewnotes v3.4.1
Install plugin singleusergroup version v3.4.1 [y/N]? y
Installed singleusergroup v3.4.1
Install plugin webhooks version v3.4.1 [y/N]? y
Installed webhooks v3.4.1
Initializing plugins.

============================================================================
Welcome to the Gerrit community

Find more information on the homepage: https://www.gerritcodereview.com
Discuss Gerrit on the mailing list: https://groups.google.com/g/repo-discuss
============================================================================
Initialized /opt/gerrit
Init complete, reindexing accounts with: reindex --site-path /opt/gerrit --threads 1 --index accountsReindexed 0 documents in accounts index in 0.0s (0.0/s)
Index accounts in version 11 is ready
Warning: InterruptedException
java.lang.InterruptedException
at java.base/java.lang.Object.wait(Native Method)
at java.base/java.lang.Thread.join(Thread.java:1308)
at org.h2.util.MathUtils.getSecureRandom(MathUtils.java:105)
at org.h2.util.MathUtils.secureRandomBytes(MathUtils.java:307)
at org.h2.store.FileLock.setUniqueId(FileLock.java:315)
at org.h2.store.FileLock.lockFile(FileLock.java:345)
at org.h2.store.FileLock.lock(FileLock.java:136)
at org.h2.engine.Database.open(Database.java:622)
at org.h2.engine.Database.openDatabase(Database.java:260)
at org.h2.engine.Database.<init>(Database.java:254)
at org.h2.engine.Engine.openSession(Engine.java:57)
at org.h2.engine.Engine.openSession(Engine.java:164)
at org.h2.engine.Engine.createSessionAndValidate(Engine.java:142)
at org.h2.engine.Engine.createSession(Engine.java:125)
at org.h2.engine.Engine.createSession(Engine.java:27)
at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:331)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:107)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:91)
at org.h2.Driver.connect(Driver.java:74)
at com.google.gerrit.server.cache.h2.H2CacheImpl$SqlHandle.<init>(H2CacheImpl.java:679)
at com.google.gerrit.server.cache.h2.H2CacheImpl$SqlStore.acquire(H2CacheImpl.java:647)
at com.google.gerrit.server.cache.h2.H2CacheImpl$SqlStore.buildBloomFilter(H2CacheImpl.java:365)
at com.google.gerrit.server.cache.h2.H2CacheImpl$SqlStore.open(H2CacheImpl.java:337)
at com.google.gerrit.server.cache.h2.H2CacheImpl.start(H2CacheImpl.java:197)
at com.google.gerrit.server.logging.LoggingContextAwareRunnable.run(LoggingContextAwareRunnable.java:113)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:829)
Collecting projects:    2 changes with: reindex --site-path /opt/gerrit --threads 1 --index changes
Reindexing changes: project-slices: 100% (2/2), done    
Reindexed 0 documents in changes index in 0.0s (0.0/s)
Index changes in version 61 is ready
Reindexing groups:      100% (2/2)ith: reindex --site-path /opt/gerrit --threads 1 --index groups
Reindexed 2 documents in groups index in 0.2s (11.4/s)
Index groups in version 8 is ready
Reindexing projects:    100% (2/2) with: reindex --site-path /opt/gerrit --threads 1 --index projects
Reindexed 2 documents in projects index in 0.1s (14.5/s)
Index projects in version 4 is ready
Executing /opt/gerrit/bin/gerrit.sh start
Starting Gerrit Code Review: OK
Waiting for server on 192.168.111.130:80 ... OK
Opening http://192.168.111.130/#/admin/projects/ ...Gtk-Message: 06:47:49.754: Failed to load module "canberra-gtk-module"
OK

후에 다시 수정해서 사용하기에 기본적으로 Setting 해준다. plugin은 무지성 깔아보려한다.

 

 

5. Gerrit 계정 추가

$ sudo htpasswd -c /opt/gerrit/etc/passwords "whatmam"
$		### 	추가로 계정 추가시 -c option 제거

htpasswd로 생성하는 계정은 apache에서 인증을 위해 사용하는 계정이며, gerrit은 처음 생성된 계정(uid 1000000)을 administrator로 인식한다.

 

* Port number 

Gerrit port : 8989

apache port : 8081

6. Apache VirtualHost File 생성

$ sudo vi /etc/apache2/sites-available/001-whatmam.conf 


<VirtualHost *:8989>						### Gerrit Port 		
        ServerName 192.168.111.130				### Gerrit address
       
        ProxyRequests Off
        ProxyVia Off
        ProxyPreserveHost On

        <Proxy *>
                Order deny,allow
                Allow from all		
        </Proxy>

        <Location /login/>
                AuthType Basic
                AuthName "Gerrit Code Review"
                Require valid-user
                AuthUserFile /opt/gerrit/etc/passwords		### Gerrit passwords path 지정
        </Location>

        AllowEncodedSlashes On
        ProxyPass / http://192.168.111.130:8081/ nocanon	### nocanon option 필수
        ProxyPassReverse / http://192.168.111.130:8081/
</VirtualHost>

 

7. Apache site-enabled 활성화

$ cd /etc/apache2/sites-enabled/
$ sudo ln -s ../sites-available/001-whatmam.conf ./001-whatmam.conf
$ sudo a2ensite 001-whatmam.conf
$	### a2ensite는 sites-available에 있는 Setting 활성화 (00X- 의 형식을지켜야함)
$	### Linking되어 있으면 굳이 쓸필요 없다.

 

8. Apache port 설정

$ sudo vi /etc/apache2/ports.conf


# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf

# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf

NameVirtualHost *:8989			### Gerrit port 추가
Listen 8989

<IfModule ssl_module>
        Listen 443
</IfModule>

<IfModule mod_gnutls.c>
        Listen 443
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

 

9. Gerrit Configure file 수정

$ vi /opt/gerrit/etc/gerrit.config


[gerrit]
        basePath = repositories
        canonicalWebUrl = http://192.168.111.130:8989/				### Gerrit URL & port
        serverId = a9a19cf0-f784-441c-be5a-f4f821df29cc
[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 = root
        javaHome = /usr/lib/jvm/java-11-openjdk-amd64
[index]
        type = lucene
[auth]
        type = HTTP
#       httpHeader = SM_USER
        logoutUrl = http://aa:aa@192.168.111.130:8989/login/		###  http특성으로 인한 Gerrit 버그 해결
[receive]
        enableSignedPush = false
[sendemail]
        smtpServer = smtp.gmail.com
        smtpServerPort = 465
        smtpEncryption = SSL
        smtpUser = whatmam@gmail.com
[sshd]
        listenAddress = *:29418
[httpd]
        listenUrl = proxy-http://192.168.111.130:8081/				### Apache port
[cache]
        directory = cache

logoutUrl에 'aa:aa' 부분이 빠지면 로그아웃이 되지않는 현상이 발생함. 'aa'라는 계정으로 login page접근하겠다는 의미로 로그아웃을 시켜버림.

 

10. Apache & gerrit restart

$ sudo service apache2 restart
$ sudo /opt/gerrit/bin/gerrit.sh restart

 

11. Gerrit 접속

"http://192.168.111.130:8989/" 로 접속해보겠다.

 

 

 

접속이 완료 되었다. 이것저것 둘러보고

다음에는

 - Repogitory 생성 및 clone push 

 - 계정 새성 및 권한 지정

 - 코드 리뷰를 위한 push 

 

알아보도록 하자!

'Gerrit' 카테고리의 다른 글

Gerrit 계정 권한 설정  (0) 2021.12.22
Gerrit Porject 생성 및 Push  (1) 2021.12.05

+ Recent posts