이 경우에는 두 시점의 manifest 파일을 생성하고, 이 둘 사이의 commit을 비교하면 된다.
회사에서 이러한 용도를 위해 작성된 Linux Shell Script를 사용하고 있는데, 조금 아쉽기는 했다.
다른 유틸리티를 찾다보니, repo 명령어에도 이러한 기능을 제공하는 명령어가 있었다.
$ repo help diffmanifests
Summary
Manifest diff utility
Usage: repo diffmanifests manifest1.xml [manifest2.xml] [options]
Options:
-h, --help show this help message and exit
--raw Display raw diff.
--no-color does not display the diff in color.
--pretty-format=<FORMAT>
print the log using a custom git pretty format string
Description
The repo diffmanifests command shows differences between project
revisions of manifest1 and manifest2. if manifest2 is not specified,
current manifest.xml will be used instead. Both absolute and relative
paths may be used for manifests. Relative paths start from project's
".repo/manifests" folder.
The --raw option Displays the diff in a way that facilitates parsing,
the project pattern will be <status> <path> <revision from> [<revision
to>] and the commit pattern will be <status> <onelined log> with status
values respectively :
A = Added project
R = Removed project
C = Changed project
U = Project with unreachable revision(s) (revision(s) not found)
for project, and
A = Added commit
R = Removed commit
for a commit.
Only changed projects may contain commits, and commit status always
starts with a space, and are part of last printed project. Unreachable
revisions may occur if project is not up to date or if repo has not been
initialized with all the groups, in which case some projects won't be
synced and their revisions won't be found.
사용법은 단순히 'repo diffmanifests <manifest 1> <manifest 2> <option>'을 사용하면 된다.
이 명령을 실행하면, <manifest 1>기준으로 <manifest 2>와의 변경된 commit을 보여준다.
만약 <manifest 2>를 생략하면, manifest.xml으로 대체된다. 즉, 현재 사용중인 maniefst와 비교한다.
실행화면
다음은 실제 실행 화면이다.
added projects는 두번째 manifest 파일에서 추가된 저장소이며,
changed projects는 변경된 저장소와 commit을 표시한다.
그런데, 나는 commit의 작성자 정보도 잘 사용하는 편이기 때문에, '--pretty-format' 옵션으로 작성자 정보도 추가해보았다.
기능 변경
그런데, diffmanifests 명령의 기준이 저장소 이름 (name)이 아니라 저장소 경로 (path)이다.
해당 코드를 살펴보면, 저장소 경로를 기준으로 정렬한 이후에 해당 저장소의 commit을 보여준다.
저장소 경로는 저장소의 unique한 식별자가 아니기 때문에, 나는 저장소 이름 기준으로 표시하도록 수정하였다.
관련된 코드 경로는 다음과 같다.
.repo/repo/manifest_xml.py
.repo/repo/subcmds/diffmanifests.py
$ git diff
diff --git a/subcmds/diffmanifests.py b/subcmds/diffmanifests.py
index b999699..f2269d3 100644
--- a/subcmds/diffmanifests.py
+++ b/subcmds/diffmanifests.py
@@ -79,21 +79,21 @@ synced and their revisions won't be found.
def _printRawDiff(self, diff):
for project in diff['added']:
- self.printText("A %s %s" % (project.relpath, project.revisionExpr))
+ self.printText("A %s %s" % (project.name, project.revisionExpr))
self.out.nl()
for project in diff['removed']:
- self.printText("R %s %s" % (project.relpath, project.revisionExpr))
+ self.printText("R %s %s" % (project.name, project.revisionExpr))
self.out.nl()
for project, otherProject in diff['changed']:
- self.printText("C %s %s %s" % (project.relpath, project.revisionExpr,
+ self.printText("C %s %s %s" % (project.name, project.revisionExpr,
otherProject.revisionExpr))
self.out.nl()
self._printLogs(project, otherProject, raw=True, color=False)
for project, otherProject in diff['unreachable']:
- self.printText("U %s %s %s" % (project.relpath, project.revisionExpr,
+ self.printText("U %s %s %s" % (project.name, project.revisionExpr,
otherProject.revisionExpr))
self.out.nl()
@@ -103,7 +103,7 @@ synced and their revisions won't be found.
self.printText('added projects : \n')
self.out.nl()
for project in diff['added']:
- self.printProject('\t%s' % (project.relpath))
+ self.printProject('\t%s' % (project.name))
self.printText(' at revision ')
self.printRevision(project.revisionExpr)
self.out.nl()
@@ -113,7 +113,7 @@ synced and their revisions won't be found.
self.printText('removed projects : \n')
self.out.nl()
for project in diff['removed']:
- self.printProject('\t%s' % (project.relpath))
+ self.printProject('\t%s' % (project.name))
self.printText(' at revision ')
self.printRevision(project.revisionExpr)
self.out.nl()
@@ -123,7 +123,7 @@ synced and their revisions won't be found.
self.printText('changed projects : \n')
self.out.nl()
for project, otherProject in diff['changed']:
- self.printProject('\t%s' % (project.relpath))
+ self.printProject('\t%s' % (project.name))
self.printText(' changed from ')
self.printRevision(project.revisionExpr)
self.printText(' to ')
@@ -138,7 +138,7 @@ synced and their revisions won't be found.
self.printText('projects with unreachable revisions : \n')
self.out.nl()
for project, otherProject in diff['unreachable']:
- self.printProject('\t%s ' % (project.relpath))
+ self.printProject('\t%s ' % (project.name))
self.printRevision(project.revisionExpr)
self.printText(' or ')
self.printRevision(otherProject.revisionExpr)
수정된 사항을 내용을 적용하여 다시 'repo manifests' 명령을 실행하였다.
vendor/.... 경로로 표시되던 저장소가 projects/... 이름으로 표시됨을 알 수 있다.
user: root 로 설정하지 않으면 초기화 과정 중에 에러가 발생한다. 이 에러는 docker내 계정과 호스트 계정과의 공유 디렉토리의 권한 문제인데, 여러가지 시도를 했으나 다른 방법을 찾지 못했다. 이렇게 설정하는 경우에 공유디렉토리 수정시에 sudo 명령으로만 가능하다.
처음에는 gerrit/etc와 gerrit/git만 백업&복구하였으나, Review history등이 복구되지 않아서 나머지 디렉토리도 백업하였다.
plugins은 추후에 설치하려고 하였으나, Gerrit 3.1.10에서는 웹 인터페이스에서 설치가 되지 않아, 기존 백업에서 복사하였다.
command: init 부분이 아주 중요하다. 이 부분이 없으면, 백업한 자료들을 모두 초기화한다. 기존 자료를 이용하여 초기화 하기 위해서는 주석을 풀고, 실행해주어야 한다. (1회성)
Gerrit은 계정에 대한 인증 ( Authentication )을 직접 처리하지 않는다.
따라서 로그인을 위해서는 인증에 관한 별도 처리가 필요하다.
처음 Gerrit을 설치했을때는 HTTP 인증 ( Apache )을 통해 로그인을 진행하도록 했었다. 별도의 파일에 아이디와 계정을 처리했기 때문에 가장 단순했기 때문이다. 그러나 나는 Apache에 대한 지식도 없고, Gerrit 이외에 Apache를 신경쓰는게 부담이 되었기 때문에 인증 방식을 LDAP으로 처리해보았다.
그런데, 나는 LDAP에 대한 지식도 없었고, 회사내 LDAP 서버 정보도 그다지 많지 않았다.
사내 Jenkins와 Artifactory의 설정에 LDAP 정보가 있었고, 사내 Confluence에 LDAP 관련 내용이 있었으나 확실한 정보는 아니었다. 다만 이러한 정보를 바탕으로 여러가지 시도 끝에, LDAP 서버 정보과 검색을 할 수 있었다.
Canonical URL : Gerrit에 접속하기 위한 URL. 만약 외부 접속을 막고 싶다면, 호스트이름을 localhost로 변경한다. 아래 예에서 처럼 'bungslxubu51'의 경우는, 외부에서 접속이 되지 않을 수 있다.
Plugins : 모든 플러그인을 설치하기 위해 'Y'로 입력
junggu.lee@bungslxubu51:~$ java -jar ~/bin/gerrit-3.5.1.war init -d ~/work/gerrit_standalone
Using secure store: com.google.gerrit.server.securestore.DefaultSecureStore
[2022-04-22 07:30:56,181] [main] INFO com.google.gerrit.server.config.GerritServerConfigProvider : No /home/junggu.lee/work/gerrit_standalone/etc/gerrit.config; assuming defaults
*** Gerrit Code Review 3.5.1
***
Create '/home/junggu.lee/work/gerrit_standalone' [Y/n]?
*** Git Repositories
***
Location of Git repositories [git]:
*** JGit Configuration
***
Auto-configured "receive.autogc = false" to disable auto-gc after git-receive-pack.
*** Index
***
Type [lucene]:
*** User Authentication
***
Authentication method [openid/?]:
Enable signed push support [y/N]?
Use case insensitive usernames [Y/n]?
*** Review Labels
***
Install Verified label [y/N]?
*** Email Delivery
***
SMTP server hostname [localhost]:
SMTP server port [(default)]:
SMTP encryption [none/?]:
SMTP username :
*** Container Process
***
Run as [junggu.lee]:
Java runtime [/usr/lib/jvm/java-11-openjdk-amd64]:
Copy gerrit-3.5.1.war to /home/junggu.lee/work/gerrit_standalone/bin/gerrit.war [Y/n]?
Copying gerrit-3.5.1.war to /home/junggu.lee/work/gerrit_standalone/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]?
Use SSL (https://) [y/N]?
Listen on address [*]:
Listen on port [8080]: 8081
Canonical URL [http://bungslxubu51:8081/]:
*** Cache
***
*** Plugins
***
Installing plugins.
Install plugin codemirror-editor version v3.5.1 [y/N]? y
Installed codemirror-editor v3.5.1
Install plugin commit-message-length-validator version v3.5.1 [y/N]? y
Installed commit-message-length-validator v3.5.1
Install plugin delete-project version v3.5.1 [y/N]? y
Installed delete-project v3.5.1
Install plugin download-commands version v3.5.1 [y/N]? y
Installed download-commands v3.5.1
Install plugin gitiles version v3.5.1 [y/N]? y
Installed gitiles v3.5.1
Install plugin hooks version v3.5.1 [y/N]? y
Installed hooks v3.5.1
Install plugin plugin-manager version v3.5.1 [y/N]? y
Installed plugin-manager v3.5.1
Install plugin replication version v3.5.1 [y/N]? y
Installed replication v3.5.1
Install plugin reviewnotes version v3.5.1 [y/N]? y
Installed reviewnotes v3.5.1
Install plugin singleusergroup version v3.5.1 [y/N]? y
Installed singleusergroup v3.5.1
Install plugin webhooks version v3.5.1 [y/N]? y
Installed webhooks v3.5.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 /home/junggu.lee/work/gerrit_standalone
Init complete, reindexing accounts,changes,groups,projects with: reindex --site-path /home/junggu.lee/work/gerrit_standalone --threads 1 --index accounts --index changes --index groups --index projects --disable-cache-statsReindexed 0 documents in accounts index in 0.0s (0.0/s)
Index accounts in version 11 is ready
Reindexing groups: 100% (2/2)
Reindexed 2 documents in groups index in 0.3s (5.8/s)
Index groups in version 8 is ready
Reindexing changes: Slicing projects: 100% (2/2), done
Reindexed 0 documents in changes index in 0.5s (0.0/s)
Index changes in version 71 is ready
Reindexing projects: 100% (2/2)
Reindexed 2 documents in projects index in 0.1s (35.7/s)
Index projects in version 4 is ready
Executing /home/junggu.lee/work/gerrit_standalone/bin/gerrit.sh start
Starting Gerrit Code Review: WARNING: Could not adjust Gerrit's process for the kernel's out-of-memory killer.
This may be caused by /home/junggu.lee/work/gerrit_standalone/bin/gerrit.sh not being run as root.
Consider changing the OOM score adjustment manually for Gerrit's PID=4136478 with e.g.:
echo '-1000' | sudo tee /proc/4136478/oom_score_adj
OK
Waiting for server on bungslxubu51:8081 ... OK
Opening http://bungslxubu51:8081/#/admin/projects/ ...OK
또 다른 방법으로는 기본값으로 설정하는 옵션인 --batch 을 제거하면 각종 설정을 개별적으로 지정할 수 있다. ( Standalone 설치 )
내 경우에 8080 포트 충돌을 피하기 위해, Listen on port 부분을 8081 포트로 설정하고, 나머지 설정은 기본값으로 두었다.
junggu.lee@bungslxubu51:~$ java -jar ~/bin/gerrit-3.5.1.war init -d $GERRIT_SITE
Using secure store: com.google.gerrit.server.securestore.DefaultSecureStore
[2022-04-20 04:52:39,628] [main] INFO com.google.gerrit.server.config.GerritServerConfigProvider : No /home/junggu.lee/work/gerrit_quickstart/etc/gerrit.config; assuming defaults
*** Gerrit Code Review 3.5.1
***
Create '/home/junggu.lee/work/gerrit_quickstart' [Y/n]?
*** Git Repositories
***
Location of Git repositories [git]:
*** JGit Configuration
***
Auto-configured "receive.autogc = false" to disable auto-gc after git-receive-pack.
*** Index
***
Type [lucene]:
*** User Authentication
***
Authentication method [openid/?]:
Enable signed push support [y/N]?
Use case insensitive usernames [Y/n]?
*** Review Labels
***
Install Verified label [y/N]?
*** Email Delivery
***
SMTP server hostname [localhost]:
SMTP server port [(default)]:
SMTP encryption [none/?]:
SMTP username :
*** Container Process
***
Run as [junggu.lee]:
Java runtime [/usr/lib/jvm/java-11-openjdk-amd64]:
Copy gerrit-3.5.1.war to /home/junggu.lee/work/gerrit_quickstart/bin/gerrit.war [Y/n]?
Copying gerrit-3.5.1.war to /home/junggu.lee/work/gerrit_quickstart/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]?
Use SSL (https://) [y/N]?
Listen on address [*]:
Listen on port [8080]: 8081
Canonical URL [http://bungslxubu51:8081/]:
*** Cache
***
*** Plugins
***
Installing plugins.
Install plugin codemirror-editor version v3.5.1 [y/N]?
Install plugin commit-message-length-validator version v3.5.1 [y/N]?
Install plugin delete-project version v3.5.1 [y/N]?
Install plugin download-commands version v3.5.1 [y/N]?
Install plugin gitiles version v3.5.1 [y/N]?
Install plugin hooks version v3.5.1 [y/N]?
Install plugin plugin-manager version v3.5.1 [y/N]?
Install plugin replication version v3.5.1 [y/N]?
Install plugin reviewnotes version v3.5.1 [y/N]?
Install plugin singleusergroup version v3.5.1 [y/N]?
Install plugin webhooks version v3.5.1 [y/N]?
Initializing plugins.
No plugins found with init steps.
============================================================================
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 /home/junggu.lee/work/gerrit_quickstart
Init complete, reindexing accounts,changes,groups,projects with: reindex --site-path /home/junggu.lee/work/gerrit_quickstart --threads 1 --index accounts --index changes --index groups --index projects --disable-cache-statsReindexed 0 documents in accounts index in 0.0s (0.0/s)
Index accounts in version 11 is ready
Reindexing groups: 100% (2/2)
Reindexed 2 documents in groups index in 0.3s (6.3/s)
Index groups in version 8 is ready
Reindexing changes: Slicing projects: 100% (2/2), done
Reindexed 0 documents in changes index in 0.0s (0.0/s)
Index changes in version 71 is ready
Reindexing projects: 100% (2/2)
Reindexed 2 documents in projects index in 0.0s (40.8/s)
Index projects in version 4 is ready
Executing /home/junggu.lee/work/gerrit_quickstart/bin/gerrit.sh start
Starting Gerrit Code Review: WARNING: Could not adjust Gerrit's process for the kernel's out-of-memory killer.
This may be caused by /home/junggu.lee/work/gerrit_quickstart/bin/gerrit.sh not being run as root.
Consider changing the OOM score adjustment manually for Gerrit's PID=870815 with e.g.:
echo '-1000' | sudo tee /proc/870815/oom_score_adj
OK
Waiting for server on bungslxubu51:8081 ... OK
Opening http://bungslxubu51:8081/#/admin/projects/ ...OK
그리고 내부 테스트를 목적으로 하는 경우, 외부에서 Gerrit에 접속하는 것을 막을 수 있다.
이 경우, etc/gerrit.conifg 파일의 httpd.listenUrl을 localhost로 수정하면 된다. ( Gerrit의 Quickstart 문서 참조 )
Gerrit에 문제가 생겼을때는 에러 로그를 살펴본다. 에러 로그는 logs/error_log 이다.
다음은 내 에러 및 처리하는 과정을 표시하였다.
junggu.lee@bungslxubu51:~$ cat ~/work/gerrit_quickstart/logs/error_log
[2022-04-20T02:39:01.669Z] [main] INFO com.google.gerrit.server.git.WorkQueue : Adding metrics for 'SshCommandStart' queue
[2022-04-20T02:39:02.037Z] [main] INFO com.google.gerrit.server.git.WorkQueue : Adding metrics for 'SSH-Stream-Worker' queue
[2022-04-20T02:39:02.039Z] [main] INFO com.google.gerrit.server.git.WorkQueue : Adding metrics for 'SSH-Interactive-Worker' queue
[2022-04-20T02:39:02.039Z] [main] INFO com.google.gerrit.server.git.WorkQueue : Adding metrics for 'SSH-Batch-Worker' queue
[2022-04-20T02:39:02.040Z] [main] INFO com.google.gerrit.server.git.WorkQueue : Adding metrics for 'MigrateExternalIdCase' queue
[2022-04-20T02:39:02.052Z] [main] WARN com.google.gerrit.server.config.GitwebCgiConfig : gitweb not installed (no /usr/lib/cgi-bin/gitweb.cgi found)
[2022-04-20T02:39:02.726Z] [main] INFO org.eclipse.jetty.util.log : Logging initialized @5624ms to org.eclipse.jetty.util.log.Slf4jLog
[2022-04-20T02:39:02.854Z] [main] INFO com.google.gerrit.server.git.SystemReaderInstaller : Set JGit's SystemReader to read system config from /home/junggu.lee/work/gerrit_quickstart/etc/jgit.config
[2022-04-20T02:39:02.858Z] [main] INFO com.google.gerrit.server.git.LocalDiskRepositoryManager : Defaulting core.streamFileThreshold to 1001m
[2022-04-20T02:39:03.261Z] [main] INFO com.google.gerrit.server.plugins.PluginLoader : Loading plugins from /home/junggu.lee/work/gerrit_quickstart/plugins
[2022-04-20T02:39:03.275Z] [main] INFO com.google.gerrit.server.config.ScheduleConfig : No schedule configuration for "accountDeactivation".
[2022-04-20T02:39:03.313Z] [main] INFO com.google.gerrit.sshd.SshDaemon : Started Gerrit APACHE-SSHD-2.6.0 on *:29418
[2022-04-20T02:39:03.316Z] [main] INFO org.eclipse.jetty.server.Server : jetty-9.4.36.v20210114; built: 2021-01-14T16:44:28.689Z; git: 238ec6997c7806b055319a6d11f8ae7564adc0de; jvm 11.0.14.1+1-Ubuntu-0ubuntu1.20.04
[2022-04-20T02:39:03.342Z] [main] INFO org.eclipse.jetty.server.session : DefaultSessionIdManager workerName=node0
[2022-04-20T02:39:03.343Z] [main] INFO org.eclipse.jetty.server.session : No SessionScavenger set, using defaults
[2022-04-20T02:39:03.344Z] [main] INFO org.eclipse.jetty.server.session : node0 Scavenging every 600000ms
[2022-04-20T02:39:03.407Z] [main] INFO org.eclipse.jetty.server.handler.ContextHandler : Started o.e.j.s.ServletContextHandler@75452b01{/,null,AVAILABLE}
[2022-04-20T02:39:03.412Z] [main] ERROR com.google.gerrit.pgm.Daemon : Unable to start daemon
java.lang.IllegalStateException: Cannot start HTTP daemon
at com.google.gerrit.pgm.http.jetty.JettyServer$Lifecycle.start(JettyServer.java:109)
at com.google.gerrit.lifecycle.LifecycleManager.start(LifecycleManager.java:95)
at com.google.gerrit.pgm.Daemon.start(Daemon.java:386)
at com.google.gerrit.pgm.Daemon.run(Daemon.java:285)
at com.google.gerrit.pgm.util.AbstractProgram.main(AbstractProgram.java:61)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at com.google.gerrit.launcher.GerritLauncher.invokeProgram(GerritLauncher.java:224)
at com.google.gerrit.launcher.GerritLauncher.mainImpl(GerritLauncher.java:120)
at com.google.gerrit.launcher.GerritLauncher.main(GerritLauncher.java:65)
at Main.main(Main.java:28)
Caused by: java.io.IOException: Failed to bind to 0.0.0.0/0.0.0.0:8080
at org.eclipse.jetty.server.ServerConnector.openAcceptChannel(ServerConnector.java:349)
at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:310)
at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80)
at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:234)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
at org.eclipse.jetty.server.Server.doStart(Server.java:401)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
at com.google.gerrit.pgm.http.jetty.JettyServer$Lifecycle.start(JettyServer.java:95)
... 12 more
Caused by: java.net.BindException: Address already in use
at java.base/sun.nio.ch.Net.bind0(Native Method)
at java.base/sun.nio.ch.Net.bind(Net.java:459)
at java.base/sun.nio.ch.Net.bind(Net.java:448)
at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:227)
at java.base/sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:80)
at org.eclipse.jetty.server.ServerConnector.openAcceptChannel(ServerConnector.java:344)
... 19 more
Gerrit에서는 기본 설치시에 8080포트를 사용하는데, 이미 8080포트를 사용하고 있어서 사용할 수가 없다.
8080 포트가 사용되고 있는지 확인해보았다.
junggu.lee@bungslxubu51:~$ netstat -nap | grep 8080
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:58080 127.0.0.1:9099 TIME_WAIT -
Gerrit의 동작을 확인하기 위해서 가벼운 브라우저 ( light web browser )인 midori를 설치했는데, 이 midori에서 8080 포트를 사용하고 있었다.
Gerrit Trigger Plugin을 이용하여, Review commit이 올라올때 마다 Jenkins를 이용하여 빌드를 하였다.
이 때, 변경사항을 다음과 같은 방식으로 적용하였다.
cd vendor/google/tv/broadcaststack
git fetch "ssh://gerrit@gerrit.mycompany.net:29418/broadcaststack" ${GERRIT_REFSPEC} && git checkout FETCH_HEAD
그런데, 하나의 저장소에 대해서는 잘 동작하였으나, 여러 개의 저장소의 변경사항에 대해서는 위와 같은 방식이 적절하지 않았다. 즉, 변경사항을 추적할 저장소는 broadcaststack, projects/apple 이었는데, Jenkins script에서는 어느 저장소의 Patchset을 적용할지 ( 어느 디렉토리안에서 get fetch를 사용할지 ) 확인할 수 가 없었다.
그런데, repo download 명령어는 이전에 사용한 경험이 없어서, help를 찾아보았다.
$ repo help download
Summary
Download and checkout a change
Usage: repo download {[project] change[/patchset]}...
Options:
-h, --help show this help message and exit
-c, --cherry-pick cherry-pick instead of checkout
-r, --revert revert instead of checkout
-f, --ff-only force fast-forward merge
Description
The 'repo download' command downloads a change from the review system
and makes it available in your project's local working directory. If no
project is specified try to use current directory as a project.
약간의 시행착오 끝에, 다음과 같이 사용 방법을 확인할 수 있었다.
아래 코드에서 broadcaststack은 저장소 이름이고, 934/9에서 934는 Gerrit의 Change number(리뷰요청번호), 9는 Patchset number 이다.
$ repo download broadcaststack 934/9
From ssh://gerrit.mycompany.net:29418/broadcaststack
* branch refs/changes/34/934/9 -> FETCH_HEAD
HEAD is now at 49a307e6 test
Jenkins script에서 특정 디렉토리로 이동해서 git fetch하던 방식을, 훨씬 단순하고도 직관적으로 개선할 수 있었다.
그리고, 다시 Patchset을 적용하기 전으로 돌아가기 위해서는 단순히 repo sync를 해주면 되었다.