azure-devops - 在 Azure DevOps 管道中的何处存储构建项目?
问题描述
我的 Azure DevOps 中有一个简单的管道,它在我的应用程序服务器上使用私有代理。因此,当我想部署应用程序时,我可以将构建工件复制到正确的目录中。
管道分为三个步骤:
- 建造
- 部署到登台
- 部署到产品
第二步总是在构建过程之后直接执行。然而,第三步(部署到 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
解决方案
同意 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
推荐阅读
- c - 野牛说开始符号不派生任何句子
- php - 我从头开始的第一个 WordPress 主题。在 functions.php 文件中加入样式表
- php - 将基本 php 更改为 if 语句 php
- javascript - 如何操作 socket.io 数据,可能是通过代理,或者作为中间件?
- sql - 在 AppMaker 中使用计算模型连接两个大表
- c# - ASP.Net Core MVC/API/SignalR - 更改身份验证方案(Cookie 和 JWT)
- jquery - 去抖错误,“TypeError:$.debounce 不是函数”
- typescript - 如何修复`没有'new'就不能调用类构造函数LitElement`?
- database - 无法使用 go_client 放置 GridDB 容器
- javascript - Puppeteer 转到不同的页面