首页 > 解决方案 > 在 Azure DevOps 管道中的何处存储构建项目?

问题描述

我的 Azure DevOps 中有一个简单的管道,它在我的应用程序服务器上使用私有代理。因此,当我想部署应用程序时,我可以将构建工件复制到正确的目录中。

管道分为三个步骤:

  1. 建造
  2. 部署到登台
  3. 部署到产品

第二步总是在构建过程之后直接执行。然而,第三步(部署到 prod)在几天后执行,因为此阶段需要批准。

我的问题:如果我将第一步的构建工件留在 $(System.DefaultWorkingDirectory) 目录中的某个位置,是否可以?

实际上它现在正在工作。但是我有点担心有一天我会遇到麻烦,例如下一次管道运行在最后一次完成之前触发,或者我的私人代理从另一项任务中获得新工作。

这是我的简化 yaml:

stages:
  - stage: Build
    displayName: Build stage
    jobs:
      - job: Build_Frontend
        displayName: Build-Frontend
        pool:
          name: $(poolName)
          vmImage: $(vmImageName)
        steps:
          - task: NodeTool@0
            inputs:
              versionSpec: '14.x'
            displayName: 'Install Node.js'
          - script: |
              npm install
            displayName: 'npm install'
            workingDirectory: "smprod/"
          - script: |
              npm run "build Prod"
            displayName: 'npm build'
            workingDirectory: "smprod/"
  - stage: Staging
    displayName: Staging-Stage
    dependsOn: Build
    condition: succeeded()
    jobs:
      - deployment: Deploy
        displayName: Deploy-Staging
        environment: 'smprod-Staging'
        pool:
          name: $(poolName)
        strategy:
          runOnce:
            deploy:
              steps:
                - task: CopyFilesOverSSH@0
                  displayName: 'Copy frontend build to staging target directory'
                  inputs:
                    sshEndpoint: 'smprod-prod'
                    sourceFolder: '$(System.DefaultWorkingDirectory)/smprod/dist/prod'
                    contents: '**'
                    targetFolder: '/smprod/staging/'
                    readyTimeout: '20000'
                    cleanTargetFolder: false
                    overwrite: true
  - stage: Prod
    displayName: Prod-Stage
    dependsOn: Staging
    condition: succeeded()
    jobs:
      - deployment: Deploy
        displayName: Deploy-Prod
        environment: 'smprod-Prod'
        pool:
          name: $(poolName)
        strategy:
          runOnce:
            deploy:
              steps:
                - task: CopyFilesOverSSH@0
                  displayName: 'Copy frontend build to prod target directory'
                  inputs:
                    sshEndpoint: 'smprod-prod'
                    sourceFolder: '$(System.DefaultWorkingDirectory)/smprod/dist/prod'
                    contents: '**'
                    targetFolder: '/smprod/prod/'
                    readyTimeout: '20000'
                    cleanTargetFolder: false
                    overwrite: true

标签: azure-devopsazure-pipelines

解决方案


同意 JSONDerulo。添加一个 Publish Artifacts 任务是一个不错的选择。

根据您的 YAML 示例,暂存步骤在自托管代理上运行并将工件保存到$(System.DefaultWorkingDirectory).

您的示例确实是一个令人困惑的情况(例如,下一个管道运行是在最后一个完成之前触发的。

由于您正在运行相同的管道和相同的代理来复制文件,因此工作区在管道运行之间共享。在这种情况下,最新构建生成的工件将覆盖旧工件。

这会造成混乱。

为了缓解这个问题,我建议您可以添加 Publish Artifacts 任务。

然后每个构建将对应于相应的工件。

您可以使用 Download artifacts 任务来下载目标Download Build Artifacts 任务

另一种方法是您需要标记目标文件夹,使其不会被覆盖。

例如:/smprod/staging-$(build.buildid)/ (buildid 是唯一的)

                - task: CopyFilesOverSSH@0
                  displayName: 'Copy frontend build to staging target directory'
                  inputs:
                    sshEndpoint: 'smprod-prod'
                    sourceFolder: '$(System.DefaultWorkingDirectory)/smprod/dist/prod'
                    contents: '**'
                    targetFolder: '/smprod/staging-$(build.buildid)/'
                    readyTimeout: '20000'
                    cleanTargetFolder: false
                    overwrite: true

推荐阅读