提问者:小点点

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


我正在尝试部署我的节点。使用Azure DevOps将js代码添加到Azure函数应用程序。我已经使用YAML创建了以下Azure DevOps管道。

我面临的问题是,在部署步骤中,我的管道失败,因为它无法找到包。当我查看日志时,我相信在作业/阶段之间的清理活动中,文件夹会被清理。我尝试过使用其他预定义变量,如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个答案

匿名用户

正如回答和一些评论中提到的,现在可以下载以前发布的工件。

在下面的代码中,我将发布脚本文件夹作为名为dropScript的工件,它位于我的解决方案的根目录上。这样,我可以在管道的稍后阶段使用该文件夹中包含的脚本。在另一个阶段,我下载dropScript工件,然后运行一个PowerShell脚本(script20.ps1),它包含在脚本文件夹中。

stages:
- stage: 'Build'
  jobs: 
  - job: 'Build'
    pool:
      vmImage: 'ubuntu-16.04'
    steps:

    (...)

    - task: CopyFiles@2
      displayName: 'Copy powershell scripts for later use in the pipeline'
      inputs:
        contents: 'scripts/**'
        targetFolder: '$(Build.ArtifactStagingDirectory)'
    - publish: '$(Build.ArtifactStagingDirectory)/scripts'
      displayName: 'Publish powershell scripts for later use'
      artifact: dropScripts

- stage: DoSomethingWithTheScriptsStage
  dependsOn: Build
  jobs: 
  - job: DoSomethingWithTheScriptsJob
    pool: 
      vmImage: 'windows-2019'
    steps:
      - download: current
        artifact: dropScripts
      - task: PowerShell@2
        inputs:
          filePath: '$(Pipeline.Workspace)\dropScripts\script20.ps1'

匿名用户

一般来说,创建工件通常由构建管道完成,而部署工件则在发布管道中完成。根据您的使用情况,在单个构建管道中执行这两个操作肯定是有机会的。当您刚刚开始使用Azure管道时,组合尤其有意义,因为生态系统可能会因可用功能的数量而无法承受。有一项公开的工作是将发布功能合并到构建功能中,以简化安装。

如果部署第一次失败,分离管道确实会给您带来重试部署的好处——这实际上取决于构建时间有多快。如果您想要手动触发环境或环形发布传播,那么支持跨环境部署相同的位也会更容易。一旦您深入研究了发布阶段的一些高级用户特性,用于分离构建/部署的列表就会呈指数级增长。

对于您的工作方法-您可以利用依赖关系YAML元素来链接后续作业以具有输出依赖关系。

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

Devops最近发布了下载任务,以消耗跨CI/CD边界的文件。管道构件现在也可以用于跨阶段共享文件。