为什么我的 Azure DevOps 管道将已发布的工件中不存在的文件输出到服务器?

问题描述 投票:0回答:1

我有一个 .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)'
azure azure-devops yaml azure-pipelines azure-artifacts
1个回答
0
投票

这似乎是一个典型的错误假设案例。我发布工件或部署它的路径引用没有任何问题。我假设当我运行管道时,在其上工作的代理有一个干净的工作目录开始。事实并非如此,我从未仔细检查过这一点,直到我最终偶然发现了这篇文章:如何在将工件下载到目标目录之前清理目标目录?

因此,在我的

$(Pipeline.Workspace)
文件夹中,我有上次运行时输出的文件的残余物,并且这些版本从未被清除并继续部署。不幸的是,他们每次都会在目标服务器上获得新的时间戳,所以我认为它们就像其他文件一样是新生成的。

解决方案是在管道中的部署任务中添加 clean 参数:

- deployment: DeployInvoiceAPI
  displayName: 'API'
  environment: 'Test.IT1-INTAPI1-TST'
  workspace: # Added
    clean: all # Added
© www.soinside.com 2019 - 2024. All rights reserved.