CI持续集成 / devops · 2025年11月26日 1

ReportPortal搭建

它就是一个 自动化测试结果“中控台 + 报表系统”

它能干的:

  • 集中存所有测试结果
  • 可视化测试报告 / 仪表盘
  • 失败分析 / 历史比对
  • Auto Analyzer(自动分析失败)
  • 当作测试中心 / 协作平台

在一台宿主机上用Docker部署

1.准备目录 & 网络

# 数据目录(自己按需改路径)
sudo mkdir -p /opt/reportportal/{postgres,elasticsearch,storage}
sudo chown -R 1000:1000 /opt/reportportal/elasticsearch || true

# 创建专用网络
docker network create reportportal

2. 先起基础组件(Postgres / RabbitMQ / ES / MinIO)

2.1 Postgres

docker run -d \
--name rp-postgres \
--network reportportal \
-e POSTGRES_USER=rpuser \
-e POSTGRES_PASSWORD=rppass \
-e POSTGRES_DB=reportportal \
-v /opt/reportportal/postgres:/var/lib/postgresql/data \
--health-cmd="pg_isready -d reportportal -U rpuser" \
--health-interval=10s \
--health-timeout=120s \
--health-retries=10 \
postgres:12-alpine

2.2 RabbitMQ

docker run -d \
  --name rp-rabbitmq \
  --network reportportal \
  -e RABBITMQ_DEFAULT_USER=rabbitmq \
  -e RABBITMQ_DEFAULT_PASS=rabbitmq \
  --health-cmd="rabbitmqctl status" \
  --health-interval=30s \
  --health-retries=5 \
  rabbitmq:3.7.16-management
# 需要管理界面就再加端口:
#  -p 5672:5672 -p 15672:15672

2.3 Elasticsearch

docker run -d \
  --name rp-elasticsearch \
  --network reportportal \
  -v /opt/reportportal/elasticsearch:/usr/share/elasticsearch/data \
  -e "bootstrap.memory_lock=true" \
  -e "discovery.type=single-node" \
  -e "logger.level=INFO" \
  -e "xpack.security.enabled=true" \
  -e "ELASTIC_PASSWORD=elastic1q2w3e" \
  --ulimit memlock=-1:-1 \
  --ulimit nofile=65536:65536 \
  docker.elastic.co/elasticsearch/elasticsearch:7.10.1

2.4 MinIO(存储附件)

docker run -d \
  --name rp-minio \
  --network reportportal \
  -v /opt/reportportal/storage:/data \
  -e MINIO_ACCESS_KEY=minio \
  -e MINIO_SECRET_KEY=minio123 \
  minio/minio:RELEASE.2020-10-27T04-03-55Z \
  server /data

3.起 Traefik 网关(访问入口)

docker run -d \
  --name rp-gateway \
  --network reportportal \
  -p 8080:8080 \   # 对外 HTTP(ReportPortal 用这个)
  -p 8081:8081 \   # Traefik dashboard(可选)
  -v /var/run/docker.sock:/var/run/docker.sock \
  traefik:v2.0.7 \
  --providers.docker=true \
  --providers.docker.constraints=Label(`traefik.expose`,`true`) \
  --entrypoints.web.address=:8080 \
  --entrypoints.traefik.address=:8081 \
  --api.dashboard=true \
  --api.insecure=true

4.一次性初始化数据库(migrations)

docker run --rm \
  --name rp-db-scripts \
  --network reportportal \
  -e POSTGRES_SERVER=rp-postgres \
  -e POSTGRES_PORT=5432 \
  -e POSTGRES_DB=reportportal \
  -e POSTGRES_USER=rpuser \
  -e POSTGRES_PASSWORD=rppass \
  reportportal/migrations:5.6.0

5.起核心服务(UAT / API / JOBS / UI / INDEX)

5.1 授权服务 UAT(包含 admin 用户)

