如何阻止Azure DevOps部署时appsettings.Test.json输出到服务器?
问题:阻止appsettings.Test.json被部署到服务器但保留在代码库
我有一个.NET Core 8.0 Web应用,包含appsettings.json和appsettings.Test.json文件。目前正通过Azure DevOps流水线构建并部署该应用,同时正从使用appsettings.Test.json文件迁移为通过流水线向appsettings.json注入环境变量。需要阻止仍存于代码仓库的appsettings.Test.json文件被输出到服务器(该文件需保留至迁移完成并验证功能后)。
核心问题:该文件未出现在已发布的工件中,但仍会被部署到服务器,手动删除后每次流水线运行都会重新出现。
已尝试的无效配置
我已在.csproj文件中添加以下多种组合配置,但均未生效:
<ItemGroup> <Content Remove="appsettings.*.json" /> </ItemGroup> <ItemGroup> <None Include="appsettings.*.json" /> </ItemGroup> <ItemGroup> <Content Update="appsettings.*.json" CopyToPublishDirectory="Never" /> </ItemGroup>
流水线配置详情
主流水线YAML
trigger: batch: true branches: include: - test paths: exclude: - src/ETLService/* pool: vmImage: 'windows-latest' variables: buildPlatform: 'Any CPU' buildConfiguration: 'Release' solution: '**/WebHost.sln' packageFolderName: 'WebHost' artifactName: 'WebAPI' IISWebsiteName: 'API' stages: - stage: BuildAndTest displayName: 'Build and test' jobs: - job: displayName: '${{ variables.artifactName }}' steps: - template: PipelineTemplates/BuildAndTest.yml - template: PipelineTemplates/PublishWebArtifact.yml - stage: DeployToTest displayName: 'Deploy to test' variables: - group: APITest jobs: - deployment: DeployAPI displayName: 'API' environment: 'Test.TEST-SERVER' strategy: runOnce: deploy: steps: - checkout: none - download: 'current' name: 'DownloadBuildArtifacts' displayName: 'Download build artifacts' artifact: '${{ variables.artifactName }}' - template: PipelineTemplates/DeployToIIS.yml
BuildAndTest.yml
steps: - task: NuGetToolInstaller@1 displayName: "Nuget install" - task: NuGetCommand@2 displayName: "Nuget restore" inputs: restoreSolution: '$(solution)' - task: DotNetCoreCLI@2 displayName: 'Dotnet build' inputs: command: 'build' projects: '$(solution)' arguments: '--configuration $(buildConfiguration)' - task: DotNetCoreCLI@2 displayName: 'Dotnet test' inputs: command: 'test' projects: '$(solution)' arguments: '--configuration $(buildConfiguration)'
PublishWebArtifact.yml
steps: - task: DotNetCoreCLI@2 displayName: "Dotnet Publish" inputs: command: 'publish' publishWebProjects: true arguments: '--configuration $(BuildConfiguration) --output $(Build.ArtifactStagingDirectory)' zipAfterPublish: false - task: PublishBuildArtifacts@1 displayName: "Publish Web Artifact" inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)' ArtifactName: '$(artifactName)' publishLocation: 'Container'
DeployToIIS.yml
steps: - task: IISWebAppManagementOnMachineGroup@0 name: 'StopIIS' displayName: 'Stop IIS website' inputs: IISDeploymentType: 'IISWebsite' ActionIISWebsite: 'StopWebsite' StartStopWebsiteName: '$(IISWebsiteName)' - task: IISWebAppDeploymentOnMachineGroup@0 inputs: WebSiteName: '$(IISWebsiteName)' Package: '$(Pipeline.Workspace)\$(artifactName)\$(packageFolderName)' TakeAppOfflineFlag: true JSONFiles: 'appsettings.json' - task: IISWebAppManagementOnMachineGroup@0 name: 'StartIIS' displayName: 'Start IIS website' inputs: IISDeploymentType: 'IISWebsite' ActionIISWebsite: 'StartWebsite' StartStopWebsiteName: '$(IISWebsiteName)'
解决办法
1. 在发布命令中直接排除文件
修改PublishWebArtifact.yml中的DotNet Publish任务,添加MSBuild参数强制排除目标文件,优先级高于csproj配置:
- task: DotNetCoreCLI@2 displayName: "Dotnet Publish" inputs: command: 'publish' publishWebProjects: true arguments: '--configuration $(BuildConfiguration) --output $(Build.ArtifactStagingDirectory) /p:ExcludeFilesFromDeployment=appsettings.Test.json' zipAfterPublish: false
2. 验证发布后的工件内容
在Build阶段添加PowerShell任务,确认发布后的文件夹中是否真的没有appsettings.Test.json,排除工件传递环节的问题:
- task: PowerShell@2 displayName: 'Check published files' inputs: targetType: 'inline' script: 'Get-ChildItem -Path $(Build.ArtifactStagingDirectory)\$(packageFolderName) -Recurse'
3. 修正csproj配置(明确指定单个文件)
替换之前的csproj配置,直接针对appsettings.Test.json设置规则,避免通配符匹配失效:
<ItemGroup> <Content Remove="appsettings.Test.json" /> <None Include="appsettings.Test.json"> <CopyToPublishDirectory>Never</CopyToPublishDirectory> </None> </ItemGroup>
4. 排查部署任务的额外操作
确认DeployToIIS.yml中没有额外的文件复制步骤,且部署阶段的checkout: none配置生效(不会拉取代码库文件到服务器)。
内容的提问来源于stack exchange,提问作者Habhome
相关产品推荐
相关产品推荐

