ReportPortal – это веб-решение на базе открытого ПО, созданное разработчиками EPAM и OSS-сообщества. Его использование позволяет собрать в одном месте документы и результаты различных проектов по тестированию, которые выполняются в компании, и сделать их доступными для тестировщиков, ИТ-специалистов и бизнес-заказчиков.
Благодаря применению ReportPortal становится возможным:
Устанавливать будем в Managed by kubernetes в Yandex Cloud.
kubectl get nodes
NAME STATUS ROLES AGE VERSION
cl1mikj7kfic31snr11h-ivow Ready <none> 2m13s v1.18.18
cl1mikj7kfic31snr11h-ubus Ready <none> 2m12s v1.18.18
cl1mikj7kfic31snr11h-ynax Ready <none> 95s v1.18.18
kubectl label nodes <NODE-2> service=rabbitmq
kubectl label nodes <NODE-3> service=db
Меняем <NODE-X> на имя вашей ноды.
kubectl label nodes cl1mikj7kfic31snr11h-ivow service=api
kubectl label nodes cl1mikj7kfic31snr11h-ubus service=rabbitmq
kubectl label nodes cl1mikj7kfic31snr11h-ynax service=db
helm install --atomic nginx-ingress ingress-nginx/ingress-nginx --version 3.36.0
git clone https://github.com/reportportal/kubernetes
cd kubernetes
helm repo add elastic https://helm.elastic.co && helm repo update
Скачиваем helm чарты
helm dependency build ./reportportal/
Строка установки Elasticsearch
helm install <elastic-release-name> ./reportportal/charts/elasticsearch-7.6.1.tgz
Вместо <elastic-release-name> придумайте название helm чарта. Пусть будет elasticsearch.
Устанавливаем Elasticsearch. По умолчанию устанавливаются 3 ноды.
helm install elasticsearch ./reportportal/charts/elasticsearch-7.6.1.tgz
Чтобы установить и использовать 1 master ноду elasticsearch (например, для demо или devel стендов) создайте специальный yaml файл ./reportportal/single-elasticsearch/value.yaml
extraEnvs:
- name: discovery.type
value: single-node
- name: cluster.initial_master_nodes
value: ""
и выполните команду
helm install elasticsearch ./reportportal/charts/elasticsearch-7.6.1.tgz --set replicas=1 -f ./reportportal/single-elasticsearch/value.yaml
Был сделан pull request, добавляющий yaml файл для установки single node elasticsearch
helm install <rabbitmq-release-name> --set auth.username=rabbitmq,auth.password=<rmq_password>,replicaCount=1 ./reportportal/charts/rabbitmq-7.5.6.tgz
Вместо <rabbitmq-release-name> придумайте название helm чарта. Пусть будет rabbitmq.
Вместо <rmq_password> придумайте пароль от RabbitMQ. Пусть будет password.
helm install rabbitmq --set auth.username=rabbitmq,auth.password=password,replicaCount=1 ./reportportal/charts/rabbitmq-7.5.6.tgz
Примечание:
kubectl get pod rabbitmq-0
NAME READY STATUS RESTARTS AGE
rabbitmq-0 0/1 Running 0 60s
Настраиваем RabbitMQ memory threshold
kubectl exec -it rabbitmq-0 -- rabbitmqctl set_vm_memory_high_watermark 0.8
Отредактируем reportportal/values.yaml
rabbitmq:
SecretName: ""
installdep:
enable: false
endpoint:
address: <rabbitmq-release-name>.default.svc.cluster.local
port: 5672
user: rabbitmq
apiport: 15672
apiuser: rabbitmq
Вместо <rabbitmq-release-name> меняем название helm чарта, которое вы придумали. У меня это rabbitmq.
Итоговый фрагмент получается вот таким:
rabbitmq:
SecretName: ""
installdep:
enable: false
endpoint:
address: rabbitmq.default.svc.cluster.local
port: 5672
user: rabbitmq
apiport: 15672
apiuser: rabbitmq
helm install <postgresql-release-name> --set postgresqlUsername=rpuser,postgresqlPassword=<rpuser_password>,postgresqlDatabase=reportportal,postgresqlPostgresPassword=<postgres_password> -f ./reportportal/postgresql/values.yaml ./reportportal/charts/postgresql-10.9.4.tgz
Вместо <postgresql-release-name> придумайте название helm чарта. Пусть будет postgresql.
Вместо <rpuser_password> придумайте пароль для rpuser. Пусть будет password.
Вместо <postgres_password> придумайте пароль для postgres. Пусть будет password.
helm install postgresql --set postgresqlUsername=rpuser,postgresqlPassword=password,postgresqlDatabase=reportportal,postgresqlPostgresPassword=password -f ./reportportal/postgresql/values.yaml ./reportportal/charts/postgresql-10.9.4.tgz
Отредактируем reportportal/values.yaml
postgresql:
SecretName: ""
installdep:
enable: false
endpoint:
address: <postgresql-release-name>.default.svc.cluster.local
port: 5432
user: rpuser
dbName: reportportal
password:
Примечание:
Итоговый фрагмент получается вот таким:
postgresql:
SecretName: ""
installdep:
enable: false
endpoint:
address: postgresql.default.svc.cluster.local
port: 5432
user: rpuser
dbName: reportportal
password:
helm install <minio-release-name> --set accessKey.password=<your_minio_accesskey>,secretKey.password=<your_minio_secretkey>,persistence.size=5Gi ./reportportal/charts/minio-7.1.9.tgz
Вместо <minio-release-name> меняем название helm чарта, которое вы придумали. У меня это minio.
Вместо <your_minio_accesskey> придумайте accesskey. Пусть будет accesskey.
Вместо <your_minio_secretkey> придумайте secretkey. Пусть будет secretkey.
helm install minio --set accessKey.password=accesskey,secretKey.password=secretkey,persistence.size=5Gi ./reportportal/charts/minio-7.1.9.tgz
Отредактируем reportportal/values.yaml
minio:
secretName: ""
enabled: true
installdep:
enable: false
endpoint: http://<minio-release-name>.default.svc.cluster.local:9000
endpointshort: <minio-release-name>.default.svc.cluster.local:9000
region:
accesskey: <minio-accesskey>
secretkey: <minio-secretkey>
bucketPrefix:
defaultBucketName:
integrationSaltPath:
Вместо <minio-release-name> меняем название helm чарта. Это minio.
Вместо <minio-accesskey> меняем accesskey, которое вы придумали. У меня это accesskey.
Вместо <minio-secretkey> меняем secretkey, которое вы придумали. У меня это secretkey.
Итоговый фрагмент получается вот таким:
minio:
secretName: ""
enabled: true
installdep:
enable: false
endpoint: http://minio.default.svc.cluster.local:9000
endpointshort: minio.default.svc.cluster.local:9000
region:
accesskey: accesskey
secretkey: secretkey
bucketPrefix:
defaultBucketName:
integrationSaltPath:
ingress:
enable: true
# IF YOU HAVE SOME DOMAIN NAME SET INGRESS.USEDOMAINNAME to true
usedomainname: false
hosts:
- reportportal.k8.com
Необходимо поправить домен reportportal.k8.com на ваш домен.
Так как у меня нет домена, но ingress-nginx выставлен наружу, то можно воспользоваться сервисами nip.io, xip.io или sslip.io.
Устанавливаем домен исходя из вашего публичного IP адреса.
Получаем внешний IP от ingress-ingress
kubectl get svc nginx-ingress-ingress-nginx-controller
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-ingress-ingress-nginx-controller LoadBalancer 10.96.165.32 178.154.210.20 80:31767/TCP,443:31456/TCP 4m56s
Внешний IP адрес — 178.154.210.20.
Получается можно сделать домен reportportal.178.154.210.20.sslip.io.
Итоговый фрагмент получается вот таким:
ingress:
enable: true
# IF YOU HAVE SOME DOMAIN NAME SET INGRESS.USEDOMAINNAME to true
usedomainname: false
hosts:
- reportportal.178.154.210.20.sslip.io
helm package ./reportportal/
Установка reportportal
helm install <reportportal-release-name> --set postgresql.SecretName=<postgresql-release-name>-postgresql,rabbitmq.SecretName=<rabbitmq-release-name>-rabbitmq,minio.secretName=<minio-release-name> ./reportportal-5.5.0.tgz
Вместо <reportportal-release-name> придумайте название чарта для reportportal. Пусть будет reportportal.
Вместо <postgresql-release-name> используем название helm чарта postgresql. Это postgresql.
Вместо <rabbitmq-release-name> используем название helm чарта rabbitmq. Это rabbitmq.
helm install reportportal --set postgresql.SecretName=postgresql,rabbitmq.SecretName=rabbitmq,minio.secretName=minio ./reportportal-5.5.0.tgz
Логины/пароли для доступа в reportportal:
Известные ошибки:
Memory cgroup out of memory: Killed process (uwsgi)
[ 7063.247407] Memory cgroup out of memory: Killed process 63214 (uwsgi) total-vm:3149468kB, anon-rss:164992kB, file-rss:52176kB, shmem-rss:92kB, UID:0 pgtables:1372kB oom_score_adj:986
[ 7063.263325] oom_reaper: reaped process 63214 (uwsgi), now anon-rss:0kB, file-rss:0kB, shmem-rss:92kB
[ 7093.543707] uwsgi invoked oom-killer: gfp_mask=0xcc0(GFP_KERNEL), order=0, oom_score_adj=986
[ 7093.543711] CPU: 4 PID: 63635 Comm: uwsgi Not tainted 5.4.0-77-generic #86-Ubuntu
...
[ 7093.544021] [ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name
[ 7093.544025] [ 18904] 0 18904 255 1 32768 0 -998 pause
[ 7093.544028] [ 20358] 0 20358 13850 3787 98304 0 986 uwsgi
[ 7093.544030] [ 20425] 0 20425 15899 3877 114688 0 986 uwsgi
[ 7093.544033] [ 62892] 0 62892 787367 54312 1400832 0 986 uwsgi
[ 7093.544039] [ 63384] 0 63384 787367 54314 1400832 0 986 uwsgi
[ 7093.544041] [ 63635] 0 63635 328986 37869 1069056 0 986 uwsgi
[ 7093.544046] [ 63794] 0 63794 202492 24945 753664 0 986 uwsgi
[ 7093.544048] oom-kill:constraint=CONSTRAINT_MEMCG,nodemask=(null),cpuset=7c29217c3af6fef0b7bcc4150d2502f684ef8f83d2ea377411c9a2265e8d4843,mems_allowed=0,oom_memcg=/kubepods/burstable/pod05347bee-e95c-4857-8435-410a406f1f7a,task_memcg=/kubepods/burstable/pod05347bee-e95c-4857-8435-410a406f1f7a/7c29217c3af6fef0b7bcc4150d2502f684ef8f83d2ea377411c9a2265e8d4843,task=uwsgi,pid=63384,uid=0
[ 7093.544177] Memory cgroup out of memory: Killed process 63384 (uwsgi) total-vm:3149468kB, anon-rss:164988kB, file-rss:52176kB, shmem-rss:92kB, UID:0 pgtables:1368kB oom_score_adj:986
Этот issue исправляется pull request
Благодаря применению ReportPortal становится возможным:
- Ускорить запуск продуктов в эксплуатацию совместно с автоматизацией тестирования
- Просматривать тестовые сценарии со всеми связанными данными в одном решении «здесь и сейчас», с логами, скриншотами, двоичными данными
- Связывать определенные тестовые сценарии с найденными ошибками (багами), проблемами автоматизации или проблемами системы
Требования:
- Kubernetes (тестировал на версии 1.18)
- 3 Worker ноды kubernetes с 2 ядрами CPU и 10ГБ ОЗУ.
Установка Kubernetes
Базовая инструкция установки Reportportal в kubernetsУстанавливать будем в Managed by kubernetes в Yandex Cloud.
Получаем список нод k8s
После того как у вас будет готов kubernetes, получаем список нод k8s.kubectl get nodes
NAME STATUS ROLES AGE VERSION
cl1mikj7kfic31snr11h-ivow Ready <none> 2m13s v1.18.18
cl1mikj7kfic31snr11h-ubus Ready <none> 2m12s v1.18.18
cl1mikj7kfic31snr11h-ynax Ready <none> 95s v1.18.18
Устанавливаем Kubernetes Labels на ноды
kubectl label nodes <NODE-1> service=apikubectl label nodes <NODE-2> service=rabbitmq
kubectl label nodes <NODE-3> service=db
Меняем <NODE-X> на имя вашей ноды.
kubectl label nodes cl1mikj7kfic31snr11h-ivow service=api
kubectl label nodes cl1mikj7kfic31snr11h-ubus service=rabbitmq
kubectl label nodes cl1mikj7kfic31snr11h-ynax service=db
Устанавливаем ingress-nginx
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx && helm repo updatehelm install --atomic nginx-ingress ingress-nginx/ingress-nginx --version 3.36.0
Скачиваем репозиторий reportportal
Скачиваем репозиторий https://github.com/reportportal/kubernetesgit clone https://github.com/reportportal/kubernetes
cd kubernetes
Установка Elasticsearch
Добавляем helm репозиторий Elasticsearchhelm repo add elastic https://helm.elastic.co && helm repo update
Скачиваем helm чарты
helm dependency build ./reportportal/
Строка установки Elasticsearch
helm install <elastic-release-name> ./reportportal/charts/elasticsearch-7.6.1.tgz
Вместо <elastic-release-name> придумайте название helm чарта. Пусть будет elasticsearch.
Устанавливаем Elasticsearch. По умолчанию устанавливаются 3 ноды.
helm install elasticsearch ./reportportal/charts/elasticsearch-7.6.1.tgz
Чтобы установить и использовать 1 master ноду elasticsearch (например, для demо или devel стендов) создайте специальный yaml файл ./reportportal/single-elasticsearch/value.yaml
extraEnvs:
- name: discovery.type
value: single-node
- name: cluster.initial_master_nodes
value: ""
и выполните команду
helm install elasticsearch ./reportportal/charts/elasticsearch-7.6.1.tgz --set replicas=1 -f ./reportportal/single-elasticsearch/value.yaml
Был сделан pull request, добавляющий yaml файл для установки single node elasticsearch
Установка RabbitMQ
Строка установки RabbitMQhelm install <rabbitmq-release-name> --set auth.username=rabbitmq,auth.password=<rmq_password>,replicaCount=1 ./reportportal/charts/rabbitmq-7.5.6.tgz
Вместо <rabbitmq-release-name> придумайте название helm чарта. Пусть будет rabbitmq.
Вместо <rmq_password> придумайте пароль от RabbitMQ. Пусть будет password.
helm install rabbitmq --set auth.username=rabbitmq,auth.password=password,replicaCount=1 ./reportportal/charts/rabbitmq-7.5.6.tgz
Примечание:
- Если release-name в helm назван "rabbitmq", то адрес будет "rabbitmq.default.svc.cluster.local".
- Если release-name в helm назван "rabbit", то адрес будет "rabbit-rabbitmq.default.svc.cluster.local".
kubectl get pod rabbitmq-0
NAME READY STATUS RESTARTS AGE
rabbitmq-0 0/1 Running 0 60s
Настраиваем RabbitMQ memory threshold
kubectl exec -it rabbitmq-0 -- rabbitmqctl set_vm_memory_high_watermark 0.8
Отредактируем reportportal/values.yaml
rabbitmq:
SecretName: ""
installdep:
enable: false
endpoint:
address: <rabbitmq-release-name>.default.svc.cluster.local
port: 5672
user: rabbitmq
apiport: 15672
apiuser: rabbitmq
Вместо <rabbitmq-release-name> меняем название helm чарта, которое вы придумали. У меня это rabbitmq.
Итоговый фрагмент получается вот таким:
rabbitmq:
SecretName: ""
installdep:
enable: false
endpoint:
address: rabbitmq.default.svc.cluster.local
port: 5672
user: rabbitmq
apiport: 15672
apiuser: rabbitmq
Установка PostgreSQL
Строка установки PostgreSQLhelm install <postgresql-release-name> --set postgresqlUsername=rpuser,postgresqlPassword=<rpuser_password>,postgresqlDatabase=reportportal,postgresqlPostgresPassword=<postgres_password> -f ./reportportal/postgresql/values.yaml ./reportportal/charts/postgresql-10.9.4.tgz
Вместо <postgresql-release-name> придумайте название helm чарта. Пусть будет postgresql.
Вместо <rpuser_password> придумайте пароль для rpuser. Пусть будет password.
Вместо <postgres_password> придумайте пароль для postgres. Пусть будет password.
helm install postgresql --set postgresqlUsername=rpuser,postgresqlPassword=password,postgresqlDatabase=reportportal,postgresqlPostgresPassword=password -f ./reportportal/postgresql/values.yaml ./reportportal/charts/postgresql-10.9.4.tgz
Отредактируем reportportal/values.yaml
postgresql:
SecretName: ""
installdep:
enable: false
endpoint:
address: <postgresql-release-name>.default.svc.cluster.local
port: 5432
user: rpuser
dbName: reportportal
password:
Примечание:
- Если release-name в helm назван "postgresql", то address будет "postgresql.default.svc.cluster.local".
- Если release-name в helm назван "postgres", то address будет "postgres-postgresql.default.svc.cluster.local".
Итоговый фрагмент получается вот таким:
postgresql:
SecretName: ""
installdep:
enable: false
endpoint:
address: postgresql.default.svc.cluster.local
port: 5432
user: rpuser
dbName: reportportal
password:
Установка MinIO
Строка установки MinIOhelm install <minio-release-name> --set accessKey.password=<your_minio_accesskey>,secretKey.password=<your_minio_secretkey>,persistence.size=5Gi ./reportportal/charts/minio-7.1.9.tgz
Вместо <minio-release-name> меняем название helm чарта, которое вы придумали. У меня это minio.
Вместо <your_minio_accesskey> придумайте accesskey. Пусть будет accesskey.
Вместо <your_minio_secretkey> придумайте secretkey. Пусть будет secretkey.
helm install minio --set accessKey.password=accesskey,secretKey.password=secretkey,persistence.size=5Gi ./reportportal/charts/minio-7.1.9.tgz
Отредактируем reportportal/values.yaml
minio:
secretName: ""
enabled: true
installdep:
enable: false
endpoint: http://<minio-release-name>.default.svc.cluster.local:9000
endpointshort: <minio-release-name>.default.svc.cluster.local:9000
region:
accesskey: <minio-accesskey>
secretkey: <minio-secretkey>
bucketPrefix:
defaultBucketName:
integrationSaltPath:
Вместо <minio-release-name> меняем название helm чарта. Это minio.
Вместо <minio-accesskey> меняем accesskey, которое вы придумали. У меня это accesskey.
Вместо <minio-secretkey> меняем secretkey, которое вы придумали. У меня это secretkey.
Итоговый фрагмент получается вот таким:
minio:
secretName: ""
enabled: true
installdep:
enable: false
endpoint: http://minio.default.svc.cluster.local:9000
endpointshort: minio.default.svc.cluster.local:9000
region:
accesskey: accesskey
secretkey: secretkey
bucketPrefix:
defaultBucketName:
integrationSaltPath:
Настройка Ingress для доступа к reportportal
Отредактируем reportportal/values.yamlingress:
enable: true
# IF YOU HAVE SOME DOMAIN NAME SET INGRESS.USEDOMAINNAME to true
usedomainname: false
hosts:
- reportportal.k8.com
Необходимо поправить домен reportportal.k8.com на ваш домен.
Так как у меня нет домена, но ingress-nginx выставлен наружу, то можно воспользоваться сервисами nip.io, xip.io или sslip.io.
Устанавливаем домен исходя из вашего публичного IP адреса.
Получаем внешний IP от ingress-ingress
kubectl get svc nginx-ingress-ingress-nginx-controller
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-ingress-ingress-nginx-controller LoadBalancer 10.96.165.32 178.154.210.20 80:31767/TCP,443:31456/TCP 4m56s
Внешний IP адрес — 178.154.210.20.
Получается можно сделать домен reportportal.178.154.210.20.sslip.io.
Итоговый фрагмент получается вот таким:
ingress:
enable: true
# IF YOU HAVE SOME DOMAIN NAME SET INGRESS.USEDOMAINNAME to true
usedomainname: false
hosts:
- reportportal.178.154.210.20.sslip.io
Установка helm чарта reportportal
Упаковка helm чарта reportportalhelm package ./reportportal/
Установка reportportal
helm install <reportportal-release-name> --set postgresql.SecretName=<postgresql-release-name>-postgresql,rabbitmq.SecretName=<rabbitmq-release-name>-rabbitmq,minio.secretName=<minio-release-name> ./reportportal-5.5.0.tgz
Вместо <reportportal-release-name> придумайте название чарта для reportportal. Пусть будет reportportal.
Вместо <postgresql-release-name> используем название helm чарта postgresql. Это postgresql.
Вместо <rabbitmq-release-name> используем название helm чарта rabbitmq. Это rabbitmq.
helm install reportportal --set postgresql.SecretName=postgresql,rabbitmq.SecretName=rabbitmq,minio.secretName=minio ./reportportal-5.5.0.tgz
Логины/пароли для доступа в reportportal:
- Default User: default\1q2w3e
- Administrator: superadmin\erebus
Известные ошибки:
Memory cgroup out of memory: Killed process (uwsgi)
[ 7063.247407] Memory cgroup out of memory: Killed process 63214 (uwsgi) total-vm:3149468kB, anon-rss:164992kB, file-rss:52176kB, shmem-rss:92kB, UID:0 pgtables:1372kB oom_score_adj:986
[ 7063.263325] oom_reaper: reaped process 63214 (uwsgi), now anon-rss:0kB, file-rss:0kB, shmem-rss:92kB
[ 7093.543707] uwsgi invoked oom-killer: gfp_mask=0xcc0(GFP_KERNEL), order=0, oom_score_adj=986
[ 7093.543711] CPU: 4 PID: 63635 Comm: uwsgi Not tainted 5.4.0-77-generic #86-Ubuntu
...
[ 7093.544021] [ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name
[ 7093.544025] [ 18904] 0 18904 255 1 32768 0 -998 pause
[ 7093.544028] [ 20358] 0 20358 13850 3787 98304 0 986 uwsgi
[ 7093.544030] [ 20425] 0 20425 15899 3877 114688 0 986 uwsgi
[ 7093.544033] [ 62892] 0 62892 787367 54312 1400832 0 986 uwsgi
[ 7093.544039] [ 63384] 0 63384 787367 54314 1400832 0 986 uwsgi
[ 7093.544041] [ 63635] 0 63635 328986 37869 1069056 0 986 uwsgi
[ 7093.544046] [ 63794] 0 63794 202492 24945 753664 0 986 uwsgi
[ 7093.544048] oom-kill:constraint=CONSTRAINT_MEMCG,nodemask=(null),cpuset=7c29217c3af6fef0b7bcc4150d2502f684ef8f83d2ea377411c9a2265e8d4843,mems_allowed=0,oom_memcg=/kubepods/burstable/pod05347bee-e95c-4857-8435-410a406f1f7a,task_memcg=/kubepods/burstable/pod05347bee-e95c-4857-8435-410a406f1f7a/7c29217c3af6fef0b7bcc4150d2502f684ef8f83d2ea377411c9a2265e8d4843,task=uwsgi,pid=63384,uid=0
[ 7093.544177] Memory cgroup out of memory: Killed process 63384 (uwsgi) total-vm:3149468kB, anon-rss:164988kB, file-rss:52176kB, shmem-rss:92kB, UID:0 pgtables:1368kB oom_score_adj:986
Этот issue исправляется pull request
Установка ReportPortal в kubernetes
ReportPortal – это веб-решение на базе открытого ПО, созданное разработчиками EPAM и OSS-сообщества. Его использование позволяет собрать в одном месте документы и результаты различных проектов по...
habr.com