我们使用 dotnet test --no-build 在 PR/CI 构建期间运行单元测试:
- task: DotNetCoreCLI@2
${{ if eq(parameters.shortName, '') }}:
displayName: "Test ${{ parameters.name }}"
${{ if ne(parameters.shortName, '') }}:
displayName: "Test ${{ parameters.shortName }}"
inputs:
command: "test"
projects: ${{ parameters.path }}
${{ if eq(parameters.testFilter, '') }}:
arguments: $(TestBinLogArg) -c $(BuildConfiguration) --no-build ${{ parameters.commonFlags }} ${{ parameters.moreTestArgs }} --filter ${{ parameters.unitTestFilter }}
${{ if ne(parameters.testFilter, '') }}:
arguments: $(TestBinLogArg) -c $(BuildConfiguration) --no-build ${{ parameters.commonFlags }} ${{ parameters.moreTestArgs }} --filter (${{ parameters.unitTestFilter }})&(${{ parameters.testFilter }})
publishTestResults: …Run Code Online (Sandbox Code Playgroud) unit-testing azure-devops azure-pipelines azure-pipelines-yaml
我在尝试在另一个阶段使用在一个阶段中创建的变量时遇到了一些问题,并设法找到了各种新旧文章来描述如何完成此操作。识别新语法的最新文章/帖子
$[stageDependencies.{stageName}.{jobName}.outputs['{stepName}.{variableName}']
像这样使用:
variables:
myVariable: $[stagedependencies.CreateStageVarStage.CreateStageVarJob.outputs['SetValueStep.VariableFromFirstStage']]
Run Code Online (Sandbox Code Playgroud)
在您需要使用作业模板之前,这非常有效。
我在网上找到的示例都没有涵盖模板的情况。他们只是演示了同一个 yaml 文件中的多个阶段如何获取该值。
语法取决于能否将表达式放入变量中。不幸的是,当您在作业中使用模板时,无法声明变量并将其作为参数传递,从而导致其无法求值。
- stage: UseJobTemplateStage
displayName: 'Use Job Template Stage'
dependsOn: CreateStageVarStage
jobs:
- template: templates/job-showstagevars.yml
parameters:
ValueToOutput: $[ stagedependencies.CreateStageVarStage.CreateStageVarJob.outputs['SetValueStep.VariableFromFirstStage'] ]
Run Code Online (Sandbox Code Playgroud)
在这个片段中,它按原样出现。该值不会被替换。
理论上,您可以将作业设置为使表达式存在于变量块中,但这种硬编码破坏了模板的主要优点之一。
在 Azure DevOps Pipelines 中跨阶段共享变量
Azure DevOps 发行说明 - sprint 168
我在尝试在 yaml 文件中使用以下语法分配变量时遇到问题。以下代码取自 Microsoft 文档中定义变量的理解变量语法部分:
variables:
- name: one
value: initialValue
steps:
- script: |
echo ${{ variables.one }} # outputs initialValue
echo $(one)
displayName: First variable pass
- bash: echo '##vso[task.setvariable variable=one]secondValue'
displayName: Set new variable value
- script: |
echo ${{ variables.one }} # outputs initialValue
echo $(one) # outputs secondValue
displayName: Second variable pass
Run Code Online (Sandbox Code Playgroud)
具体来说,我发现问题出在语法注释'##vso[task.setvariable variable=one]secondValue'
:我没有使用直接写入上面一行的字符串,我使用的是 bash 变量,其语法$variableName代替secondValue
问题是:
variables:
- name: one
value: "initialValue"
steps:
- task: Bash@3 …Run Code Online (Sandbox Code Playgroud) trigger:
branches:
include:
- main
paths:
include:
- FPH.IaC/IAC/*
Run Code Online (Sandbox Code Playgroud)
您好,我希望仅当主分支的特定文件夹 (FPH.IaC/IAC/) 下的文件发生更改时才触发我的 yaml 管道。
但是,使用此 yaml,每次在主分支下更改某些文件时都会触发管道。难道branch和Path实际上是OR关系还是我做错了什么?
谢谢
首先 - 我知道根据 MS 官方文档,通过部署控制更新具有发布状态的工作项的内置功能仅在发布管道中受支持,而不是多阶段 YAML 管道(请参阅此处记录的第一个注释:https: // /learn.microsoft.com/en-us/azure/devops/boards/work-items/work-item-deployments-control?view=azure-devops)
是否有人使用 powershell 或 Azure DevOps Rest api 创建插件或集成,可以使用正确的信息更新工作项,以自动将工作项链接到发布环境信息,因为此功能似乎不适用于yaml 发布管道?
azure-devops azure-pipelines azure-pipelines-release-pipeline azure-pipelines-yaml
我有 2 个管道从同一存储库调用代码。1 个管道调用控制台应用程序,另一个管道调用自动化测试。
这两个任务都需要进行相同的env设置。现在我的 yaml 看起来像这样:
- task: DotNetCoreCLI@2
displayName: Run Tests
env:
env.var.1: $(var1)
env.var.2: $(var2)
inputs:
command: 'test'
projects: '$(project)'
publishTestResults: true
Run Code Online (Sandbox Code Playgroud)
- task: CmdLine@2
displayName: Run Console Application
env:
env.var.1: $(var1)
env.var.2: $(var2)
inputs:
workingDirectory: '$(workingDir)'
script: './$(appToRun)'
failOnStderr: true
Run Code Online (Sandbox Code Playgroud)
有什么方法可以使用变量来存储所有环境变量或在运行之前设置它们的任务?我的实际任务有大约20个环境变量需要设置。
我已将我的网站更新为 .net 6。它也可以在本地运行。但是,我在 Azure DevOps 中的 yaml 管道不再运行。像这样的解决方案中的所有 .csproj 文件的发布步骤都存在错误。我不知道如何配置它应该使用.net 6。
C:\Program Files\dotnet\sdk\5.0.403\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.TargetFrameworkInference.targets(141,5): error NETSDK1045: The current .NET SDK does not support targeting .NET 6.0. Either target .NET 5.0 or lower, or use a version of the .NET SDK that supports .NET 6.0. [D:\a\1\s\04_Contracts\Contracts\Contracts.csproj]
##[error]Error: The process 'C:\Program Files\dotnet\dotnet.exe' failed with exit code 1
Run Code Online (Sandbox Code Playgroud)
这是发布的管道步骤。
- task: DotNetCoreCLI@2
displayName: 'dotnet publish'
inputs:
command: publish
publishWebProjects: false
projects: '**/*.csproj'
arguments: '-r linux-x64 --output $(build.artifactstagingdirectory)'
Run Code Online (Sandbox Code Playgroud) 我想要这样的东西:
- ${{ if or(eq(parameters.RunTestsOnPRBuildOnly, false), eq(variables.Build.Reason, 'PullRequest')) }}:
- template: ps-module-run-tests.yml
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为variables.Build.Reason是空的。有可能吗?
请注意,我知道如何修改ps-module-run-tests.yml模板以将我的愿望表达为运行时条件。换句话说,我知道如何实现这一点:
我很好奇的是是否Build.Reason可以在编译时条件下使用,以便这些步骤甚至不会被渲染。从表面上看,这并没有固有的问题,因为该值在开始时就已知,但这取决于模板的编译时间。如果太早的话,那是不可能的,但我不知道这些细节。也许我做不到,因为我错过了一些东西。
那么,有可能吗?
所以我正在设置一个新的构建管道,它非常复杂,它是多阶段的,并且阶段内有多项作业。
但我遇到了问题,因为当我尝试依靠在同一代理工作文件夹中执行的一个阶段的第二个和第三个作业来保存某些任务时。当然,这实际上并不起作用。它实际上有时有效,但有时无效。我希望不同的作业总是在与之前的作业相同的文件夹中运行,或者从不运行,但有时不会。
无论如何,所以我想知道是否有一种方法可以将整个阶段或管道限制到单个工作目录。有人有什么想法吗?谢谢!!!
我尝试根据 Azure Devops 管道中的目标分支运行不同的构建模式,因此我创建了一个变量和一个 if/ese。
根据此MS 文档,看来我做的事情是正确的。我的 IDE 进行语法/错误检查,不会抱怨 YAML。
但是,当我尝试运行构建管道时,我收到“重复键”作为buildScript变量错误。有谁知道解决这个问题的方法吗?或者我只是在 YAML 中做了一些愚蠢的事情?
我的印象是 YAML 中允许重复键。
variables:
slotTarget: 'development'
${{ if eq(variables['Build.SourceBranchName'], 'main') }} :
buildScript: build
${{ else }} :
buildScript: devBuild
jobs:
- job: buildApp
displayName: 'Build the Vue App'
#Set ENV.VARS for Webpack to read and inject during build
- bash: |
echo Running build for $BUILDNUM
BUILDNUMBER=$BUILDNUM npm run $(buildScript)
displayName: 'Create Build - $(build.buildNumber) for GIT $(build.SourceVersion) Trigger: $(build.Reason)'
env: …Run Code Online (Sandbox Code Playgroud) azure-devops ×8
yaml ×2
azure-pipelines-release-pipeline ×1
bash ×1
pipeline ×1
unit-testing ×1