首页 > 解决方案 > Azure DevOps Extension 获取管道中执行任务的位置

问题描述

我想使用自定义任务扩展(节点)分析发布管道中Ansible任务的日志。一般来说,这没什么大不了的,但我问自己是否有可能在管道中获得执行任务的位置?

用例

用户可以添加一个任务,Ansible如果他愿意,他可以添加我的自定义任务来分析日志(并在某处发布)。要决定Ansible应该分析发布管道中的哪个任务,用户应该直接在任务之后执行自定义Ansible任务。

像这样的东西:

Release Pipeline 1.) Stage:
- Initialize job
- Download artifacts
- CopyFilesOverSSH
- Ansible <--- this should analyzed
- Custom Task 
- Ansible
- Finialize job

塞纳里奥

具有 3 个阶段的发布管道。

问题

当我现在请求Get Release REST 调用时,我可以遍历所有环境、所有作业、所有任务,如下所示:

    let release: Release = await Api.getRelease(Env.System.TeamProject, Env.Release.ReleaseId);

    // loop environments (stages)
    for (let environment of release.environments) {
      // loop deploy steps
      for (let deployStep of environment.deploySteps || []) {
        // loop phases
        for (let releaseDeployPhase of deployStep.releaseDeployPhases || []) {
          // loop jobs
          for (let deploymentJob of releaseDeployPhase.deploymentJobs || []) {
            let ansible: ReleaseTask[] = [];
            // loop tasks
            for (let task of deploymentJob.tasks || []) {
              if (task.startTime && task.finishTime) {
                if (task.name === "Ansible") ansible.push(task);
              }
            }
            console.log(ansible);
          }
        }
      }
    }

在此状态下的运行时,我正在执行的自定义任务尚未完成(TaskStatus.InProgress),因此连同我的任务的 ID,我应该能够检测到管道内的位置。

一些更好的解决方案?

但我希望有一个更好的解决方案,我的意思是任务应该知道它在管道中的哪个位置?也许您可以通过azure-pipelines-task-lib/task lib 获取信息?

就像是:

task.getRank() >>> 3
task.getEnvironment >>> 2

当您可以在任务程序中请求任务名称和 ID 时,还有什么帮助。目前我必须用这些信息创建自己的变量。

像这样的东西:

me.Id() >>> "8bb50e0a-8efb-47a4-b12a-2190f3a4d16a"
me.Name() >>> "MyCustomTask"

标签: azure-devopsazure-devops-extensions

解决方案


我们可以通过 power shell 和 REST API 来分析 Ansible 任务的日志,示例如下:

  $listurl="https://vsrm.dev.azure.com/{Org name}/{Project name}/_apis/release/releases/{Release id}?api-version=6.1-preview.8"
    $PAT="{PAT}"
    $base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($PAT)"))
    $result = Invoke-RestMethod -Uri $listurl -Headers @{Authorization = "Basic {0}" -f $base64AuthInfo} -Method get
    
$result.environments.deploySteps.releaseDeployPhases.deploymentJobs.tasks.name
    
    foreach($deploySteps in $result.environments.deploySteps)
    {
        write-host $deploySteps.releaseDeployPhases.deploymentJobs.tasks.name
        foreach($Task in $deploySteps.releaseDeployPhases.deploymentJobs.tasks){
            if($Task.name -eq "{analyze task display name}")
            {
                #write-host $Task.logUrl
                $TaskLogURL = $Task.logUrl
            }
        }
    }
    #write-host $TaskLogURL
    $TaskLog = Invoke-RestMethod -Uri $TaskLogURL -Headers @{Authorization = "Basic {0}" -f $base64AuthInfo} -Method get
    
    write-host $TaskLog

推荐阅读