我有一个 .NET Core 8.0 Web 应用程序,其中有一个
appsettings.json
文件和一个 appsettings.Test.json
文件。我有一个 Azure DevOps 管道,用于构建应用程序并将其部署到服务器。我们不再使用 appsettings.Test.json
文件,而是通过管道将环境变量注入到 appsettings.json
文件中。如何防止仍在存储库中的 appsettings.Test.json
文件(并将在那里停留一段时间,直到我们完成迁移并验证所有功能)输出到服务器?
但是它最终会出现在服务器上,并且即使我手动删除它,它也会在每次管道运行后重新出现:
我尝试以不同的组合在我们的
.csproj
文件中添加以下内容,但似乎没有任何效果。根据此处所述:ASP.NET Core:发布时排除或包含文件
<ItemGroup>
<Content Remove="appsettings.*.json" />
</ItemGroup>
<ItemGroup>
<None Include="appsettings.*.json" />
</ItemGroup>
<ItemGroup>
<Content Update="appsettings.*.json" CopyToPublishDirectory="Never" />
</ItemGroup>
我的管道如下所示:
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)'
这似乎是一个典型的错误假设案例。我发布工件或部署它的路径引用没有任何问题。我假设当我运行管道时,在其上工作的代理有一个干净的工作目录开始。事实并非如此,我从未仔细检查过这一点,直到我最终偶然发现了这篇文章:如何在将工件下载到目标目录之前清理目标目录?
因此,在我的
$(Pipeline.Workspace)
文件夹中,我有上次运行时输出的文件的残余物,并且这些版本从未被清除并继续部署。不幸的是,他们每次都会在目标服务器上获得新的时间戳,所以我认为它们就像其他文件一样是新生成的。
解决方案是在管道中的部署任务中添加 clean 参数:
- deployment: DeployInvoiceAPI
displayName: 'API'
environment: 'Test.IT1-INTAPI1-TST'
workspace: # Added
clean: all # Added