У меня поговорил с одним из моих клиентов, которые пошли так:
Tekton и Kubernetes приятно, и все, наши Devs, кажется, довольно счастливы, но где я вижу результаты теста? Jenkins имеет такую функцию, но теперь все разработчики используют этот Tekton Parts и все эти причудливые команды консоли. Я просто хочу посмотреть на мои сообщения и взглянуть на то, как пошли мягкие софт. Эти терминалы на самом деле не делают этого для меня. Можете ли вы получить мне что-то подобное?
Это место наблюдения за моим клиентом. Многие инструменты Kubernetes сильно сосредоточены на CLI-использовании, или на «ранних этапах развития», когда функции выше приоритетного списка, чем блестящий УИ.
Один из этих примеров будет экосистемой Tekton. Есть редко любой UIS, и если есть, например, приборная панель Tekton, они очень босые.
Поскольку я очень CLI-ориентированный парень, и по привычке, на самом деле не думаем об использовании UIS, что часто просьба моего клиента провела меня, как грузовик.
Итак, мы немного выкопали и нашли очень многообещающий инструмент. Allure Framework Отказ
Что значит и почему я должен использовать это?
Основная структура делает несколько вещей:
- Генерация результатов в JSON-формате (Слава Богу больше XML)
- Создание отчета
- Сбор данных истории
Все это затем ударится вместе в довольно статическом HTML-отчете, готовым подавать на ваш любимый сервер. Если у вас нет ни одного под рукой, необязательно загружаемая CLI может также раскрутить веб-сервер через Allure Служить PathtoreportDir
Команда и проводя сама отчеты. Магический!
Чтобы дать вам небольшой тур о том, как выглядит отчет, иметь GIF!
Я пытался получить GIF на работу, но 80% времени я получаю ошибки от dev, и те, которые визуализируют в качестве картофеля. Не имею, что делает это обладанные вещи, но это не здорово ..
Так что, если это слишком мало/уродливая для вас, что я могу только винить на себе, не волнуйся! Я покажу тебе, как раскрутить демонстрацию:)
Как это работает?
Во-первых, allure есть тонны разъемов для различных рамх и языков, которые документируются здесь Отказ
Но позвольте мне предупредить вас: документация кажется очень минимальной прямо сейчас. Есть много пробных и ошибок, чтобы получить то, что вы хотите Быть справедливым, кажется, очень мощный инструмент со многими поддерживаемыми языками и рамками. Документировав все до самой маленькой детали, вероятно, будет огромная задача.
Мой клиент был особенно заинтересован в поддержке огурца и JUnit5. На данный момент мы примерно закончили реализацию непрерывного интеграционного трубопровода с генерацией отчета для тестовых люков JUnit 5. Огурец, вероятно, следует, как только я нахожу время.
Давайте тестируем вещи!
Чтобы доливаться для создания отчета для вас, все, что вам нужно, это следующие дополнения к вашему POM.XML:
2.22.2 2.13.3 1.9.5 io.qameta.allure allure-junit5 ${allure.version} test maven-surefire-plugin ${surefire-plugin.version} true -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar" ${project.build.directory}/allure-results org.jboss.logmanager.LogManagerorg.aspectj aspectjweaver ${aspectj.version} io.qameta.allure allure-maven 2.10.0 package report ${allure.version} https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/${allure.version}/allure-commandline-${allure.version}.zip
Allure также приносит свой собственный набор аннотаций для тестовых случаев. Вот несколько я люблю использовать:
@Feature("Some Name") @Epic("Some Name") @Story("Some Name") @Severity(SeverityLevel.CRITICAL) @Description("non-dev readable description") @Link("link to JIRA-Tickets or some cool resources)
Хотите пойти? Вот простой докер, который я ударил вместе, что нуждается в минимальной работе с вашей стороны. Просто создайте простой проект Maven, настройте свой POM.xml, как я показал выше, добавьте некоторые тесты, аннотируйте их и дайте ему запуск за деньги с пакетом MVN!
FROM maven:3.6.3-jdk-11 as builder WORKDIR /opt/service # This is for caching purposes in local builds # That way you don't have to download the whole internet every time your source changes COPY pom.xml . RUN mvn dependency:go-offline COPY src/ src/ # Run the Build and generate a report RUN mvn clean install && mvn allure:report FROM nginx:1.19.0-alpine as server # Copy the report and serve it via nginx COPY --from=builder /opt/service/target/site/allure-maven-plugin/ /usr/share/nginx/html/
Задача СНГ
Теперь у нас хороший инструмент, но что сейчас? Я быстро заметил, что эти сообщения могут быть хорошими, но если я собираюсь развернуть эти отчеты в контейнере, мне нужно немного больше, чем то, что я показал вам ранее. Allures History-Fuction не может ничего делать таким образом. Allure не может создать историю, если нет данных о предыдущих работах.
Итак, давайте создадим решение для этого!
Я думал, что у меня была нефте-идея, разработав процесс генерации отчета, как это:
Как видите, я представил новый компонент. Минио как провайдер хранения S3. Почему минион? Потому что это командная линия клиента имеет отличное — Нью-Чем/- старше, чем функция . Так что миниум может сделать сортировку для меня, мне не нужно делать это сам!
Если я хотел создать отчет с данными до 7 дней, это было бы так же легко, как
mc cp --recursive --newer-than 7d minio/allure/results/ results/ allure generate results/ -o report/ mc cp --recursive report/ minio/allure/reports-history/$(date +%y-%m-%d-%H%M)/
И я получил отчет с данными в течение 7 дней. Он будет храниться в минионе и будет готов к положению в контейнер. Честно говоря, я любил эту идею и был гордиться этим решением. Если у вас есть лучшая идея, я все уши!
Давайте контейнеризируем это!
Так как этот взгляд в контейнер?
FROM maven:3.6.3-jdk-11 as builder WORKDIR /opt/service # This is for caching purposes in local builds # That way you don't have to download the whole internet every time your source changes COPY pom.xml . RUN mvn dependency:go-offline COPY src/ src/ RUN mvn clean install && mvn allure:report FROM openjdk:14-alpine as generator WORKDIR /tmp COPY --from=builder /opt/service/target/allure-results/* results/ COPY --from=builder /opt/service/target/site/allure-maven-plugin/* reports/ RUN apk add curl tar gzip \ && curl -L https://bintray.com/qameta/maven/download_file?file_path=io%2Fqameta%2Fallure%2Fallure-commandline%2F2.13.4%2Fallure-commandline-2.13.4.tgz | tar xvz \ && curl -LO https://dl.min.io/client/mc/release/linux-amd64/mc \ && chmod +x mc \ && ln -s $PWD/mc /usr/bin/mc \ && mc config host add minio http://ipofminio:9000 minioadmin minioadmin \ && mc mb -p minio/allure \ && mc cp --recursive results/* minio/allure/results/ \ && mc cp --recursive reports/* minio/allure/reports/$(date +'%Y-%m-%d-%H%M')/ \ && mc cp --recursive minio/allure/results/ results/ \ && allure-2.13.4/bin/allure generate results/ -o reports-with-history-data/ \ && mc cp --recursive reports-with-history-data/ minio/allure/reports-history/$(date +'%Y-%m-%d-%H%M')/ FROM nginx:1.19.0-alpine as server COPY --from=generator /tmp/reports-with-history-data/ /usr/share/nginx/html/
То, что мы сделали, мы представили еще один этап с От OpenJDK: 14-Alpine As Generator
В котором мы выполняем все материалы загрузки/выбора/сортировки для наших историй. Все, что вам нужно будет построить, это мини-экземпляр, который является для локального тестирования, легко развернута через:
docker run -p 9000:9000 --name minio --rm minio/minio server /data
Но как насчет Tekton и Kubernetes?
Вы можете спросить это, по праву, так как я дразнил его в начале. Делать этот пробег в Tekton был довольно легким, хотя ему нужно немного больше подготовить.
Во-первых, было бы создать изображение, которое было бы построить за пределами Kubernetes, и все еще есть все подключения к минимуму нам нужно. Докинфила вверх, вероятно, потерпел бы потерю сборку, поскольку миниодовой в Kubernetes не будет добраться до вашего CI, который обычно работает за пределами Kubernetes. Итак, давайте модифицируем наш контейнер немного, чтобы работать с этими требованиями.
Что мы должны сделать? Во-первых, я хочу разложить свой контейнер на два.
- Контейнер отчетности, который создает отчеты и толкает их в минио
- контейнер Nginx, который тянет отчет и обслуживает его
Почему я хочу это? Необходимость создавать изображение, которое содержит ваш отчет каждый раз, когда отчет меняется, не кажется жизнеспособным для меня. Требуется ненужное пространство в вашем реестре Docker и не приносит этой большой выгоды. IMO было бы лучше иметь динамический контейнер, который может быть параметризован и выполняет все вытягивание результатов, генерации и архивирования в его въездной точке. Итак, давайте сделаем только это!
Allure-репортерский контейнер
Dockerfile.allure.
FROM openjdk:14-alpine WORKDIR /tmp RUN apk add curl tar gzip \ && curl -L https://bintray.com/qameta/maven/download_file?file_path=io%2Fqameta%2Fallure%2Fallure-commandline%2F2.13.4%2Fallure-commandline-2.13.4.tgz | tar xvz \ && curl -LO https://dl.min.io/client/mc/release/linux-amd64/mc \ && chmod +x mc \ && ln -s $PWD/mc /usr/bin/mc \ && ln -s $PWD/allure-2.13.4/bin/allure /usr/bin/allure \ && allure --version \ && mc --version WORKDIR /opt/myproject VOLUME /opt/myproject/results COPY entrypoint-allure.sh /usr/local/bin/entrypoint RUN chmod +x /usr/local/bin/entrypoint USER nobody ENTRYPOINT bash -c entrypoint
entrypoint-allure.sh
#!/bin/bash set -e # Capture the name of the project, so we can differentiate results in minio CURRENT_DATE=$(date '+%Y%m%d%H%M') # Gather all results you can find # Should be Emulated via Volume Mount locally mkdir results for resultDir in $(find . -type d -iname allure-results);do cp $resultDir/* results done # Generate the actual allure report of this testrun and publish it allure generate results/ -o allure-report/ # Configure Minio and make sure the bucket allure exists mc config host add minio $MINIO_ENDPOINT $MINIO_ACCESS_KEY $MINIO_SECRET_KEY mc mb -p minio/allure # Publish the results mc cp --recursive results/ minio/allure/$PROJECTNAME/allure-results/ # Publish the report mc cp --recursive allure-report/ minio/allure/$PROJECTNAME/allure-report-independent/$CURRENT_DATE/ # Get all results, including those from past runs, and generate a history report to publish mc cp --recursive minio/allure/$PROJECTNAME/allure-results/ results/ allure generate results -o allure-report-history/ mc cp --recursive allure-report-history/ minio/allure/$PROJECTNAME/allure-report-history/$CURRENT_DATE/
Контейнер для Allure-Server
Dockerfile.nginx:
FROM nginx:1.19.0-alpine as server ARG MINIO_ENDPOINT=http://minio.default.svc.cluster.local:9000 ARG MINIO_SECRET_KEY=minioadmin ARG MINIO_SECRET_PASS=minioadmin ARG PROJECTNAME=myproject RUN curl -LO https://dl.min.io/client/mc/release/linux-amd64/mc \ && chmod +x mc \ && ln -s $PWD/mc /usr/bin/mc \ && ln -s $PWD/allure-2.13.4/bin/allure /usr/bin/allure \ && mc --version COPY entrypoint-nginx.sh /usr/local/bin/entrypoint RUN chmod +x /usr/local/bin/entrypoint USER nobody ENTRYPOINT bash -c entrypoint
entrypoint-nginx.sh:
#!/bin/bash set -e # Capture the name of the project, so we can differentiate results in minio CURRENT_DATE=$(date '+%Y%m%d%H%M') # Configure Minio and make sure the bucket allure exists mc config host add minio $MINIO_ENDPOINT $MINIO_ACCESS_KEY $MINIO_SECRET_KEY mc mb -p minio/allure NEWEST_REPORT=$(mc find minio/allure/$PROJECTNAME/allure-report-history/ --maxdepth 1 --newer-than 1d | cut -d'/' -f5- | sort -r | head -n1) NEWEST_REPORT=${NEWEST_REPORT%/} mc cp --recursive minio/allure/$PROJECTNAME/allure-report-history/$NEWEST_REPORT report rm /opt/nginx/html/index.html cp -r report/$NEWEST_REPORT/* /opt/nginx/html nginx
С этими двумя контейнерами и четырьмя файлами вы должны быть в значительной степени, чтобы пойти. Мы разделим наш все в одном контейнере на две отдельные контейнеры, которые поступают без подключения к минимуму. Наш репортер и это nginx-сервер.
Давайте пойдем K8S
Я предполагаю, что у вас установка Kubernetes, если нет, вы можете взглянуть на мой « Lazy K8S-решение », чтобы запустить Кубернаны, которые могут позаботиться об этом для вас.
В качестве заключительной части интеграции Tekton вы можете использовать эту задачу для запуска генератора отчета (первый контейнер там) и разверните Nginx-Server через файл, который ссылается на шаге Kubectl. Allure-Reporter-task.yaml:
apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: allure-reporter-task namespace: tekton spec: workspaces: - name: git params: - name: minioEndpoint default: http://minio.default.svc.cluster.local:9000 - name: minioAccessKey default: minioadmin - name: minioSecretKey default: minioadmin - name: pathToDeploymentYaml default: k8s/allure-server.yaml steps: - name: generate-and-publish-allure-report image: allure-report-generator:1.0.0 command: - /bin/bash args: - -c - | cd /workspace/git/ entrypoint env: - name: MINIO_ENDPOINT value: $(params.minioEndpoint) - name: MINIO_ACCESS_KEY value: $(params.minioAccessKey) - name: MINIO_SECRET_KEY value: $(params.minioSecretKey) - name: serve-allure-report image: lachlanevenson/k8s-kubectl command: ["kubectl"] args: - "apply" - "-f" - "$(workspaces.git.path)/$(params.pathToDeploymentYaml)"
Чтобы получить развернутый сервер Allure-Server, следующий файл должен быть в ваших приложениях Git-Repository, поэтому Tekton может найти его во время TaskRun
Пример k8s/allure-server.yaml:
--- apiVersion: apps/v1 kind: Deployment metadata: name: allure-server namespace: default spec: replicas: 1 selector: matchLabels: app: allure-server template: metadata: labels: app: allure-server spec: containers: - name: allure-server image: your-registry/allure-server:1.0.0 imagePullPolicy: Always --- apiVersion: v1 kind: Service metadata: name: allure-server namespace: default spec: selector: app: allure-server type: ClusterIP ports: - port: 80 targetPort: 80 -------- apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: allure-server-ingress-route namespace: default spec: entryPoints: - http routes: - match: Host(`localhost`) && PathPrefix(`/allure`) kind: Rule services: - name: allure-server port: 80 middlewares: - name: allure-stripprefix -------- apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: allure-stripprefix namespace: default spec: stripPrefix: prefixes: - /allure
Разница в этом подходе, по сравнению с DockerFile я продемонстрировал там, я положил всю логику DockerFile в скрипты въезда. Вы знаете, все копирование, генерация отчета, сортировка, все.
Таким образом, мне не нужно подтолкнуть то же изображение снова и снова в мой реестр, только потому, что отчет был обновлен. Я могу просто иметь одно рестручевое изображение, которое динамически тянет данные, которые нужно из хранения.
Кроме того, изображения, которые вам нужны, могут быть построены с помощью CI, который обычно не должен иметь никакого доступа к решениям хранения, такими как минион. Таким образом, сборка DockerFiles с мини-соединением сломала бы вашу сборку. Именно поэтому мы поставили все сетевые вещи в выпускные точки, так как они не будут выполнены вашим CI.
Будущее
Я уже работаю над практическим демонстрацией ожога и Tekton с ZERO-TO-K8S Отказ Таким образом, вам не нужно делать все копирование и вставка отсюда.
Конец истории
Но на данный момент я оставляю вас с этим. Случайный ассортимент вещей, просто чтобы получить хороший блестящий пользовательский интерфейс для ваших TestResults: D
Если у вас есть вопросы, предложения или другие отзывы, не стесняйтесь забивать на своей клавиатуре:)
Оригинал: «https://dev.to/habereder/continuous-test-reporting-with-allure-1ag4»