它就是一个 自动化测试结果“中控台 + 报表系统”。
它能干的:
- 集中存所有测试结果
- 可视化测试报告 / 仪表盘
- 失败分析 / 历史比对
- 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 后把密码改掉。
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。