因此,我正在尝试为新的统一构建和发布管道设置YAML,但是在将代码覆盖结果发布到构建时遇到了问题...
当我包含代码覆盖率报告时,我得到的错误是:
Job Job1: Step Download_Code Coverage Report_870 has an invalid name. Valid names may only contain alphanumeric characters and '_' and may not start with a number.
当我这样设置时,它可以工作,但是我没有得到代码覆盖率结果:
# ASP.NET Core
# Build and test ASP.NET Core projects targeting .NET Core.
# Add steps that run tests, create a NuGet package, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/dotnet-core
trigger:
- master
variables:
buildConfiguration: 'Release'
system.debug: true
stages:
- stage: BuildAndDeploy
displayName: Test
jobs:
- job: Quality
displayName: Get Test Coverage and Code Quality
pool:
vmImage: 'ubuntu-latest'
steps:
# Install the latest version of the dotnet sdk
- task: DotNetCoreInstaller@0
displayName: 'Use .NET Core sdk 2.2.103'
inputs:
version: 2.2.103
- script: dotnet build --configuration $(buildConfiguration)
displayName: 'dotnet build $(buildConfiguration)'
- script: dotnet test --configuration $(buildConfiguration) --logger trx --no-build
displayName: 'dotnet test --configuration $(buildConfiguration) --logger trx --no-build'
- task: PublishTestResults@2
inputs:
testRunner: VSTest
testResultsFiles: 'test/**/*.trx'
- task: DotNetCoreCLI@2
displayName: Package Artifact
inputs:
command: 'publish'
arguments: '--configuration $(BuildConfiguration) --output $(Build.ArtifactStagingDirectory)'
zipAfterPublish: True
publishWebProjects: true
feedsToUse: 'select'
versioningScheme: 'off'
- task: PublishPipelineArtifact@0
inputs:
artifactName: 'FakeApiServer'
targetPath: '$(Build.ArtifactStagingDirectory)/FakeApi.Server.AspNetCore.zip'
- stage: DeployTest
dependsOn: BuildAndDeploy
condition: and(succeeded(), not(eq(variables['Build.SourceBranch'], 'refs/heads/master')))
displayName: Deploy To Test
jobs:
- deployment: DeployToTest
environment: Testing
pool:
vmImage: 'ubuntu-latest'
strategy:
runOnce:
deploy:
steps:
- task: DownloadPipelineArtifact@1
inputs:
buildType: 'current'
artifactName: 'FakeApiServer'
targetPath: '$(System.ArtifactsDirectory)'
- task: AzureRmWebAppDeployment@4
displayName: Deploy to https://fake-api-test.azurewebsites.com
inputs:
ConnectionType: 'AzureRM'
azureSubscription: 'Fake API Personal Azure Subscription'
appType: 'webApp'
WebAppName: 'fake-api-test'
Package: $(System.ArtifactsDirectory)/*.zip
enableCustomDeployment: true
DeploymentType: 'zipDeploy'
- stage: DeployProd
dependsOn: BuildAndDeploy
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master'))
displayName: Deploy To Prod
jobs:
- deployment: DeployToProd
environment: Production
pool:
vmImage: 'ubuntu-latest'
strategy:
runOnce:
deploy:
steps:
- task: DownloadPipelineArtifact@1
inputs:
buildType: 'current'
artifactName: 'FakeApiServer'
targetPath: '$(System.ArtifactsDirectory)'
- task: AzureRmWebAppDeployment@4
displayName: Deploy to https://fake-api.azurewebsites.com
inputs:
ConnectionType: 'AzureRM'
azureSubscription: 'Fake API Personal Azure Subscription'
appType: 'webApp'
WebAppName: 'fake-api'
Package: $(System.ArtifactsDirectory)/*.zip
enableCustomDeployment: true
DeploymentType: 'zipDeploy'
但是当我包括运行和报告代码覆盖时,部署阶段将失败:
# ASP.NET Core
# Build and test ASP.NET Core projects targeting .NET Core.
# Add steps that run tests, create a NuGet package, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/dotnet-core
trigger:
- master
variables:
buildConfiguration: 'Release'
system.debug: true
stages:
- stage: BuildAndDeploy
displayName: Test
jobs:
- job: Quality
displayName: Get Test Coverage and Code Quality
pool:
vmImage: 'ubuntu-latest'
steps:
# Install the latest version of the dotnet sdk
- task: DotNetCoreInstaller@0
displayName: 'Use .NET Core sdk 2.2.103'
inputs:
version: 2.2.103
- script: dotnet tool install --global coverlet.console
displayName: 'Install coverlet'
- script: dotnet tool install -g dotnet-reportgenerator-globaltool
displayName: 'install reportgenerator'
- script: dotnet build --configuration $(buildConfiguration)
displayName: 'dotnet build $(buildConfiguration)'
- script: dotnet test --configuration $(buildConfiguration) /p:Exclude="[xunit*]*" /p:CollectCoverage=true /p:CoverletOutputFormat=\"opencover,cobertura\" --logger trx --no-build
displayName: 'dotnet test --configuration $(buildConfiguration) /p:Exclude="[xunit*]*" /p:CollectCoverage=true /p:CoverletOutputFormat="opencover,cobertura" --logger trx --no-build'
- script: reportgenerator -reports:test/**/coverage.cobertura.xml -targetdir:coveragereport -reporttypes:"HtmlInline_AzurePipelines;Cobertura"
displayName: 'reportgenerator -reports:test/**/coverage.cobertura.xml -targetdir:coveragereport -reporttypes:"HtmlInline_AzurePipelines;Cobertura"'
- task: PublishTestResults@2
inputs:
testRunner: VSTest
testResultsFiles: 'test/**/*.trx'
- task: PublishCodeCoverageResults@1
displayName: 'Publish code coverage'
inputs:
codeCoverageTool: Cobertura
summaryFileLocation: '$(Build.SourcesDirectory)/coveragereport/Cobertura.xml'
- task: DotNetCoreCLI@2
displayName: Package Artifact
inputs:
command: 'publish'
arguments: '--configuration $(BuildConfiguration) --output $(Build.ArtifactStagingDirectory)'
zipAfterPublish: True
publishWebProjects: true
feedsToUse: 'select'
versioningScheme: 'off'
- task: PublishPipelineArtifact@0
inputs:
artifactName: 'FakeApiServer'
targetPath: '$(Build.ArtifactStagingDirectory)/FakeApi.Server.AspNetCore.zip'
- stage: DeployTest
dependsOn: BuildAndDeploy
condition: and(succeeded(), not(eq(variables['Build.SourceBranch'], 'refs/heads/master')))
displayName: Deploy To Test
jobs:
- deployment: DeployToTest
environment: Testing
pool:
vmImage: 'ubuntu-latest'
strategy:
runOnce:
deploy:
steps:
- task: DownloadPipelineArtifact@1
inputs:
buildType: 'current'
artifactName: 'FakeApiServer'
targetPath: '$(System.ArtifactsDirectory)'
- task: AzureRmWebAppDeployment@4
displayName: Deploy to https://fake-api-test.azurewebsites.com
inputs:
ConnectionType: 'AzureRM'
azureSubscription: 'Fake API Personal Azure Subscription'
appType: 'webApp'
WebAppName: 'fake-api-test'
Package: $(System.ArtifactsDirectory)/*.zip
enableCustomDeployment: true
DeploymentType: 'zipDeploy'
- stage: DeployProd
dependsOn: BuildAndDeploy
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master'))
displayName: Deploy To Prod
jobs:
- deployment: DeployToProd
environment: Production
pool:
vmImage: 'ubuntu-latest'
strategy:
runOnce:
deploy:
steps:
- task: DownloadPipelineArtifact@1
inputs:
buildType: 'current'
artifactName: 'FakeApiServer'
targetPath: '$(System.ArtifactsDirectory)'
- task: AzureRmWebAppDeployment@4
displayName: Deploy to https://fake-api.azurewebsites.com
inputs:
ConnectionType: 'AzureRM'
azureSubscription: 'Fake API Personal Azure Subscription'
appType: 'webApp'
WebAppName: 'fake-api'
Package: $(System.ArtifactsDirectory)/*.zip
enableCustomDeployment: true
DeploymentType: 'zipDeploy'
再次,我得到的错误是:
Job Job1: Step Download_Code Coverage Report_870 has an invalid name. Valid names may only contain alphanumeric characters and '_' and may not start with a number.
我当时在Build 2019上与他们的展位上的Azure DevOps人员进行了交谈,他们似乎认为这可能是系统中的错误,但是我仍然没有回音,所以我想我会看到如果这里有人有什么想法。
真正奇怪的部分是,我从不告诉它下载代码覆盖率报告工件...它只是决定自己下载所有组件,并且在无法下载之前就失败了。下载我定义的管道工件步骤。
答案 0 :(得分:0)
我有同样的问题,但是当我以相同的步骤使用标准工作时,我认为它与部署工作有关-没有出现问题。我还注意到,即使配置了池:vmImage:ubuntu-latest,我的部署作业仍在服务器代理上运行
答案 1 :(得分:0)
您可以尝试使用ReportGenerator扩展:https://marketplace.visualstudio.com/items?itemName=Palmmedia.reportgenerator(至少可以节省一些构建时间,因为您无需在构建过程中安装它)
今天我也遇到了一些构建问题,并且似乎与设置为'ubuntu-latest'的vmImage的使用有关。
我看到的是,在某些构建中,文件系统看起来像这样:
/home/vsts/agents/2.150.3/d:\a/1/s/
应为:
/home/vsts/work/1/s/
切换到“ Ubuntu 16.04”后,它似乎恢复了正常。