我们有一个大型的 Azure DevOps monorepo,包含许多应用程序和 YAML 管道。 我们尝试最大限度地提高解决方案的自主性,因此我们在解决方案根目录中的
\Pipelines\
子目录中定义管道。解决方案位于从存储库根开始的不同深度。
每次我们需要从 YAML 引用源文件以将其传递给内置任务(例如 MSBuild、DotNetCLI 或 NuGet)时,我们将其称为相对于
$(Build.SourcesDirectory)
,这似乎表明回购根目录。例如,要将 my-solution.sln
传递给任务,我们将其称为 $(Build.SourcesDirectory)\path\to\my-solution.sln
。这是可行的,但会使管道和解决方案之间的关系变得不那么原子化,因为它需要显式定义从存储库根到解决方案的完整路径。如果解决方案作为一个整体单元移动(这种情况发生),如果我们不更新 YAML 文件,该单元就会崩溃。这与我们生态系统中的大多数其他实体(在我们的例子中为 .Net)不同,后者通过源位置的相对路径引用其他实体(例如解决方案 --> 项目;项目 --> 引用的项目)。
我的问题:
是否有任何管道变量(或任何其他可访问的变量,例如环境变量)捕获当前执行的 YAML 管道的位置?或者当 Azure 编译管道以供执行时,该信息是否会丢失?
如果没有这样的变量,是否有其他(简单)方法来检索所述位置?我知道我可以查询 Azure DevOps API,但这似乎会增加更多的代码和维护,而不是从长远来看节省。
我看过here,但如果其中任何一个是我想要的,那么我一定错过了。
每次我们需要从 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
,否则请检查下面的文档描述:
此外,DevOps 支持“文件匹配模式参考”,您可以指定
**/*.proj
来匹配文件。
希望得到答复。