From 51a2ebcfd1d2593c6c6ed087f6a7c84ca3caf7f8 Mon Sep 17 00:00:00 2001 From: Kevin Paulisse Date: Fri, 23 Feb 2018 08:59:35 -0800 Subject: [PATCH 1/3] Use simplecov-erb to print the test coverage stats in the CI build --- octocatalog-diff.gemspec | 2 +- script/cibuild | 2 +- script/display-coverage-report | 51 --------------------- spec/octocatalog-diff/tests/spec_helper.rb | 4 +- vendor/cache/simplecov-erb-0.1.1.gem | Bin 0 -> 5632 bytes vendor/cache/simplecov-json-0.2.gem | Bin 4608 -> 0 bytes 6 files changed, 4 insertions(+), 55 deletions(-) delete mode 100755 script/display-coverage-report create mode 100644 vendor/cache/simplecov-erb-0.1.1.gem delete mode 100644 vendor/cache/simplecov-json-0.2.gem diff --git a/octocatalog-diff.gemspec b/octocatalog-diff.gemspec index a9020896..d1baaaef 100644 --- a/octocatalog-diff.gemspec +++ b/octocatalog-diff.gemspec @@ -37,7 +37,7 @@ EOF s.add_development_dependency 'rubocop', '= 0.48.1' s.add_development_dependency 'simplecov', '~> 0.14.1' - s.add_development_dependency 'simplecov-json' + s.add_development_dependency 'simplecov-erb', '~> 0.1.1' puppet_version = ENV['PUPPET_VERSION'] || DEFAULT_PUPPET_VERSION s.add_development_dependency 'puppet', "~> #{puppet_version}" diff --git a/script/cibuild b/script/cibuild index 4ba2f5bb..e1c45748 100755 --- a/script/cibuild +++ b/script/cibuild @@ -105,7 +105,7 @@ if [ "$RSPEC_TEST" = "true" ]; then if [ "$exitcode" -ne 0 ]; then RSPEC_EXITCODE="$exitcode"; fi # Quick coverage report - "$DIR/script/display-coverage-report" "$DIR/coverage/coverage.json" + cat "$DIR/coverage/coverage.txt" echo "" # To avoid travis getting hung if it gets confused, we'll run each of these diff --git a/script/display-coverage-report b/script/display-coverage-report deleted file mode 100755 index c2b5ec7a..00000000 --- a/script/display-coverage-report +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env ruby - -# Quick hacky script to parse the coverage JSON report and display it in human-readable terms. -# Usage: display-coverage-report - -require 'json' -require 'pathname' - -# Arg handling and validation -json_file = ARGV.first -unless json_file - raise "Usage: #{__FILE__} " -end - -unless File.file?(json_file) - raise "Error: Provided file #{json_file} does not exist" -end - -# Find files with < 100% coverage -result = {} -data = JSON.parse(File.read(json_file)) -data['files'].each do |data| - next if data['covered_percent'] == 100 - - result[data['filename']] = { covered: data['covered_percent'], lines: [] } - data['coverage'].each_with_index do |cov, index| - next if cov.nil? - result[data['filename']][:lines] << (index + 1) if cov == 0 - end -end - -# Display results -if result.empty? - puts "100% Coverage - You're all set, friend! :sparkles:" - exit 0 -end - -puts "" -puts "-------------------------------------------------------------" -puts "Test coverage report" -puts "-------------------------------------------------------------" - -basedir = Pathname.new(File.expand_path('..', File.dirname(__FILE__))) -result.keys.sort.each do |filename| - data = result[filename] - relative_path = Pathname.new(filename).relative_path_from(basedir).to_s - printf "* %s: %0.02f%% (missed: %s)", relative_path, data[:covered], data[:lines].join(",") -end - -puts "" -exit 1 diff --git a/spec/octocatalog-diff/tests/spec_helper.rb b/spec/octocatalog-diff/tests/spec_helper.rb index 73106d54..84789797 100644 --- a/spec/octocatalog-diff/tests/spec_helper.rb +++ b/spec/octocatalog-diff/tests/spec_helper.rb @@ -7,10 +7,10 @@ # Enable SimpleCov coverage testing? if ENV['COVERAGE'] require 'simplecov' - require 'simplecov-json' + require 'simplecov-erb' SimpleCov.formatters = [ SimpleCov::Formatter::HTMLFormatter, - SimpleCov::Formatter::JSONFormatter + SimpleCov::Formatter::ERBFormatter ] SimpleCov.start do # don't show specs as missing coverage for themselves diff --git a/vendor/cache/simplecov-erb-0.1.1.gem b/vendor/cache/simplecov-erb-0.1.1.gem new file mode 100644 index 0000000000000000000000000000000000000000..aaffcf1a020370c95987e2f94cfdfe2a6053c61a GIT binary patch literal 5632 zcmeHKX*3(!77j61RS;uGW5p0539718DOy@{4AmNfQZrFgk=9&l9x4=V%@lP}qSp|! zO7x*-YN*z5QG^O|-S>Xb!Dfxyt|3n&37 zP^@84JC_`L?vCo}b7xrgZXR~1f|YPt*_}8|JkK+;%jCF#Zm@0Aw4gZ96P?m}DARQ>u#+@o67%i4s_oNARYkN}n@y#t>j+Eh5P{HXC6=r@7F0w8xwYZA$P&j7=q z(9HU!gf@~%=J7TfvKcz*Hs_zs6Pf^2ZIGwGG28sL^8RL0Nb<-m)H1xmV&d4ap@b{n zSnw0ryq5auBo+%hZ=A+(+e9&@lr3#Mf|h?=%1-d5);!mw!*;xGtYUG{1~;u9IN~`647B-<9rNvsPvhK$}h&n@#^uy}O5b{dENX z&HV=q_&?--Sy_4c@A)4thdku}zh2!RNBGA7OD4{)qjDg!JvA!hs11i*F=jC@I6l?e z6bSxQo->}B!%NqxY%VGMP6%?|6i0m{1nI0?^16iu&;)2&CvG+S``*LbO8UM)z3Flj z9aKxw5=-pm{Fj3gf2NLTX8beq{Or=<=zw5b8K&~zy(DE^A})wWc~1~!ErBeHJ*i=1MI;m3;@9=%`gtwce# zt$oT`{S+J6WgjC=({(Qf?7y(|rtw>~?*fw^>$1l=`7%m0)gFsH*G?~4QZB8>m43{D zb1DqY8^z^u3+!j~$wBpaF)AOpDi_Jqc;W8bLGGT(IN=V(1b9UoiSG+%+dSADz&7|i z8B#h|V2CHQ#dpk)zcVppg2xLHj##9fTQKb50`V$TY-6QZB0W*Bc&%?p;M5^@5=m!- zZ=|5OyTuhkhXwD_HO-um-d)IuCeL%9hGy^7d6vp)s8=K~8jH8-ZB`!f4Paz$<+10Z zS2@#R)#BBqKsZt0=FP3jg37H%cJp4DQqRgZG#(r2PS>}6u&P2b&1J5&=hFszg!Lv1 z;HBRWo&|Nvyl#blYS!xt`jpaXoRMP7?@m$n$F4)hgx1(wmI%m=I$J+DXG8YWM= zwTpBaWmax%y4JfeJv0^}+)L3AB}Kp<*1&kmkvN*6&B3C9uwG(Q4dr4C@OJME>9reL zM28vk<+=f9h7JpNB*Dh1ib1Q{ZLuEAX? zlFvROH?VsWdk$Apng4_u z8(hBLvrfIIq>Q7U&HqX@b=W5K?{$3U5`=vo^coEOl2|vtmy-@U<(pm=!E0d&2w@A` z>xKrBw{9N!Ag#BnNhOi+Xur8&4X8%yBBRsrHD+V>M#*l29(s&TPA2_v&Y5a3W_s4d z^NG^JnD6qaFLind)?Zb=XuQ`AL4~diz05*;#tFtKZ@V1xE_xi>TIT5sB%a{x@4KPT zUsz!Lb|sTD^V8+Ciha?!)B{GNQh|Uq1|@9(_mAoAaK#T0uyH`!IC*+IdqRD!obUde zSHK@%qyO^%gCS&)-}Qfl9PF_F|DbYzkNaEyN5`Fa0je-v_J7*U<3=a>t4=C3P`9x% zPF!bJJfApHdR+P4(d#YCnEHUg`%{!Tzr8~LrP}t|eY84; zoY0&5iyVZ^5xRhPuP6XT$;ZJ(8DN)2pl4Ch`|2|0>1+|0z0k% literal 0 HcmV?d00001 diff --git a/vendor/cache/simplecov-json-0.2.gem b/vendor/cache/simplecov-json-0.2.gem deleted file mode 100644 index 2c1268d832283dfeb1fb43fba5bc957f1cde44c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4608 zcmeHJc{mhW8=s^J>5|Y;mN6Plwi(8l7@{yCq8Mb?_>4U=mUPWni^(#I&u1HwrCeL2 zaxIN4S-SQmyCU2)GeV4QuD<1YdiwsjfAxL$5ASoH=RN1V&v}>MInVn$c;^6Tr2uDt zCAXV^A0_ZzK_QWVuX)y$7%ZXxetL?iVJ>tzj=?ero3Mu5$9uuI+EB5jx9iq_C93iV28rR3Yb&U z;T5PUe73x~E(b@@{o)7GdO%F5@2QnO5_Yi3mn+&Vra{F5PkvCqKV-U%rX;(>mr+x% zj2YDrZVrgtd^FEv=rongkOy_{gHDkZffrjm2oyKoXo2UkK$k1(uH0?{i#?C*RJIj5 zOMBGBH_lfb8^*@}l#G7W50gc+a4%U;Gjo)d->9??5g{HYPMRAW`E9V}Zebb~Ep$UE zYl4*@Csrtx!Kh&Q3{{c6N>VNaa<()`=YKDWFJY=Qt^<)8r131};w5-J(?b zIFx(SQ!)M3U|Q+&9IY!<}{Fa{G6rU2DcD?Tw*Qo>?$6>o*SuBjHNkc9+pq3?DsFh z?Q1JWvKlH?fghPuN94Lcee~V3)GX%+wB9rJ|tbmN_EPr0&y{^j=BkR7T`JRg_mezX89Bf)- z(el&jvz|1rpJq71+PIyrzxBO^aY%YsU^a|>PrWQ`Ux%hb=i9S#XBiNgB881+MkN)? zRb-lgMz4#7q2dArBShYH`IPmh4Dl8x_497L2CPg@Egj92-%=ob&_AM9Oxhw+AO^pN zi!QLa2f@ibrMfpdK$hgx&)O6FCRL53K`ceDrDq85t1@B*xT2`1HGXA~_yBnXsKlrs zMQGmannn0b=u^jWjVmiJ8bgDAdYt#%yYYc&%g+`WR8iMY zmHrEk4vfFM2hC=%!wfqz@~FpsGDY}VRn76(UrZ)FF`Sml{3FMT0%dE<6F)*l{OMe6 zV&$(la&DP7SPCMCN8!%K!>f%CivwW|VU7bnYo?)U} zu`bMw%}*tlS90oH^2e^RDmvaHK6GIZcG4u_qzR-WanW+kf~&~);JCqZz=AqrFnF?4 z0;DxUbxv@b@oTfFUTk+7Z!4A!x#zDDl{NBccWiS;&T{Q`We#UQ0OpHV1xWr?Tl5dj z%iA@;8UOVU@c-j~1OoM6{Evhq_xS&ZUi`nEf5ZPcThCFraM)0p8SOKC5$&E{5ED-a zMj}wwxdIZeUVn)#!96qdC+ut|2y2>*^?ENlkEaQFEsQDCWaSLcUGlQ>DXggtZ=Yl8 zd|>B?$CZUNV}{~RLBWLy#*m!ejF}d&-~K_cDoJnCqgCcUBN}R>L6fFimrIk+ATQi? z3M(n;bcgF&&)It0n+n}*mN&}|6TGUX0k4Yom3XFGJoESis&E}DV(n<5_twUv~9IMU&sIDe72MKf34s5VZ4bH5X`Q<8w>4wqa|98gnB#L;%$}?}~|^m_J++ zaClwEdl0aCm2ygOtjFf&QUn=q7j@0&Rdja(WymDwVM;1DBj8&VDfzx^w zj#qKRSFM`U1yp_&8#!8=DLKjeNRi5*v)vChlC`9xuocIYflD}JI4H!_mKons*cY=| zEq^|^&!qN%UM;sl=^Y--P%9oOKGz-s)dSOC5U5SBiNCxvE%mi@PV>Ee0_b8Nl`eA0 z&a+hq9YY6kLwL480EqDI>6|kFOL+2XW$Fu5Vex>=Q#-rP)H%0flv$7LEXlcEasbCb zdwYUkLa*!&6BtS$u4wHjg`}|+?DLmZ-v#GA_lUC{mO+h8AN#Ft5$2b5zte{lG^$_A oTx(bU6wBOwY+w6qhhc`}J>LJtv)+rbhrk{JdkE|y@FxiT0mB03#sB~S From 3e5d62d94863de6d91d17a6c16a16382670f2239 Mon Sep 17 00:00:00 2001 From: Kevin Paulisse Date: Fri, 23 Feb 2018 08:59:55 -0800 Subject: [PATCH 2/3] Fail CI if test coverage is lacking --- script/cibuild | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/script/cibuild b/script/cibuild index e1c45748..1cdb5d9c 100755 --- a/script/cibuild +++ b/script/cibuild @@ -69,6 +69,7 @@ fi if [ "$RSPEC_TEST" = "true" ]; then SAVED_PATH="$PATH" RSPEC_EXITCODE="0" + COVERAGE_EXITCODE="0" for pv in $PUPPET_VERSIONS ; do export PUPPET_VERSION="$pv" @@ -106,6 +107,11 @@ if [ "$RSPEC_TEST" = "true" ]; then # Quick coverage report cat "$DIR/coverage/coverage.txt" + if grep -q "100% test coverage. You're all set, friend" "$DIR/coverage/coverage.txt"; then + : + else + COVERAGE_EXITCODE=1 + fi echo "" # To avoid travis getting hung if it gets confused, we'll run each of these @@ -136,11 +142,16 @@ if [ "$RSPEC_TEST" = "true" ]; then rm -f "${DIR}/.puppet_version" else RSPEC_EXITCODE=-1 + COVERAGE_EXITCODE=-1 echo "" fi # Finish off script echo "Finished script/cibuild:" -[ "$RUBOCOP_EXITCODE" -ge 0 ] && echo " - rubocop: exit ${RUBOCOP_EXITCODE}" -[ "$RSPEC_EXITCODE" -ge 0 ] && echo " - rspec: exit ${RSPEC_EXITCODE}" -if [ "$RUBOCOP_EXITCODE" -gt 0 ] || [ "$RSPEC_EXITCODE" -gt 0 ]; then exit 1; else exit 0; fi +[ "$RUBOCOP_EXITCODE" -ge 0 ] && echo " - rubocop: exit ${RUBOCOP_EXITCODE}" +[ "$RSPEC_EXITCODE" -ge 0 ] && echo " - rspec: exit ${RSPEC_EXITCODE}" +[ "$COVERAGE_EXITCODE" -ge 0 ] && echo " - coverage: exit ${COVERAGE_EXITCODE}" +if [ "$RUBOCOP_EXITCODE" -gt 0 ] || [ "$RSPEC_EXITCODE" -gt 0 ] || [ "$COVERAGE_EXITCODE" -gt 0 ]; then + exit 1 +fi +exit 0 From d1530b1816d4ff871778bdc76909ca7dd916c24b Mon Sep 17 00:00:00 2001 From: Kevin Paulisse Date: Mon, 26 Feb 2018 17:26:01 -0600 Subject: [PATCH 3/3] Enforce coverage for latest ruby only --- .travis.yml | 6 +++--- script/cibuild | 5 ++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index b4da3437..5966ab84 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,11 +8,11 @@ matrix: include: # Build with latest ruby - rvm: 2.5 - env: RUBOCOP_TEST="true" RSPEC_TEST="true" PUPPET_VERSIONS="3.8.7" + env: RUBOCOP_TEST="false" RSPEC_TEST="true" ENFORCE_COVERAGE="true" PUPPET_VERSIONS="3.8.7" - rvm: 2.5 - env: RUBOCOP_TEST="false" RSPEC_TEST="true" PUPPET_VERSIONS="4.10.8" + env: RUBOCOP_TEST="false" RSPEC_TEST="true" ENFORCE_COVERAGE="true" PUPPET_VERSIONS="4.10.8" - rvm: 2.5 - env: RUBOCOP_TEST="false" RSPEC_TEST="true" PUPPET_VERSIONS="5.0.0" + env: RUBOCOP_TEST="true" RSPEC_TEST="true" ENFORCE_COVERAGE="true" PUPPET_VERSIONS="5.0.0" # Build with older ruby versions - rvm: 2.4 env: RUBOCOP_TEST="false" RSPEC_TEST="true" PUPPET_VERSIONS="3.8.7" diff --git a/script/cibuild b/script/cibuild index 1cdb5d9c..73df5e2e 100755 --- a/script/cibuild +++ b/script/cibuild @@ -151,7 +151,10 @@ echo "Finished script/cibuild:" [ "$RUBOCOP_EXITCODE" -ge 0 ] && echo " - rubocop: exit ${RUBOCOP_EXITCODE}" [ "$RSPEC_EXITCODE" -ge 0 ] && echo " - rspec: exit ${RSPEC_EXITCODE}" [ "$COVERAGE_EXITCODE" -ge 0 ] && echo " - coverage: exit ${COVERAGE_EXITCODE}" -if [ "$RUBOCOP_EXITCODE" -gt 0 ] || [ "$RSPEC_EXITCODE" -gt 0 ] || [ "$COVERAGE_EXITCODE" -gt 0 ]; then +if [ "$RUBOCOP_EXITCODE" -gt 0 ] || [ "$RSPEC_EXITCODE" -gt 0 ]; then + exit 1 +fi +if [ "$COVERAGE_EXITCODE" -gt 0 ] && [ "$ENFORCE_COVERAGE" == "true" ]; then exit 1 fi exit 0