From 6e9e61dc325053328a2066bd008663489760412d Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Wed, 15 Aug 2018 10:14:19 +0000 Subject: [PATCH] Documentation for JUnit XML Test Summary In MR widget --- doc/README.md | 1 + doc/ci/examples/README.md | 4 + doc/ci/img/junit_test_report.png | Bin 0 -> 9572 bytes doc/ci/junit_test_reports.md | 102 +++++++++++++++++++++++ doc/ci/yaml/README.md | 46 ++++++++++ doc/user/project/merge_requests/index.md | 3 +- 6 files changed, 154 insertions(+), 2 deletions(-) create mode 100644 doc/ci/img/junit_test_report.png create mode 100644 doc/ci/junit_test_reports.md diff --git a/doc/README.md b/doc/README.md index a814c787f94..4248f62c08c 100644 --- a/doc/README.md +++ b/doc/README.md @@ -133,6 +133,7 @@ scales to run your tests faster. - [GitLab CI/CD](ci/README.md): Explore the features and capabilities of Continuous Integration, Continuous Delivery, and Continuous Deployment with GitLab. - [Review Apps](ci/review_apps/index.md): Preview changes to your app right from a merge request. - [Pipeline Graphs](ci/pipelines.md#pipeline-graphs) +- [JUnit test reports](ci/junit_test_reports.md) ### Package diff --git a/doc/ci/examples/README.md b/doc/ci/examples/README.md index 811f4d1f07a..8eb96ae10b2 100644 --- a/doc/ci/examples/README.md +++ b/doc/ci/examples/README.md @@ -43,6 +43,10 @@ There's also a collection of repositories with [example projects](https://gitlab - [Using `dpl` as deployment tool](deployment/README.md) - [The `.gitlab-ci.yml` file for GitLab itself](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/.gitlab-ci.yml) +## Test Reports + +[Collect test reports in Verify stage](../junit_test_reports.md). + ## Code Quality analysis **(Starter)** [Analyze your project's Code Quality](code_quality.md). diff --git a/doc/ci/img/junit_test_report.png b/doc/ci/img/junit_test_report.png new file mode 100644 index 0000000000000000000000000000000000000000..ad098eb457fa8dd48cd6ea99492c6a66d33893e4 GIT binary patch literal 9572 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 [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/issues/45318) in GitLab 11.2. +Requires GitLab Runner 11.2 and above. + +## Overview + +It is very common that a [CI/CD pipeline](pipelines.md) contains a +test job that will verify your code. +If the tests fail, the pipeline fails and users get notified. The person that +works on the merge request will have to check the job logs and see where the +tests failed so that they can fix them. + +You can configure your job to use JUnit test reports, and GitLab will display a +report on the merge request so that it's easier and faster to identify the +failure without having to check the entire log. + +## Use cases + +Consider the following workflow: + +1. Your `master` branch is rock solid, your project is using GitLab CI/CD and + your pipelines indicate that there isn't anything broken. +1. Someone from you team submits a merge request, a test fails and the pipeline + gets the known red icon. To investigate more, you have to go through the job + logs to figure out the cause of the failed test, which usually contain + thousands of lines. +1. You configure the JUnit test reports and immediately GitLab collects and + exposes them in the merge request. No more searching in the job logs. +1. Your development and debugging workflow becomes easier, faster and efficient. + +## How it works + +First, GitLab Runner uploads all JUnit XML files as artifacts to GitLab. Then, +when you visit a merge request, GitLab starts comparing the head and base branch's +JUnit test reports, where: + +- The base branch is the target branch (usually `master`). +- The head branch is the source branch (the latest pipeline in each merge request). + +The reports panel has a summary showing how many tests failed and how many were fixed. +If no comparison can be done because data for the base branch is not available, +the panel will just show the list of failed tests for head. + +There are three types of results: + +1. **Newly failed tests:** Test cases which passed on base branch and failed on head branch +1. **Existing failures:** Test cases which failed on base branch and failed on head branch +1. **Resolved failures:** Test cases which failed on base branch and passed on head branch + +Each entry in the panel will show the test name and its type from the list +above. Clicking on the test name will open a modal window with details of its +execution time and the error output. + +![Test Reports Widget](img/junit_test_report.png) + +## How to set it up + +NOTE: **Note:** +For a list of supported languages on JUnit tests, check the +[Wikipedia article](https://en.wikipedia.org/wiki/JUnit#Ports). + +To enable the JUnit reports in merge requests, you need to add +[`artifacts:reports:junit`](yaml/README.md#artifacts-reports-junit) +in `.gitlab-ci.yml`, and specify the path(s) of the generated test reports. + +In the following examples, the job in the `test` stage runs and GitLab +collects the JUnit test report from each job. After each job is executed, the +XML reports are stored in GitLab as artifacts and their results are shown in the +merge request widget. + +### Ruby example + +Use the following job in `.gitlab-ci.yml`: + +```yaml +## Use https://github.com/sj26/rspec_junit_formatter to generate a JUnit report with rspec +ruby: + stage: test + script: + - bundle install + - rspec spec/lib/ --format RspecJunitFormatter --out rspec.xml + artifacts: + reports: + junit: rspec.xml +``` + +### Go example + +Use the following job in `.gitlab-ci.yml`: + +```yaml +## Use https://github.com/jstemmer/go-junit-report to generate a JUnit report with go +golang: + stage: test + script: + - go get -u github.com/jstemmer/go-junit-report + - go test -v 2>&1 | go-junit-report > report.xml + artifacts: + reports: + junit: report.xml +``` diff --git a/doc/ci/yaml/README.md b/doc/ci/yaml/README.md index 95d705d3a3d..ef740ab1c5e 100644 --- a/doc/ci/yaml/README.md +++ b/doc/ci/yaml/README.md @@ -1092,6 +1092,52 @@ job: expire_in: 1 week ``` +### `artifacts:reports` + +> [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/20390) in +GitLab 11.2. Requires GitLab Runner 11.2 and above. + +The `reports` keyword is used for collecting test reports from jobs and +exposing them in GitLab's UI (merge requests, pipeline views). Read how to use +this with [JUnit reports](#artifacts-reports-junit). + +NOTE: **Note:** +The test reports are collected regardless of the job results (success or failure). +You can use [`artifacts:expire_in`](#artifacts-expire_in) to set up an expiration +date for their artifacts. + +#### `artifacts:reports:junit` + +> [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/20390) in +GitLab 11.2. Requires GitLab Runner 11.2 and above. + +The `junit` report collects [JUnit XML files](https://www.ibm.com/support/knowledgecenter/en/SSQ2R2_14.1.0/com.ibm.rsar.analysis.codereview.cobol.doc/topics/cac_useresults_junit.html) +as artifacts. Although JUnit was originally developed in Java, there are many +[third party ports](https://en.wikipedia.org/wiki/JUnit#Ports) for other +languages like Javascript, Python, Ruby, etc. + +Below is an example of collecting a JUnit XML file from Ruby's RSpec test tool: + +```yaml +rspec: + stage: test + script: + - bundle install + - rspec --format RspecJunitFormatter --out rspec.xml + artifacts: + reports: + junit: rspec.xml +``` + +The collected JUnit reports will be uploaded to GitLab as an artifact and will +be automatically [shown in merge requests](../junit_test_reports.md). + +NOTE: **Note:** +In case the JUnit tool you use exports to multiple XML files, you can specify +multiple test report paths within a single job +(`junit: [rspec-1.xml, rspec-2.xml, rspec-3.xml]`) and they will be automatically +concatenated into a single file. + ## `dependencies` > Introduced in GitLab 8.6 and GitLab Runner v1.1.1. diff --git a/doc/user/project/merge_requests/index.md b/doc/user/project/merge_requests/index.md index 86ecf33ed31..43ca498d006 100644 --- a/doc/user/project/merge_requests/index.md +++ b/doc/user/project/merge_requests/index.md @@ -43,8 +43,7 @@ A. Consider you are a software developer working in a team: 1. You checkout a new branch, and submit your changes through a merge request 1. You gather feedback from your team -1. You work on the implementation optimizing code with [Code Quality reports](https://docs.gitlab.com/ee/user/project/merge_requests/code_quality.html) **[STARTER]** -1. You build and test your changes with GitLab CI/CD +1. You verify your changes with [JUnit test reports](../../../ci/junit_test_reports.md) in GitLab CI/CD 1. You request the approval from your manager 1. Your manager pushes a commit with his final review, [approves the merge request](https://docs.gitlab.com/ee/user/project/merge_requests/merge_request_approvals.html), and set it to [merge when pipeline succeeds](#merge-when-pipeline-succeeds) (Merge Request Approvals are available in GitLab Starter) 1. Your changes get deployed to production with [manual actions](../../../ci/yaml/README.md#manual-actions) for GitLab CI/CD