Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure开发人员操作管道-任务的有条件执行_Azure_Azure Devops_Azure Pipelines - Fatal编程技术网

Azure开发人员操作管道-任务的有条件执行

Azure开发人员操作管道-任务的有条件执行,azure,azure-devops,azure-pipelines,Azure,Azure Devops,Azure Pipelines,我们有一个Azure Pipline,用于部署我们的代码。(与BigData相关) 我们不需要每次都部署的任务很少。只有在某些文件发生更改时,我们才需要这样做。所以我就想跟着 通过git命令检查在上次提交中是否更改了特定文件 如果是,请将特定变量设置为trueelsefalse 现在,对于部署任务,使用自定义条件并检查上述变量的true 问题 我无法执行git命令,因为正在从构建管道复制工件,该管道没有.git目录 我试图克隆git目录,但是,凭据的配置方式使我无法克隆它 有没有别的办法解决

我们有一个Azure Pipline,用于部署我们的代码。(与BigData相关)

我们不需要每次都部署的任务很少。只有在某些文件发生更改时,我们才需要这样做。所以我就想跟着

  • 通过git命令检查在上次提交中是否更改了特定文件
  • 如果是,请将特定变量设置为
    true
    else
    false
  • 现在,对于部署任务,使用
    自定义条件
    并检查上述变量的
    true
问题 我无法执行
git命令
,因为正在从
构建管道
复制工件,该管道没有
.git
目录

我试图克隆git目录,但是,凭据的配置方式使我无法克隆它

有没有别的办法解决这个问题

即,仅当特定文件已更改时,才在发布管道中执行特定任务


您可以将git repo添加为其他工件:

Tl;博士,有很多方法可以把这些缝合在一起
  • 将git repo添加到您的发布管道工件中,如@Shayki所述
  • 使用
    --no checkout
    选项手动将git回购添加到发布管道中
  • 在构建中执行git操作,并在工件中包含一些标志文件
  • 在构建中执行git操作并标记构建(首选)
  • .git
    目录推入工件
  • 将git repo添加到发布管道工件中 将Git存储库作为工件添加到您的发布管道将允许部署代理访问源代码管理(包括代码文件),以便您可以在相关的发布阶段执行查询

    手动将git回购添加到发布管道中 我不认为Azure DevOps UI会让您选择只克隆
    .git
    目录,这会阻止部署代理实际拥有源代码。但是,如果您“允许脚本访问oAuth令牌”,您应该能够使用它通过powershell使用
    git clone--no checkout url
    手动克隆存储库

    在工件中包含一些标志文件 其他方法是在生成工件的构建管道上进行决策,并发布一个带有工件的开关文件,该文件指示发布应该(不)执行预期任务

    标记构建 也许有不同的方法可以做到这一点,但我不知道。如果git中的搜索表明发行版需要做额外的工作,那么可以使用RESTapi来修改构建。不要忘记在构建作业中设置“允许脚本使用oAuth令牌”。然后在发布管道中创建一个
    Full
    Min
    阶段,Full有额外的任务,Min没有

    在这些阶段中,您可以基于构建标记使用工件过滤器特性。


    如果您不想(或不能)使用单独的阶段并使用工件过滤器,您可以通过powershell使用您在问题中提到的自定义条件

    .git
    目录推入工件
    如果您完全想在发布管道上做决定,并且无法从那里访问repo,请将
    .git
    目录从您的构建推送到(一个新的?)工件中,然后在发布管道上使用它。(这看起来像是一个真正的黑客,我不完全确定它会起作用。)

    我找到了两种方法来实现这一点。我使用Powershell,但可以根据您喜欢的口味进行更改

    在构建管道中运行git diff:

    $CSV_FileName = git diff-tree --no-commit-id --name-only $Commit_ID -r | where {$_ -like "*.csv"}
    $Ps1_FileName = git diff-tree --no-commit-id --name-only $Commit_ID -r | where {$_ -like "*.ps1"}
    
    然后运行你的状态

    方法1 添加构建标记,然后将其设置为发布中的阶段条件。我喜欢的舞台控制方法

    构建

    #Set Build Tag
    if ($CSV_FileName) {
     Write-Host "##vso[build.addbuildtag]CSV"
    }
    if ($PS1_FileName) {
     Write-Host "##vso[build.addbuildtag]PS1"
    }
    
    #Update Variable Group
    if ($CSV_FileName) {
     echo $env:AZURE_DEVOPS_EXT_PAT | az devops login
     az devops configure -d organization=https://dev.azure.com/<your_organisation>/ project=<your_project>
    
     az pipelines variable-group variable update --id <id_here> --name <name_here> --value <value_here>
    }
    if ($PS1_FileName) {
     echo $env:AZURE_DEVOPS_EXT_PAT | az devops login
     az devops configure -d organization=https://dev.azure.com/<your_organisation>/ project=<your_project>
    
     az pipelines variable-group variable update --id <id_here> --name <name_here> --value <value_here>
    }
    
    发布

    Stage Artifact Filter: Branch | Include | <TagName>
    
    Task Condition: and(succeeded(), eq(variables['VariableName'], 'Value'))
    

    你是说作为
    发布
    管道中
    任务
    的一部分?这将如何帮助我呢?不是任务的一部分,您希望在发布过程中使用git repo(但您没有成功克隆它),这样您就可以将repo作为工件添加,它将在发布开始时下载,因此添加一个执行3个步骤的任务。请小心使用预期解决方案的“last commit”参数。任何给定的构建都可以有任意数量的提交,我认为您不能只执行一个。您需要使用
    git diff tree--无提交id--仅名称-r$change.id
    其中
    $change
    是当前构建/发布的所有提交的迭代中的当前项。您好,事情进展如何?贝文的回答对你有帮助吗?如果是,您可以接受答案,这样其他用户就可以看到解决方案是否有效。如果您仍然面临一些问题,请随意离开这里:-)方法2似乎正是我所寻找的。然而,在方法1中,我没有得到这个部分
    阶段工件过滤器:分支|包含|
    你能解释一下吗?我刚刚仔细看了Josh的答案,在“标记构建”下有一个屏幕截图