Couverture de TeamCity
Dans TeamCity, je couvre Django de la manière suivante
Créer un rapport de couverture par appel make ci_test
utilisation des commandes Makefile
.
VENV_PATH := $(HOME)/venv/bin
PROJ_NAME := my_awesome_project
# ...
ci_test: cover_test cover_report
cover_test:
$(VENV_PATH)/coverage run --source=$(PROJ_NAME) manage.py test -v 2 --noinput
cover_report:
$(VENV_PATH)/coverage report -m
$(VENV_PATH)/coverage html
$(VENV_PATH)/coverage-badge > htmlcov/coverage.svg
El cover_test
exécute les tests de Django, et mesure la couverture du code. Le site cover_report
imprime un rapport de couverture sur la console, et génère également un rapport html et, en utilisant la commande couverture-badge l'utilitaire génère un beau badge avec l'état de couverture du code de badge .
Après cela, les artefacts sont collectés dans la base de données TeamCity (onglet General Settings
)
Ils sont rassemblés dans un onglet Artifacts
Et disponible sur le serveur CI par le chemin :
/repository/download/%teamcity.project.id%/%teamcity.build.id%:id/htmlcov /index.html
/repository/download/%teamcity.project.id%/.lastFinished/htmlcov/index.html
Couverture du rapport GitHub
Enfin, pousser le hook GitHub pour afficher l'état de la couverture de la construction dans le repo :
Couverture en attente (avant la construction)
OWNER="<GITHUB OWNER>";
REPO="<REPO NAME>";
SHA="%build.vcs.number%";
curl "https://api.github.com/repos/$OWNER/$REPO/statuses/$SHA" \
-X POST \
-H "Content-Type: application/json" \
-H "Authorization: token <GITHUB API TOKEN>" \
-d '{
"state": "pending",
"description": "Coverage pending.",
"context": "continuous-integration/coverage"
}'
Copie du badge de couverture
BADGE="/path/to/public/dir/badges/%teamcity.project.id%/%teamcity.build.branch%-coverage.svg"
DIR=$(dirname "${BADGE}")
mkdir -p $DIR
cp -f htmlcov/coverage.svg $BADGE
Couverture Crochet de finition
OWNER="<GITHUB OWNER>";
REPO="<REPO NAME>";
SHA="%build.vcs.number%";
REPORT_URL="http://<YOU TEAMCITY DOMAIN>/repository/download/%teamcity.project.id%/%teamcity.build.id%:id/htmlcov/index.html";
COVERAGE=$(cat ./htmlcov/index.html | grep '<span class="pc_cov">' | grep -o '[0-9]\+');
if [ "$COVERAGE" -ge "85" ]; then
STATUS='success';
else
STATUS='failure';
fi
curl "https://api.github.com/repos/$OWNER/$REPO/statuses/$SHA" \
-X POST \
-H "Content-Type: application/json" \
-H "Authorization: token <GITHUB API TOKEN>" \
-d '{
"state": "'$STATUS'",
"target_url": "'$REPORT_URL'",
"description": "Coverage '$COVERAGE'%",
"context": "continuous-integration/coverage"
}'
Résultat dans github :
Article de blog à ce sujet ru
: https://maks.live/articles/drugoe/otchety-coverage-v-teamcity/