使用Docker在生产环境中部署Gerrit

在生产环境中部署gerrit

docker-compose.yaml

version: '3'

services:
  gerrit:
    image: 10.4.0.233:5000/gerritcodereview/gerrit:3.10.0-ubuntu22
    container_name: gerrit
    ports:
      - "29418:29418"
      #- "8080:8080"
    restart: always
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /home/admin/infra/gerrit/review_site/etc:/var/gerrit/etc
      - /home/admin/infra/gerrit/review_site/git:/var/gerrit/git
      - /home/admin/infra/gerrit/review_site/db:/var/gerrit/db
      - /home/admin/infra/gerrit/review_site/index:/var/gerrit/index
      - /home/admin/infra/gerrit/review_site/cache:/var/gerrit/cache
      - /home/admin/infra/gerrit/review_site/plugins:/var/gerrit/plugins
    environment:
      - CANONICAL_WEB_URL=http://10.4.35.39:8080
      - HTTPD_LISTENURL=proxy-http://*:8080
    # command: init --install-all-plugins

  httpd:
    container_name: httpd
    image: 10.4.0.233:5000/httpd:latest
    restart: unless-stopped
    ports:
      - 8080:8080
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /home/admin/infra/gerrit/apache/passwords:/etc/apache2/passwords
      - /home/admin/infra/gerrit/apache/httpd.conf:/usr/local/apache2/conf/httpd.conf

Example of /external/gerrit/etc/gerrit.config

[gerrit]
        basePath = git
        canonicalWebUrl = http://10.4.XX.XX:8080
        serverId = XX

[container]
        user = root

[index]
        type = lucene

[auth]
        type = http

# 配置所有项目启动 jira 集成
[plugin "its-phabricator"]
        enabled = true
        association = SUGGESTED
# 制定git提交策略
# MANDATORY:commit message 需要包含一个或多个 issue-id,否则 git 推送将被拒绝
# SUGGESTED:commit message 不包含任何 issue-id 时,会在客户端上显示一条警告消息作为建议。
# OPTIONAL:在 commit message 中检测到 issue-id 时,就会和 jira 上的 issue 关联;没检测到也不会报错。
[commentLink "its-phabricator"]
        match = (T[1-9][0-9]{1,5})
        link = http://10.4.XX.XX:81/$1
# 配置 phabricator 凭据
[its-phabricator]
        url = http://10.4.XX.XX:81
        token = XXX

# 配置所有项目启动 jira 集成
[plugin "its-jira"]
        enabled = true
        association = SUGGESTED
# 制定git提交策略
# MANDATORY:commit message 需要包含一个或多个 issue-id,否则 git 推送将被拒绝
# SUGGESTED:commit message 不包含任何 issue-id 时,会在客户端上显示一条警告消息作为建议。
# OPTIONAL:在 commit message 中检测到 issue-id 时,就会和 jira 上的 issue 关联;没检测到也不会报错。
[commentLink "its-jira"]
        match = ([A-Z]+[0-9]*[A-Z]*[0-9]*-[0-9]+)
        link = http://10.4.XX.XX:8090/browse/$1
        html = <a href=\"http://10.4.XX.XX:8090//browse/$1\">$1</a>
# 配置 jira 凭据
[its-jira]
        url = http://10.4.XX.XX:8090
        username = admin
        password = XXX
        connectTimeout = 120000 ms
        readTimeout = 30000 ms

[lfs]
        plugin = lfs
[receive]
        enableSignedPush = false
[sendemail]
        smtpServer = localhost
[sshd]
        listenAddress = *:29418
[httpd]
        listenUrl = http://*:8080/
[cache]
        directory = cache
[storage]
        backend = fs
        directory = /var/gerrit/data/lfs

http.conf

ServerRoot "/usr/local/apache2"

Listen 8080

ProxyRequests Off
ProxyVia Off
ProxyPreserveHost On

ServerAdmin you@example.com
ServerName localhost

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

LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule filter_module modules/mod_filter.so
LoadModule mime_module modules/mod_mime.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule env_module modules/mod_env.so
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so

<Files ".ht*">
    Require all denied
</Files>

<IfModule unixd_module>
    User www-data
    Group www-data
</IfModule>

ErrorLog /proc/self/fd/2
LogLevel warn

<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    <IfModule logio_module>
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
    CustomLog /proc/self/fd/1 common
</IfModule>

<IfModule alias_module>
    ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
</IfModule>

<IfModule cgid_module>
</IfModule>

<Directory "/usr/local/apache2/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

<IfModule headers_module>
    RequestHeader unset Proxy early
</IfModule>

<IfModule mime_module>
    TypesConfig conf/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
</IfModule>


<Location "/login/">
    AuthType Basic
    AuthName "Gerrit Code Review"
    Require valid-user
    AuthUserFile /etc/apache2/passwords
</Location>
AllowEncodedSlashes On

ProxyPass "/" "http://gerrit:8080/" nocanon
ProxyPassReverse "/" "http://gerrit:8080/"
ProxyPass "/info/lfs" "http://gerrit:8080/info/lfs"
ProxyPassReverse "/info/lfs" "http://gerrit:8080/info/lfs"

ProxyPass "/git-lfs" "http://gerrit:8080/git-lfs"
ProxyPassReverse "/git-lfs" "http://gerrit:8080/git-lfs"

用Docker初始化Gerrit DB和Git存储库

依次创建review_site/etc、review_site/git 、review_site/db、review_site/index、review_site/cache、review_site/plugins、review_site/data、review_site/logs目录。

mkdir -p review_site/{etc,git,db,index,cache,plugins,data,logs}
chown -R 1000:1000 review_site/

Step-1: Run Gerrit docker init setup from docker