docker run -d \
  --name rp-uat \
  --network reportportal \
  -e RP_DB_HOST=rp-postgres \
  -e RP_DB_USER=rpuser \
  -e RP_DB_PASS=rppass \
  -e RP_DB_NAME=reportportal \
  -e RP_BINARYSTORE_TYPE=minio \
  -e RP_BINARYSTORE_MINIO_ENDPOINT=http://rp-minio:9000 \
  -e RP_BINARYSTORE_MINIO_ACCESSKEY=minio \
  -e RP_BINARYSTORE_MINIO_SECRETKEY=minio123 \
  -e RP_SESSION_LIVE=86400 \
  -e RP_INITIAL_ADMIN_PASSWORD="YourSecurePass123!" \  # 强烈建议改成自己的
  -l "traefik.http.middlewares.uat-strip-prefix.stripprefix.prefixes=/uat" \
  -l "traefik.http.routers.uat.middlewares=uat-strip-prefix@docker" \
  -l "traefik.http.routers.uat.rule=PathPrefix(`/uat`)" \
  -l "traefik.http.routers.uat.service=uat" \
  -l "traefik.http.services.uat.loadbalancer.server.port=9999" \
  -l "traefik.http.services.uat.loadbalancer.server.scheme=http" \
  -l "traefik.expose=true" \
  reportportal/service-authorization:5.6.0

5.2 API 服务

docker run -d \
  --name rp-api \
  --network reportportal \
  -e RP_DB_HOST=rp-postgres \
  -e RP_DB_USER=rpuser \
  -e RP_DB_PASS=rppass \
  -e RP_DB_NAME=reportportal \
  -e RP_AMQP_USER=rabbitmq \
  -e RP_AMQP_PASS=rabbitmq \
  -e RP_AMQP_APIUSER=rabbitmq \
  -e RP_AMQP_APIPASS=rabbitmq \
  -e RP_BINARYSTORE_TYPE=minio \
  -e RP_BINARYSTORE_MINIO_ENDPOINT=http://rp-minio:9000 \
  -e RP_BINARYSTORE_MINIO_ACCESSKEY=minio \
  -e RP_BINARYSTORE_MINIO_SECRETKEY=minio123 \
  -e LOGGING_LEVEL_ORG_HIBERNATE_SQL=info \
  -e JAVA_OPTS="-Xmx1g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp \
    -Dcom.sun.management.jmxremote.rmi.port=12349 \
    -Dcom.sun.management.jmxremote \
    -Dcom.sun.management.jmxremote.local.only=false \
    -Dcom.sun.management.jmxremote.port=9010 \
    -Dcom.sun.management.jmxremote.authenticate=false \
    -Dcom.sun.management.jmxremote.ssl=false \
    -Djava.rmi.server.hostname=0.0.0.0" \
  -l "traefik.http.middlewares.api-strip-prefix.stripprefix.prefixes=/api" \
  -l "traefik.http.routers.api.middlewares=api-strip-prefix@docker" \
  -l "traefik.http.routers.api.rule=PathPrefix(`/api`)" \
  -l "traefik.http.routers.api.service=api" \
  -l "traefik.http.services.api.loadbalancer.server.port=8585" \
  -l "traefik.http.services.api.loadbalancer.server.scheme=http" \
  -l "traefik.expose=true" \
  reportportal/service-api:5.6.0

5.3 Jobs 服务(清理任务等)

docker run -d \
  --name rp-jobs \
  --network reportportal \
  -e RP_DB_HOST=rp-postgres \
  -e RP_DB_USER=rpuser \
  -e RP_DB_PASS=rppass \
  -e RP_DB_NAME=reportportal \
  -e RP_AMQP_USER=rabbitmq \
  -e RP_AMQP_PASS=rabbitmq \
  -e RP_AMQP_APIUSER=rabbitmq \
  -e RP_AMQP_APIPASS=rabbitmq \
  -e DATASTORE_TYPE=minio \
  -e DATASTORE_MINIO_ENDPOINT=http://rp-minio:9000 \
  -e DATASTORE_MINIO_ACCESSKEY=minio \
  -e DATASTORE_MINIO_SECRETKEY=minio123 \
  -e RP_ENVIRONMENT_VARIABLE_CLEAN_ATTACHMENT_CRON="0 0 */24 * * *" \
  -e RP_ENVIRONMENT_VARIABLE_CLEAN_LOG_CRON="0 0 */24 * * *" \
  -e RP_ENVIRONMENT_VARIABLE_CLEAN_LAUNCH_CRON="0 0 */24 * * *" \
  -e RP_ENVIRONMENT_VARIABLE_CLEAN_STORAGE_CRON="0 0 */24 * * *" \
  -e RP_ENVIRONMENT_VARIABLE_STORAGE_PROJECT_CRON="0 */5 * * * *" \
  -l "traefik.http.middlewares.jobs-strip-prefix.stripprefix.prefixes=/jobs" \
  -l "traefik.http.routers.jobs.middlewares=jobs-strip-prefix@docker" \
  -l "traefik.http.routers.jobs.rule=PathPrefix(`/jobs`)" \
  -l "traefik.http.routers.jobs.service=jobs" \
  -l "traefik.http.services.jobs.loadbalancer.server.port=8686" \
  -l "traefik.http.services.jobs.loadbalancer.server.scheme=http" \
  -l "traefik.expose=true" \
  reportportal/service-jobs:5.6.0

