我正在尝试将 Azure DevOps 设置为 在消息不以给定文本开头时跳过多阶段管道上的一个阶段。
从示例文档来看,我认为这只是
- stage: t1
condition: not(startsWith(variables['Build.SourceVersionMessage'], '[maven-release-plugin]'))
jobs:
- job: ReleasePrepare
displayName: Prepare release
pool:
vmImage: 'ubuntu-16.04'
steps:
- script: |
env | sort
Run Code Online (Sandbox Code Playgroud)
然而,无论如何,这都会被执行。t1这是我希望任务不会根据提交消息运行的示例https://dev.azure.com/trajano/experiments/_build/results?buildId=110&view=results
的输出env表明消息已正确传入
以防万一这是一个错误,我也在这里报告了https://developercommunity.visualstudio.com/content/problem/697290/startswith-buildsourceversionmessage-variable-not.html
到目前为止,我正在使用Azure DevOps REST Api从 Azure DevOps 中的版本获取数据以用于报告目的。显然,这将随着使用 CI/CD --> YAML 和多阶段管道(当前预览)的新方式而改变。在这种情况下,构建和发布策略已被弃用,所有内容都被定义为管道并细分为各个阶段(构建阶段、部署阶段 1、部署阶段 2,...)。我尝试通过构建列表方法
接收数据,但这些数据是有限的,并且我缺少一些重要信息,例如“阶段是否成功”。
有人已经有 YAML Pipelines 和 Azure DevOps REST Api 组合的经验吗?有没有办法获取完整数据(与经典发布策略一样)?还是目前正在开发中,我必须要有耐心?
提前致谢!
我有一个pipeline.yaml看起来像这样的
pool:
vmImage: image
stages:
-stage: A
jobs:
-job: a
steps:
- script: |
echo "This is stage build"
echo "##vso[task.setvariable variable=doThing;isOutput=true]Yes"
name: BuildStageRun
-stage: B
jobs:
-job: b
steps: #do something in steps
-job: c
dependsOn: a
condition: eq(dependencies.build.outputs['BuildStageRun.doThing'], 'Yes')
steps:
- script: echo "I am scripting"
Run Code Online (Sandbox Code Playgroud)
因此,有 2 个阶段,A有一项工作a,B有 2 个工作b和c。我希望仅在作业a执行后才执行作业c 。我尝试通过将作业a中的变量doThing设置为 Yes,然后在作业c中检查此变量来实现此目的。
但我收到一个错误:
阶段计划作业c取决于未知作业 …
conditional-statements azure-devops azure-pipelines multistage-pipeline
我试图弄清楚如何使用 yaml 管道将应用程序部署到多网络节点环境。
我正在尝试创建一个具有 2 个阶段的管道。阶段 1 将构建项目,阶段 2 将其部署到暂存环境。这个登台环境(目前)有 2 个网络节点。我不想对要部署到我的管道中的实际机器进行硬编码。所以我想我会添加一个变量组,其中包含一个包含要部署到的 Web 节点的变量,并使用“每个”语句为每个节点生成一个作业。
但是,由于以下几个原因,这不起作用:
所以我的问题是,其他人如何解决这个问题?我想在中心位置定义要部署的服务器,而不是在我的管道定义中。
我最初的尝试印在下面。这不起作用,但它确实描述了我想要完成的工作。
主要 yaml:
variables:
- group: LicenseServerVariables #this contains StagingWebNodes variable
stages:
- stage: Build
displayName: Build
<some build steps>
- stage: DeployTest
displayName: Deploy on test
condition: and(succeeded(), eq(variables['DeployToTest'], 'true'))
jobs:
- template: Templates\Deploy.yaml
parameters:
nodes: $(StagingWebNodes)
Run Code Online (Sandbox Code Playgroud)
部署.yaml:
parameters:
nodes: []
jobs:
- ${{ each node in parameters.nodes }}:
- job: ${{ node }}
displayname: deploy to ${{ node }}
pool: …Run Code Online (Sandbox Code Playgroud) 我有一个非常基本的 YAML azure 管道
jobs:
- job: Foo
steps:
- bash: |
echo "Create variable xyz"
echo "##vso[task.setvariable variable=xyz;]yes"
displayName: 'Determine slot name'
- bash: |
echo "Var is: $(xyz)"
displayName: 'Show variable'
- job: Bar
dependsOn: Foo
steps:
- bash: |
echo "Hello world $(Foo.xyz)"
displayName: 'Show variable'
Run Code Online (Sandbox Code Playgroud)
在第一个名为 的作业中Foo,变量xyz设置为yes。这是可行的,因为我可以用以下行在几秒钟内显示它
echo "Var is: $(xyz)"
Run Code Online (Sandbox Code Playgroud)
但是,我想在下一个作业(名为Bar)中使用该变量。但无论我做什么,它都不存在。我尝试过类似的事情
echo "Hello world $(xyz)"
Run Code Online (Sandbox Code Playgroud)
或者
echo "Hello world $(Foo.xyz)"
Run Code Online (Sandbox Code Playgroud)
但当我运行管道时,两者都会出现以下错误
line 1: Foo.xyz: command not found …Run Code Online (Sandbox Code Playgroud) 我正在尝试将现有的 ASP.NET MVC Web 应用程序从 TeamCity 转移到 Azure DevOps,但是我似乎无法让我的管道找到它从 NuGet 包还原任务还原的包。
该解决方案有多个项目,并且它们使用了大量 NuGet 包。我创建了一个多步骤管道,目前有一个 NuGet 还原任务和一个 VS 构建任务。
解决方案结构是这样的:
\source
..\SolutionFolder
...Solution.sln
..\..\Project1
....Project1.csproj
..\..\Project2
....Project2.csproj
..\..\Packages
azure-pipelines.yaml
NuGet.config
Run Code Online (Sandbox Code Playgroud)
管道 YAML 如下所示:
trigger:
- PipelineBranch
pool:
vmImage: 'windows-latest'
stages:
## NuGet Restore ##
- stage: nuget_restore
displayName: 'Restore nuget packages'
jobs:
- job: nuget_package_restore
steps:
- task: NuGetCommand@2
displayName: 'NuGet restore'
inputs:
command: 'restore'
restoreSolution: 'source/SolutionFolder/Solution.sln'
feedsToUse: 'config'
nugetConfigPath: 'NuGet.Config'
restoreDirectory: '$(Build.SourcesDirectory)\source\SolutionFolder\packages'
## Build ##
- stage: build_for_int
displayName: 'Build …Run Code Online (Sandbox Code Playgroud) msbuild-task nuget-package-restore azure-devops azure-pipelines multistage-pipeline
两个作业是否可以在多阶段管道构建中共享文件?Publishstage有dotnet publishjob(单任务)和publish artifactsjob(单任务)。但是, 的输出dotnet publish似乎不可用于publish artifacts.
我有一个 Azure 多阶段 CI/CD 管道。它具有测试和 UAT 部署阶段。
我希望 UAT 版本在测试成功或被跳过时运行,但如果失败则不运行。
我不能。无论我尝试什么,如果跳过测试,也会跳过 UAT。除非我使用always(),否则即使测试失败,UAT 也会运行。
...
- stage: Test
condition: and(succeeded(), ne(variables['build.sourceBranchName'], 'DoUAT')) # Skip for UAT deployment tests
...
- stage: UAT
condition: and(succeeded(), in(variables['build.sourceBranchName'], 'master', 'DoUAT')) # Only deploy off master branch and branch to test UAT deploys.
...
Run Code Online (Sandbox Code Playgroud)
如何跳过一个阶段而不是下一个阶段?
continuous-integration continuous-deployment azure-devops multistage-pipeline
我正在开发 azure devops 多阶段 yaml 管道。我在第一阶段设置了一个变量,然后对于下一阶段,我有一个基于该变量的条件。我还在下一阶段检索变量值。显然,在条件级别和阶段级别访问阶段间变量的语法之间存在细微差别。我无法弄清楚我需要在条件中使用的语法。我已经尝试了所有可能的变化,但似乎没有一个有效。在下面的示例中,我期望 lint 阶段能够运行,但它会被跳过。这里的条件的确切语法应该是什么?
stages:
- stage: build
displayName: build
pool:
name: Azure Pipelines
vmImage: ubuntu-latest
dependsOn: []
jobs:
- deployment: build_job
environment:
name: "test"
strategy:
runOnce:
deploy:
steps:
- task: PowerShell@2
displayName: "get commitMessage variable"
name: getCommitMessage
inputs:
targetType: inline
pwsh: true
script: |
$commitMessage = "abcd_import/"
echo "setting commitMessage: $commitMessage"
echo "##vso[task.setvariable variable=commitMessage;isOutput=true]$commitMessage"
- stage: lint
displayName: lint
dependsOn:
- 'build'
condition: contains(stageDependencies.build.build_job.outputs['build_job.getCommitMessage.commitMessage'], 'import/')
pool:
name: Azure Pipelines
vmImage: ubuntu-latest
variables:
- name: BUILD_STAGE_GET_COMMIT_MESSAGE …Run Code Online (Sandbox Code Playgroud)