如何确定azure管道中执行YAML管道的当前目录?

问题描述 投票:0回答:1

我们有一个大型的 Azure DevOps monorepo,包含许多应用程序和 YAML 管道。 我们尝试最大限度地提高解决方案的自主性,因此我们在解决方案根目录中的

\Pipelines\
子目录中定义管道。解决方案位于从存储库根开始的不同深度。

每次我们需要从 YAML 引用源文件以将其传递给内置任务(例如 MSBuildDotNetCLINuGet)时,我们将其称为相对于

$(Build.SourcesDirectory)
,这似乎表明回购根目录。例如,要将
my-solution.sln
传递给任务,我们将其称为
$(Build.SourcesDirectory)\path\to\my-solution.sln
。这是可行的,但会使管道和解决方案之间的关系变得不那么原子化,因为它需要显式定义从存储库根到解决方案的完整路径。如果解决方案作为一个整体单元移动(这种情况发生),如果我们不更新 YAML 文件,该单元就会崩溃。这与我们生态系统中的大多数其他实体(在我们的例子中为 .Net)不同,后者通过源位置的相对路径引用其他实体(例如解决方案 --> 项目;项目 --> 引用的项目)。

我的问题:

是否有任何管道变量(或任何其他可访问的变量,例如环境变量)捕获当前执行的 YAML 管道的位置?或者当 Azure 编译管道以供执行时,该信息是否会丢失?

如果没有这样的变量,是否有其他(简单)方法来检索所述位置?我知道我可以查询 Azure DevOps API,但这似乎会增加更多的代码和维护,而不是从长远来看节省。

我看过here,但如果其中任何一个是我想要的,那么我一定错过了。

azure-devops yaml azure-pipelines relative-path
1个回答
0
投票

每次我们需要从 YAML 引用源文件以将其传递给内置任务(例如 MSBuild、DotNetCLI 或 NuGet)时,我们都会将其称为相对于 $(Build.SourcesDirectory) 的文件,这似乎表示存储库根。例如,要将 my-solution.sln 传递给任务,我们将其称为 $(Build.SourcesDirectory)\path o\my-solution.sln。

您仍然可以使用相关路径,不需要使用完整路径。根据文件夹/文件结构,使用

../
父文件夹,使用
./
当前文件夹。例如:

- task: DotNetCoreCLI@2
  displayName: 'dotnet build'
  inputs:
    projects: ../Bank/Bank.csproj    # related path
    arguments: '--configuration $(BuildConfiguration)'

在 DevOps 管道中,您的源代码将被签出到代理计算机,默认情况下它是

$(Build.SourcesDirectory)
,例如指向
c:\agent_work\1\s
。管道任务是使用该文件夹下的文件(源代码)执行的。除非您为某些任务定义
workingDirectory
,否则请检查下面的文档描述:

enter image description here

此外,DevOps 支持“文件匹配模式参考”,您可以指定

**/*.proj
来匹配文件。

希望得到答复。

© www.soinside.com 2019 - 2024. All rights reserved.