我正在尝试部署我的节点。使用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'
我如何在阶段之间共享我的工件?如果我将所有步骤都放在同一个作业中,那么同样的管道也可以工作。但我想把它们分开。
正如回答和一些评论中提到的,现在可以下载以前发布的工件。
在下面的代码中,我将发布脚本
文件夹作为名为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边界的文件。管道构件现在也可以用于跨阶段共享文件。