5.4 UI 服务

docker run -d \
  --name rp-ui \
  --network reportportal \
  -e RP_SERVER_PORT=8080 \
  -l "traefik.http.middlewares.ui-strip-prefix.stripprefix.prefixes=/ui" \
  -l "traefik.http.routers.ui.middlewares=ui-strip-prefix@docker" \
  -l "traefik.http.routers.ui.rule=PathPrefix(`/ui`)" \
  -l "traefik.http.routers.ui.service=ui" \
  -l "traefik.http.services.ui.loadbalancer.server.port=8080" \
  -l "traefik.http.services.ui.loadbalancer.server.scheme=http" \
  -l "traefik.expose=true" \
  reportportal/service-ui:5.6.0

5.5 Index 服务(Landing/路由)

docker run -d \
  --name rp-index \
  --network reportportal \
  -e LB_URL=http://rp-gateway:8081 \
  -e TRAEFIK_V2_MODE=true \
  -l "traefik.http.routers.index.rule=PathPrefix(`/`)" \
  -l "traefik.http.routers.index.service=index" \
  -l "traefik.http.services.index.loadbalancer.server.port=8080" \
  -l "traefik.http.services.index.loadbalancer.server.scheme=http" \
  -l "traefik.expose=true" \
  reportportal/service-index:5.0.11

6.(可选)Auto Analyzer & Metrics

如果你想用智能分析,可以再把 analyzer 相关几个服务起起来(完全可以后面再补):

# analyzer
docker run -d \
  --name rp-analyzer \
  --network reportportal \
  -e LOGGING_LEVEL=info \
  -e AMQP_URL=amqp://rabbitmq:rabbitmq@rp-rabbitmq:5672 \
  -e ES_HOSTS=http://elastic:elastic1q2w3e@rp-elasticsearch:9200 \
  -e MINIO_SHORT_HOST=rp-minio:9000 \
  -e MINIO_ACCESS_KEY=minio \
  -e MINIO_SECRET_KEY=minio123 \
  reportportal/service-auto-analyzer:5.6.0

# analyzer_train
docker run -d \
  --name rp-analyzer-train \
  --network reportportal \
  -e LOGGING_LEVEL=info \
  -e AMQP_URL=amqp://rabbitmq:rabbitmq@rp-rabbitmq:5672 \
  -e ES_HOSTS=http://elastic:elastic1q2w3e@rp-elasticsearch:9200 \
  -e MINIO_SHORT_HOST=rp-minio:9000 \
  -e MINIO_ACCESS_KEY=minio \
  -e MINIO_SECRET_KEY=minio123 \
  -e INSTANCE_TASK_TYPE=train \
  -e UWSGI_WORKERS=1 \
  reportportal/service-auto-analyzer:5.6.0

7.验证 & 登录

先看容器状态:

docker ps --format "table {{.Names}}\t{{.Status}}"

浏览器打开:

http://<你的主机 IP>:8080

等登录页下方出现一堆服务状态(API Service, Jobs Service, Authorization Service, Service UI)说明都 OK

默认账号(如果你没改 RP_INITIAL_ADMIN_PASSWORD)是:

  • 普通用户:default / 1q2w3e
  • 管理员:superadmin / erebus

强烈建议第一时间登录 superadmin 后把密码改掉。