diff --git a/.gitignore b/.gitignore
index a164018c15f07df97ac8a0e7896bf43d10ff0212..ade49e1eccbd37ac1df7a8c3efc9fb082e9c276a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,4 @@ dist
 node_modules
 .nyc_output
 coverage
+test-results.xml
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 7cd648ddf453c70ec8116dd7fde0cb6ccae6d9aa..ffa112576d7b8c703c6e7b54d3e89943b6374a71 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -9,6 +9,13 @@ test:
     - npm install
     - npm run coverage
   coverage: '/All files[^|]*\|[^|]*\s+([\d\.]+)/'
+  artifacts:
+    expire_in: 1 hour
+    paths:
+      - coverage/
+    reports:
+      junit: test-results.xml
+      cobertura: coverage/cobertura-coverage.xml
   tags:
     - docker
 
diff --git a/package-lock.json b/package-lock.json
index aa948ba9e714f9d6871d8dbd5cde2132953fb678..ddacca2566975652df59c6690c4fdc5118f56b84 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
 {
-	"name": "broken-links-inspector",
-	"version": "0.1.0",
+	"name": "@dbogatov/broken-links-inspector",
+	"version": "0.1.1",
 	"lockfileVersion": 1,
 	"requires": true,
 	"dependencies": {
@@ -509,6 +509,12 @@
 				"supports-color": "^7.1.0"
 			}
 		},
+		"charenc": {
+			"version": "0.0.2",
+			"resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
+			"integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=",
+			"dev": true
+		},
 		"check-error": {
 			"version": "1.0.2",
 			"resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
@@ -626,6 +632,12 @@
 				"which": "^2.0.1"
 			}
 		},
+		"crypt": {
+			"version": "0.0.2",
+			"resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
+			"integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=",
+			"dev": true
+		},
 		"debug": {
 			"version": "3.2.6",
 			"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
@@ -1367,6 +1379,25 @@
 			"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
 			"dev": true
 		},
+		"md5": {
+			"version": "2.2.1",
+			"resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz",
+			"integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=",
+			"dev": true,
+			"requires": {
+				"charenc": "~0.0.1",
+				"crypt": "~0.0.1",
+				"is-buffer": "~1.1.1"
+			},
+			"dependencies": {
+				"is-buffer": {
+					"version": "1.1.6",
+					"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+					"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+					"dev": true
+				}
+			}
+		},
 		"minimatch": {
 			"version": "3.0.4",
 			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
@@ -1382,6 +1413,15 @@
 			"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
 			"dev": true
 		},
+		"mkdirp": {
+			"version": "0.5.5",
+			"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+			"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+			"dev": true,
+			"requires": {
+				"minimist": "^1.2.5"
+			}
+		},
 		"mocha": {
 			"version": "8.0.1",
 			"resolved": "https://registry.npmjs.org/mocha/-/mocha-8.0.1.tgz",
@@ -1415,6 +1455,36 @@
 				"yargs-unparser": "1.6.0"
 			}
 		},
+		"mocha-junit-reporter": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.0.0.tgz",
+			"integrity": "sha512-20HoWh2HEfhqmigfXOKUhZQyX23JImskc37ZOhIjBKoBEsb+4cAFRJpAVhFpnvsztLklW/gFVzsrobjLwmX4lA==",
+			"dev": true,
+			"requires": {
+				"debug": "^2.2.0",
+				"md5": "^2.1.0",
+				"mkdirp": "~0.5.1",
+				"strip-ansi": "^4.0.0",
+				"xml": "^1.0.0"
+			},
+			"dependencies": {
+				"debug": {
+					"version": "2.6.9",
+					"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+					"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+					"dev": true,
+					"requires": {
+						"ms": "2.0.0"
+					}
+				},
+				"ms": {
+					"version": "2.0.0",
+					"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+					"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+					"dev": true
+				}
+			}
+		},
 		"ms": {
 			"version": "2.1.2",
 			"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -2092,6 +2162,12 @@
 				"typedarray-to-buffer": "^3.1.5"
 			}
 		},
+		"xml": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz",
+			"integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=",
+			"dev": true
+		},
 		"y18n": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
diff --git a/package.json b/package.json
index ddd25a056a97a84502a99bed65f538de8be01a46..ec7c5686d980f0f949467397b351464848a2f87c 100644
--- a/package.json
+++ b/package.json
@@ -1,14 +1,14 @@
 {
 	"name": "@dbogatov/broken-links-inspector",
-	"version": "0.1.1",
+	"version": "0.1.2",
 	"description": "Extract and recursively check all URLs reporting broken ones",
 	"main": "index.js",
 	"directories": {
 		"test": "test"
 	},
 	"scripts": {
-		"clean": "rm -rf .nyc_output coverage dist",
-		"test": "mocha -r ts-node/register test/**/*.ts",
+		"clean": "rm -rf .nyc_output coverage dist test-results.xml",
+		"test": "mocha --reporter mocha-junit-reporter -r ts-node/register test/**/*.ts",
 		"coverage": "nyc --reporter=html --reporter=cobertura --reporter=text -e .ts -n \"src/**/*.ts\" -x \"test/**/*.ts\" npm run test"
 	},
 	"publishConfig": {
@@ -39,6 +39,7 @@
 		"@types/mocha": "^7.0.2",
 		"chai": "^4.2.0",
 		"mocha": "^8.0.1",
+		"mocha-junit-reporter": "^2.0.0",
 		"nyc": "^15.1.0",
 		"ts-node": "^8.10.2",
 		"typescript": "^3.9.5"