取消docker-compose.yamlcommand: init选项的注释。

docker compose up gerrit

等待,直到您在输出中看到消息Initialized /var/gerrit,然后容器将退出。

Step-2: Start Gerrit in daemon mode

注释掉docker-compose.yaml中的command: init选项,并启动所有节点:

docker compose up -d

安装插件

核心插件被打包在Gerrit war文件中,可以在Gerrit初始化期间通过参数--install-all-plugins来轻松安装。
其他插件可以在https://gerrit-ci.gerritforge.com/view/Plugins-stable-3.10/下载。

插件

  • lfs
  • its-jira
  • its-phabricator

https://gerrit-ci.gerritforge.com/plugin-manager
https://gerrit-googlesource.proxy.ustclug.org/plugins/

创建用户

# 第一次创建用户时,使用-c
sudo htpasswd -c /home/admin/infra/gerrit/apache/passwords admin
#sudo chmod 755 /home/admin/infra/gerrit/apache/passwords

后续创建其他用户使用 -m
htpasswd -m /home/admin/infra/gerrit/apache/passwords user

遇到的问题:
1、commit msg包含T498102时,提交失败
报错信息如下

[2024-07-22T10:23:11.774Z] [SSH git-receive-pack /test (admin)] ERROR com.google.gerrit.server.git.receive.AsyncReceiveCommits : error while processing push
java.util.concurrent.ExecutionException: java.lang.NumberFormatException: For input string: "T498102"
        at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)
        at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191)
        at com.google.gerrit.server.git.receive.AsyncReceiveCommits.preReceive(AsyncReceiveCommits.java:407)
        at com.google.gerrit.server.git.receive.AsyncReceiveCommits.lambda$asHook$0(AsyncReceiveCommits.java:351)
        at org.eclipse.jgit.transport.ReceivePack.service(ReceivePack.java:2287)
        at org.eclipse.jgit.transport.ReceivePack.receive(ReceivePack.java:2200)
        at com.google.gerrit.sshd.commands.Receive.runImpl(Receive.java:98)
        at com.google.gerrit.sshd.AbstractGitCommand.service(AbstractGitCommand.java:109)
        at com.google.gerrit.sshd.AbstractGitCommand$1.run(AbstractGitCommand.java:74)
        at com.google.gerrit.sshd.BaseCommand$TaskThunk.run(BaseCommand.java:492)
        at com.google.gerrit.server.logging.LoggingContextAwareRunnable.run(LoggingContextAwareRunnable.java:113)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
        at com.google.gerrit.server.git.WorkQueue$Task.run(WorkQueue.java:703)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
        at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: java.lang.NumberFormatException: For input string: "T498102"
        at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
        at java.base/java.lang.Integer.parseInt(Integer.java:668)
        at java.base/java.lang.Integer.parseInt(Integer.java:786)
        at com.googlesource.gerrit.plugins.its.phabricator.PhabricatorItsFacade.exists(PhabricatorItsFacade.java:68)
        at com.googlesource.gerrit.plugins.its.base.validation.ItsValidateComment.validCommit(ItsValidateComment.java:74)
        at com.googlesource.gerrit.plugins.its.base.validation.ItsValidateComment.onCommitReceived(ItsValidateComment.java:162)
        at com.google.gerrit.server.git.validators.CommitValidators$PluginCommitValidationListener.runValidator(CommitValidators.java:650)
        at com.google.gerrit.server.git.validators.CommitValidators$PluginCommitValidationListener.lambda$onCommitReceived$0(CommitValidators.java:659)
        at com.google.gerrit.server.plugincontext.PluginContext.runLogExceptions(PluginContext.java:280)
        at com.google.gerrit.server.plugincontext.PluginSetContext.runEach(PluginSetContext.java:170)
        at com.google.gerrit.server.git.validators.CommitValidators$PluginCommitValidationListener.onCommitReceived(CommitValidators.java:658)
        at com.google.gerrit.server.git.validators.CommitValidators.validate(CommitValidators.java:271)
        at com.google.gerrit.server.git.receive.BranchCommitValidator.validateCommit(BranchCommitValidator.java:188)
        at com.google.gerrit.server.git.receive.BranchCommitValidator.validateCommit(BranchCommitValidator.java:120)
        at com.google.gerrit.server.git.receive.ReceiveCommits.selectNewAndReplacedChangesFromMagicBranch(ReceiveCommits.java:2450)
        at com.google.gerrit.server.git.receive.ReceiveCommits.processCommandsUnsafe(ReceiveCommits.java:814)
        at com.google.gerrit.server.git.receive.ReceiveCommits.processCommands(ReceiveCommits.java:698)
        at com.google.gerrit.server.git.receive.AsyncReceiveCommits.lambda$preReceive$2(AsyncReceiveCommits.java:386)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
        at com.google.gerrit.server.util.RequestScopePropagator.lambda$cleanup$1(RequestScopePropagator.java:187)
        at com.google.gerrit.server.util.RequestScopePropagator.lambda$context$0(RequestScopePropagator.java:174)
        at com.google.gerrit.server.util.ThreadLocalRequestScopePropagator.lambda$wrapImpl$0(ThreadLocalRequestScopePropagator.java:45)
        at com.google.gerrit.server.util.RequestScopePropagator$1.call(RequestScopePropagator.java:85)
        at com.google.gerrit.server.util.RequestScopePropagator$2.run(RequestScopePropagator.java:116)
        ... 8 more

解决:更新3.10.0版本为3.9.5

参考:
https://www.gerritcodereview.com/
https://gerrit.googlesource.com/docker-gerrit
https://hub.docker.com/r/gerritcodereview/gerrit
https://github.com/openfrontier/docker-gerrit/issues/29

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容