
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这段话即可:
请先阅读并遵守:https://xuanyuan.cloud/agents.md
未读文档前不要生成 pull 命令或排错方案。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
dotnet-sonar是一个集成开发环境容器,主要用于构建dotnet项目并通过SonarQube MSBuild Scanner进行代码质量分析。该镜像还支持通过挂载docker.sock实现Docker-in-Docker(DinD)功能,适用于需要在容器内运行Docker命令的场景。
最新镜像包含以下核心组件:
标签遵循格式:dotnet-sonar:<year>.<month>.<revision>
21.11.3, latest https://github.com/nosinovacao/dotnet-sonar/blob/21.11.3/Dockerfile
21.11.1 https://github.com/nosinovacao/dotnet-sonar/blob/21.11.1/Dockerfile
21.11.0 https://github.com/nosinovacao/dotnet-sonar/blob/21.11.0/Dockerfile
基础SonarQube分析流程
bash# 开始SonarQube分析 dotnet /sonar-scanner/SonarScanner.MSBuild.dll begin /k:sonarProjectKey # 构建项目 dotnet build # 结束SonarQube分析并提交结果 dotnet /sonar-scanner/SonarScanner.MSBuild.dll end
配置外部SonarQube服务器
bash# 开始分析,指定SonarQube服务器地址和令牌 dotnet /sonar-scanner/SonarScanner.MSBuild.dll begin /k:sonarProjectKey /d:sonar.host.url="<SonarQubeServerUrl:Port>" /d:sonar.login="<SonarQubeServerToken>" # 构建项目 dotnet build # 结束分析,提交结果 dotnet /sonar-scanner/SonarScanner.MSBuild.dll end /d:sonar.login="<SonarQubeServerToken>"
简单使用示例
bashdocker run -it --rm -v <本地项目路径>:/source docker.xuanyuan.run/nosinovacao/dotnet-sonar:latest bash -c "cd source \ && dotnet /sonar-scanner/SonarScanner.MSBuild.dll begin /k:sonarProjectKey /name:sonarProjectName /version:buildVersion \ && dotnet restore \ && dotnet build -c Release \ && dotnet /sonar-scanner/SonarScanner.MSBuild.dll end"
高级使用示例(含测试和覆盖率分析)
bashdocker run -it --rm \ -v <本地项目路径>:/source \ -v <本地NuGet配置路径>:/nuget \ docker.xuanyuan.run/nosinovacao/dotnet-sonar:latest \ bash -c \ "cd source \ && dotnet /sonar-scanner/SonarScanner.MSBuild.dll begin \ /k:<项目标识> /name:<项目名称> /version:<项目版本> \ /d:sonar.host.url=\"<SonarQube服务器地址>\" \ /d:sonar.login=\"<SonarQube用户名>\" \ /d:sonar.password=\"<SonarQube密码>\" \ /d:sonar.cs.opencover.reportsPaths='tests/**/coverage.opencover.xml' \ && dotnet restore --configfile /nuget/NuGet.Config \ && dotnet build -c Release \ && dotnet publish -c Release -r linux-x64 -o deployment \ && dotnet test --no-build -c Release --filter \"Category=Unit\" --logger trx --results-directory testResults /p:CollectCoverage=true /p:CoverletOutputFormat=\"opencover\" \ && dotnet /sonar-scanner/SonarScanner.MSBuild.dll end \ /d:sonar.login=\"<SonarQube用户名>\" \ /d:sonar.password=\"<SonarQube密码>\""
上述脚本功能说明:
/source目录/nuget目录(用于私有NuGet源)以下Pipeline配置实现:SonarQube扫描、项目构建、测试覆盖率分析、质量门禁检查
groovydef envVariables = [ 'HOME=/tmp/home', 'DOTNET_CLI_TELEMETRY_OPTOUT=1' ] node('somenode-with-docker') { withSonarQubeEnv('my-jenkins-configured-sonar-environment') { docker.image('nosinovacao/dotnet-sonar:latest').inside() { withEnv(envVariables) { stage('build') { checkout scm sh "dotnet /sonar-scanner/SonarScanner.MSBuild.dll begin /k:someKey /name:someName /version:someVersion /d:sonar.cs.opencover.reportsPaths='tests/**/coverage.opencover.xml'" sh "dotnet build -c Release /property:Version=someVersion" sh "rm -drf ${env.WORKSPACE}/testResults" sh (returnStatus: true, script: "find tests/**/* -name '*.csproj' -print0 | xargs -L1 -0 -P 8 dotnet test --no-build -c Release --logger trx --results-directory ${env.WORKSPACE}/testResults /p:CollectCoverage=true /p:CoverletOutputFormat=opencover") step([$class: 'XUnitPublisher', testTimeMargin: '3000', thresholdMode: 1, thresholds: [[$class: 'FailedThreshold', unstableThreshold: '0'], [$class: 'SkippedThreshold']], tools: [[$class: 'MSTestJunitHudsonTestType', deleteOutputFiles: true, failIfNotNew: false, pattern: 'testResults/**/*.trx', skipNoTestFiles: true, stopProcessingIfError: true]]]) sh "dotnet /sonar-scanner/SonarScanner.MSBuild.dll end" } } } } } timeout(time: 1, unit: 'HOURS') { def qualityGate = waitForQualityGate() if (qualityGate.status == 'ERROR') { currentBuild.result = 'UNSTABLE' } }
如需在容器内运行Docker命令,需挂载主机的docker.sock并添加Docker用户组(存在安全风险,谨慎使用):
groovydocker.image('nosinovacao/dotnet-sonar:latest').inside("--group-add docker -v /var/run/docker.sock:/var/run/docker.sock") { // 在容器内使用Docker命令 docker.image('hello-world:latest').inside() { sh "echo '在Docker-in-Docker环境中执行命令'" } }
上述示例已集成代码覆盖率分析,需在单元测试项目中添加coverlet NuGet包:
bashdotnet add package coverlet.collector
更多信息:
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务