Merge branch 'fix-coveralls' into 'master'

fix: Report coverage properly at the umbrella level

See merge request mythic-insight/legendary!99
This commit is contained in:
Robert Prehn 2021-07-23 16:24:01 +00:00
commit 44c0f37b58
7 changed files with 193 additions and 9 deletions

3
.gitignore vendored
View file

@ -44,3 +44,6 @@ config/*.secret.exs
# Temporary CI build file
build.env
# CI metrics file
metrics.txt

View file

@ -26,7 +26,7 @@ variables:
- name: postgres:12
script: script/cibuild
test:
test_1.10.4:
<<: *test_template
image: "elixir:1.10.4-alpine"
@ -34,9 +34,14 @@ test_1.11.4:
<<: *test_template
image: "elixir:1.11.4-alpine"
test_1.12.1:
test:
<<: *test_template
image: "elixir:1.12.1-alpine"
script:
- script/cibuild covered
artifacts:
paths:
- cover/excoveralls.json
credo:
stage: test
@ -86,6 +91,19 @@ build_image_for_commit:
script:
- script/ci-docker-build
report_coverage:
stage: deploy_tags
needs: ['test']
image: "elixir:1.12.1-alpine"
script:
- mix local.hex --force
- script/coverage-json-to-metrics
- script/coverage-json-to-cobertura
artifacts:
reports:
metrics: metrics.txt
cobertura: cover/cobertura.xml
# If tests pass, tag the commit and update package versions
deploy_to_tags:
stage: deploy_tags

View file

@ -4,7 +4,7 @@ defmodule Legendary.Content.TermRelationship do
"""
use Ecto.Schema
import Ecto.Changeset
alias Legendary.Content.{Post}
alias Legendary.Content.Post
@primary_key {:object_id, :integer, []}
@primary_key {:term_taxonomy_id, :integer, []}

15
mix.exs
View file

@ -11,9 +11,16 @@ defmodule Legendary.Mixfile do
build_embedded: Mix.env() == :prod,
start_permanent: Mix.env() == :prod,
deps: deps(),
aliases: aliases(),
test_coverage: [tool: ExCoveralls],
preferred_cli_env: [coveralls: :test, "coveralls.detail": :test, "coveralls.post": :test, "coveralls.html": :test],
aliases: aliases(),
preferred_cli_env: [
coveralls: :test,
"coveralls.detail": :test,
"coveralls.post": :test,
"coveralls.html": :test,
"coveralls.json": :test,
"coveralls.xml": :test
],
]
end
@ -24,10 +31,8 @@ defmodule Legendary.Mixfile do
defp aliases do
[
"deps.get": ["cmd mix deps.get"],
"coveralls.html": ["cmd mix coveralls.html"],
"ecto.migrate": ["cmd mix ecto.migrate"],
"npm.install": ["cmd mix npm.install"],
test: ["cmd mix test"]
"npm.install": ["cmd mix npm.install"]
]
end
end

View file

@ -12,6 +12,10 @@ mix deps.get
mix ecto.create
mix ecto.migrate
mix test
if [ $1 == 'covered' ]; then
mix coveralls.json --umbrella
else
mix test
fi;
script/restore-timestamps

124
script/coverage-json-to-cobertura Executable file
View file

@ -0,0 +1,124 @@
#!/usr/bin/env elixir
Mix.install([
{:jason, "~> 1.0"},
{:xml_builder, "~> 2.1"}
])
%{"source_files" => data} =
"cover/excoveralls.json"
|> File.read!()
|> Jason.decode!()
{total_covered, total_total} =
data
|> Enum.reduce({0,0}, fn %{"coverage" => cover}, {covered, total} ->
file_covered =
cover
|> Enum.reduce(0, &(if is_integer(&1) && &1 > 0, do: &2 + 1, else: &2))
file_total =
cover
|> Enum.reduce(0, &(if is_nil(&1), do: &2, else: &2 + 1))
{covered + file_covered, total + file_total}
end)
ratio = total_covered / total_total
files =
data
|> Enum.map(fn %{"coverage" => cover, "name" => name} ->
file_covered =
cover
|> Enum.reduce(0, &(if is_integer(&1) && &1 > 0, do: &2 + 1, else: &2))
file_total =
cover
|> Enum.reduce(0, &(if is_nil(&1), do: &2, else: &2 + 1))
lines =
cover
|> Enum.with_index
|> Enum.map(fn
{nil, _index} ->
nil
{line, index} ->
{:line, %{"number" => index, "hits" => line}, []}
end)
|> Enum.reject(&is_nil/1)
ratio =
if file_total == 0 do
1.0
else
file_covered / file_total
end
{
:class,
%{"filename" => name, "line-rate" => ratio},
[
{
:lines,
%{},
lines
}
]
}
end)
source =
if System.get_env("CI_PROJECT_NAME") do
"#{System.get_env("CI_BUILDS_DIR")}/#{System.get_env("CI_PROJECT_NAMESPACE")}/#{System.get_env("CI_PROJECT_NAME")}"
else
File.cwd!
end
buffer =
XmlBuilder.document([
XmlBuilder.doctype(
"coverage",
system: ["http://cobertura.sourceforge.net/xml/coverage-03.dtd"]
),
{
:coverage,
%{
"line-rate" => ratio,
},
[
{
:sources,
%{},
[
{
:source,
%{},
source
}
]
},
{
:packages,
%{},
[
{
:package,
%{"name" => "", "line-rate" => ratio},
[
{
:classes,
%{},
files
}
]
}
]
}
]
}
])
|> XmlBuilder.generate
File.write!("cover/cobertura.xml", buffer)

30
script/coverage-json-to-metrics Executable file
View file

@ -0,0 +1,30 @@
#!/usr/bin/env elixir
Mix.install([
{:jason, "~> 1.0"}
])
%{"source_files" => data} =
"cover/excoveralls.json"
|> File.read!()
|> Jason.decode!()
{total_covered, total_total} =
data
|> Enum.reduce({0,0}, fn %{"coverage" => cover}, {covered, total} ->
file_covered =
cover
|> Enum.reduce(0, &(if is_integer(&1) && &1 > 0, do: &2 + 1, else: &2))
file_total =
cover
|> Enum.reduce(0, &(if is_nil(&1), do: &2, else: &2 + 1))
{covered + file_covered, total + file_total}
end)
ratio =
(total_covered / total_total)
|> Float.round(3)
File.write!("metrics.txt", "coverage #{ratio}")