内容简介:SonarQube 除了能檢查 C# 品質外,還可以當成 dashboard 使用,讓整個團隊有統一入口關注專案的 Code Coverage。SonarQube 支援 OpenCover 與 dotCover 兩種格式,本文將以 NUnit + Coverlet + OpenCover 介紹。macOS High Sierra 10.13.6
SonarQube 除了能檢查 C# 品質外,還可以當成 dashboard 使用,讓整個團隊有統一入口關注專案的 Code Coverage。
SonarQube 支援 OpenCover 與 dotCover 兩種格式,本文將以 NUnit + Coverlet + OpenCover 介紹。
Version
macOS High Sierra 10.13.6
Docker for Mac 18.06.0-ce-mac70 (26399)
.NET Core 2.1
SonarQube 7.1
SonarScanner 4.3.1.1372
NUnit 3.10.1
Coverlet 2.1.1
Rider 2018.1.3
Coverlet
在 NUnit 專案加入 Coverlet package,這是個基於 .NET Core,且能跨平台計算 Code Coverage 的 package。
OpenCover 與 dotCover 算 .NET 生態圈兩大最有名的 package,但目前都只能跑在 Windows 平台,Coverlet 算目前跨平台最佳 solution
Dockerfile
FROM microsoft/dotnet ENV SCANNER_VERSION=4.3.1.1372 ENV SCANNER_HOME=/opt/scanner WORKDIR /app RUN apt-get update RUN apt-get install -y wget RUN apt-get install -y unzip RUN apt-get install -y openjdk-8-jre RUN wget -q https://github.com/SonarSource/sonar-scanner-msbuild/releases/download/$SCANNER_VERSION/sonar-scanner-msbuild-$SCANNER_VERSION-netcoreapp2.0.zip -O /opt/sonar-scanner-msbuild.zip RUN mkdir -p $SCANNER_HOME RUN unzip /opt/sonar-scanner-msbuild.zip -d $SCANNER_HOME RUN rm /opt/sonar-scanner-msbuild.zip RUN chmod 775 $SCANNER_HOME/ -R COPY ./ ./ ENTRYPOINT ["./scanner.sh"]
因為要在 .NET Core container 安裝 SonarScanner,所以要對 .NET Core 客製化 image。
第 1 行
FROM microsoft/dotnet
使用 FROM 設定所使用的基底 image。
使用 Microsoft 官方的 microsoft/dotnet image。
第 3 行
ENV SCANNER_VERSION=4.3.1.1372 ENV SCANNER_HOME=/opt/scanner
使用 ENV 設定 Dockerfile 的環境變數。
SCANNER_VERSION : 因為 SonarScanner 的下載路徑,會與版本有關,所以特別設定成變數。
SCANNER_HOME : 設定 SonarScanner 所安裝的目錄。
第 6 行
WORKDIR /app
設定 container 的工作目錄,也就是預設目錄都會在 /app 下。
第 8 行
RUN apt-get update RUN apt-get install -y wget RUN apt-get install -y unzip RUN apt-get install -y openjdk-8-jre
使用 RUN 執行 CLI 指令。
wget unzip SonarScanner
12 行
RUN wget -q https://github.com/SonarSource/sonar-scanner-msbuild/releases/download/$SCANNER_VERSION/sonar-scanner-msbuild-$SCANNER_VERSION-netcoreapp2.0.zip -O /opt/sonar-scanner-msbuild.zip
使用 wget 下載 SonarScanner 壓縮檔,並下載到 /opt 目錄下。
13 行
RUN mkdir -p $SCANNER_HOME RUN unzip /opt/sonar-scanner-msbuild.zip -d $SCANNER_HOME RUN rm /opt/sonar-scanner-msbuild.zip
建立 /opt/scanner 目錄,將 SonarScanner 壓縮檔解壓縮放到 /opt/scanner 目錄下,解壓縮完刪除 SonarScanner 壓縮檔。
16 行
RUN chmod 775 $SCANNER_HOME/ -R
將 SonarScanner 目錄所有檔案賦予執行權力。
18 行
COPY ./ ./
將目前 solution 下所有檔案複製到 container 內,也就是 /app 目錄下。
19 行
ENTRYPOINT ["./scanner.sh"]
最後會執行專案目錄下的 ./scanner.sh ,負責執行 SonarScanner 檢查。
Docker-compose.yml
version: "3"
services:
net-core:
build: .
container_name: MyCore
volumes:
- "${HOST_DIR}:/code/"
networks:
- netcore
depends_on:
- sonarqube
sonarqube:
image: sonarqube:latest
container_name: MySonarQube
ports:
- 9000:9000
- 9002:9002
networks:
netcore:
ipv4_address: 172.16.238.10
networks:
netcore:
ipam:
driver: default
config:
- subnet: 172.16.238.0/24
設定 .NET Core 與 SonarQube 兩個 container 同時啟動。
第 4 行
net-core:
build: .
使用 build 將同目錄下的 Dockerfile build 成 image,也就是剛才的 Dockerfile 。
第 6 行
container_name: MyCore
使用 container_name 設定 .NET Core 的 container 名稱。
第 7 行
volumes:
- "${HOST_DIR}:/code/"
使用 volumes 設定 host 與 container 的共用目錄, : 左方為 host 目錄,右方為 container 目錄。
目的是能在 .NET Core container 內抓到 host 的 project。
第 9 行
networks: - netcore
使用 networks 設定 .NET Core 與 SonarQube 共用 netcore 內部網路。
11 行
depends_on: - sonarqube
.NET Core container 相依於 SonarQube container。
14 行
sonarqube: image: sonarqube:latest
使用 image 設定 container 所使用的 image。
16 行
container_name: MySonarQube
使用 container_name 設定 SonarQube 的 container 名稱。
17 行
ports: - 9000:9000 - 9002:9002
使用 ports 設定 host 與 container 所 mapping 的 port, : 左側為 host port,右側為 container port。
為了能在 host 以瀏覽器連上 SonarQube,要將 host 的 9000 與 9002 兩個 port 給 host。
20 行
networks:
netcore:
ipv4_address: 172.16.238.10
使用 network 設定使用 netcore 網路,並設定其 IP 為 172.16.238.10 。
一般來說,我們不必為 container 設定固定 IP,只要使用 container 名稱就可彼此溝通,但稍後 SonarScanner 必須使用固定 IP 才能連上 SonarQube,所以在此特別要設定固定 IP
24 行
networks:
netcore:
ipam:
driver: default
config:
- subnet: 172.16.238.0/24
設定 netcore 網路。
.env
HOST_DIR=~/Code/CSharp
將 HOST_DIR 以環境變數設定,為 host 與 .NET Core container 所共享的目錄。
scanner.sh
#! /bin/bash sleep 35 cd ./ClassLib.Test dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=opencover cd .. dotnet /opt/scanner/SonarScanner.MSBuild.dll begin /k:core2 /n:Core2 /v:1.0 /d:sonar.login=admin /d:sonar.password=admin /d:sonar.host.url=http://172.16.238.10:9000 /d:sonar.cs.opencover.reportsPaths=/app/ClassLib.Test/coverage.opencover.xml /d:sonar.coverage.exclusions=**/Program.cs dotnet build dotnet /opt/scanner/SonarScanner.MSBuild.dll end /d:sonar.login=admin /d:sonar.password=admin
使用 SonarScanner 檢查 .NET Core 專案, scanner.sh 會放在專案根目錄。
第 2 行
sleep 30
主要是要等 SonarQube 啟動完成,比較好的方式是使用 Health Check 明確得知 SonarQube 已經啟動完成。
這裡暫時先 sleep 30 秒,等 SonarQube 先啟動,.NET Core 才開始執行 SonarScanner。
這裡還有改善的空間,也可以自行調整 sleep 時間。
第 4 行
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=opencover
執行 NUnit 單元測試。
- /p:CollectCoverage=true : 命令 Coverlet 計算 Code Coverage
- /p:CoverletOutputFormat=opencover : 命令 Coverlet 以 OpenCover 格式產出
第 6 行
dotnet /opt/scanner/SonarScanner.MSBuild.dll begin /k:core2 /n:Core2 /v:1.0 /d:sonar.login=admin /d:sonar.password=admin /d:sonar.host.url=http://172.16.238.10:9000 /d:sonar.cs.opencover.reportsPaths=/app/ClassLib.Test/coverage.opencover.xml /d:sonar.coverage.exclusions=**/Program.cs
使用 dotnet 執行 SonarScanner.MSBuild.dll ,一開始以 begin 開頭:
- /k : SonarQube 對專案的 key,內部將以此 key 作為辨別,必須唯一
- /n : 在 SonarQube 網頁上顯示的專案名稱
- /v : 在 SonarQube 網頁上顯示的版本編號
- /d:sonar.login : 指定 SonarQube 帳號
- /d:sonar.password : 指定 SonarQube 密碼
- /d:sonar.host.url : 指定 SonarQube server IP 與 port
- /d:sonar.cs.opencover.reportsPaths : 設定 OpenCover 格式的 XML 檔案位置
- /d:sonar.coverage.exclusions : 設定 SonarQube 排除 Code Coverage 計算的檔案
目前 SonarQube 設定 exclusions 的 regex 有些 bug,可能無法如文件那般設定 regex,假如遇到這個 bug,就先用最原始的方式指定 exclusions
第 7 行
dotnet build
使用 dotnet build 編譯專案。
Script 語言不用編譯,可以直接使用 SonarQube Scanner 就可以檢查,但 C# 需要編譯,因此必須 dotnet build
第 8 行
dotnet /opt/scanner/SonarScanner.MSBuild.dll end /d:sonar.login=admin /d:sonar.password=admin
最後需加上 end ,scanner 正式將 dotnet build 檢查出的結果寫入 SonarQube project
- 仍必須指定 SonarQube 的帳號密碼
執行 SonarScanner
SonarScanner $ docker-compose up --build
啟動 .NET Core 與 SonarQube container,並且自動執行 SonarScanner。
- –build : 重新建立 .NET Core 自訂 image,若有任何修改,將重新包進 image,確保
docker-compose是最新的 image
- Coverlet 計算出 Code Coverage,並且產生
coverage.opencover.xml
- 在 host 以
http://localhost:9000,將可看到 SonarQube 的檢查結果,並且正確顯示 Code Coverage
結束 Container
$ docker-compose down
Conclusion
docker-compose up --build
Sample Code
完整的範例可以在我的 GitHub 上找到
Reference
Shryne Boyer , Cross platform code coverage arrives for .NET Core
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- RecyclerView使用指南(一)—— 基本使用
- 如何使用Meteorjs使用URL参数
- 使用 defer 还是不使用 defer?
- 使用 Typescript 加强 Vuex 使用体验
- [译] 何时使用 Rust?何时使用 Go?
- UDP协议的正确使用场合(谨慎使用)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
测出转化率:营销优化的科学与艺术
【美】高尔德(Goward,C.) / 谭磊、唐捷译 / 电子工业出版社 / 2014-10-1 / 68.00元
本书作者通过已成功实现大幅提升转化率的案例,展示了大量以营销为核心的电子商务网站的测试设计方法及转化优化方案。书中作者强调了测试及优化思维的重要性,并就实现方法做了详细讲解。 通过本书,读者将学到如何能够在网站遇到发展和收入瓶颈时,测试出存在的问题并找到解决方案;如何可以深入地了解客户需求,并以此为基础优化网站,使其达到提升转化率的目的;如何提升网站的竞争优势,把在线营销渠道变成高效的转化通......一起来看看 《测出转化率:营销优化的科学与艺术》 这本书的介绍吧!