如何在Azure DevOps的YAML阶段之间共享文件

时间:2019-04-15 17:35:15

标签: azure-devops azure-pipelines azure-pipelines-build-task

我正在尝试使用Azure DevOps将node.js代码部署到Azure Function App。 我已经使用YAML创建了以下Azure DevOps管道。

我面临的问题是在部署步骤中,我的管道失败,因为它无法找到package。当我查看日志时,我相信在作业/阶段之间的清理活动期间,将清理文件夹。我尝试使用其他预定义变量,例如Build.ArtifactStagingDirectory,但没有一个有效。

trigger:
  - master

variables:
  azureServiceConnection: 'mySvcCon'
  azureFuncApp: myFApp

stages:
  - stage: Build_1
    displayName: 'Build Stage'
    jobs:
      - job: build
        displayName: 'Build Node.js app'
        pool:
          vmImage: 'Ubuntu-16.04'

        steps:
          - task: NodeTool@0
            displayName: 'Install Node.js'
            inputs:
              versionSpec: '8.x'

          - script: |
              npm install
            displayName: 'npm install and build'

          - task: CopyFiles@2
            displayName: 'Copy necessary files'
            inputs:
              SourceFolder: '$(System.DefaultWorkingDirectory)'
              Contents: |
                **/*
                !.vscode/**/*
              TargetFolder: '$(System.DefaultWorkingDirectory)/copied'

          - task: PublishBuildArtifacts@1
            displayName: 'Publish artifact'
            enabled: true
            inputs:
              PathtoPublish: '$(Build.ArtifactStagingDirectory)/copied'
              publishLocation: filePath
              targetPath: '$(System.DefaultWorkingDirectory)/publish'

  - stage: Deploy_2
    displayName: 'Deploy Stage'
    jobs:
      - job: Deploy
        displayName: 'Deploy to Function App'
        pool:
          vmImage: 'Ubuntu-16.04'

        steps:
          - task: AzureRMWebAppDeployment@4
            displayName: 'AzureRM Function App deploy'
            inputs:
              ConnectionType: 'AzureRM'
              ConnectedServiceName: $(azureServiceConnection)
              WebAppKind: 'Function App'
              WebAppName: $(azureFuncApp)
              Package: '$(System.DefaultWorkingDirectory)/publish'

如何在各个阶段之间共享我的工件?如果我将所有步骤都放在同一工作中,则同一管道可以工作。但是我想把它们分开。

2 个答案:

答案 0 :(得分:3)

如答案和一些评论中所述,现在可以下载以前发布的工件。

在下面的代码中,我将Optional.ofNullable(getSentDate()) .filter(sentDate -> sentDate.getFrom() != null) .filter(sentDate -> sentDate.getTo() != null) .ifPresent(date -> nested.put(...)); 文件夹作为名为scripts的工件发布,该文件夹位于解决方案的根目录下。这样,我可以在管道的后期使用该文件夹中包含的脚本。在另一个阶段,我下载了dropScripts工件,然后运行了一个Powershell脚本(dropScripts),该脚本包含在script20.ps1文件夹中。

scripts

答案 1 :(得分:2)

通常-创建工件通常是通过 Build Pipeline 完成的,而部署工件是在 Release Pipeline 中完成的>。绝对有机会根据您的用法在单个构建管道中执行这两项操作。当您刚开始使用 Azure Pipelines 时,结合起来特别有意义,因为生态系统可能会因可用功能的数量而淹没。有here

如果部署首次失败,则分隔管道确实可以为您带来重试部署的好处-这实际上取决于您的构建时间有多快。如果要手动触发环境或环形释放传播,则也更容易支持跨环境部署相同的位。分隔构建/部署publicized work on merging the release capabilities into the build capabilities to simplify onboarding的列表。

对于您的工作方式,您可以grows exponentially once you dig into some of the power-user features of release stages

构建管道-依赖关系链接

jobs:
- job: InitialA
  steps:
  - script: echo hello from initial A
- job: InitialB
  steps:
  - script: echo hello from initial B
- job: Subsequent
  dependsOn:
  - InitialA
  - InitialB
  steps:
  - script: echo hello from subsequent