【问题标题】:Azure DevOps Extension get position of executing Task in PipelineAzure DevOps 扩展获取管道中执行任务的位置
【发布时间】:2021-01-13 08:14:05
【问题描述】:

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

用例

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

类似这样的:

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

情景

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

  • 1.) 线性舞台
  • 2.) 舞台和 3.) 第二级平行舞台
  • 所有阶段都包含一个 ansible 任务
  • 所有阶段都应包含我的自定义任务扩展以分析 ansible 任务日志

问题

当我现在请求 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-devops azure-devops-extensions


    【解决方案1】:

    我们可以通过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
    

    【讨论】:

    • 嘿 Vito 看起来不错,但老实说,这并不能回答问题(也许我的观点不清楚)。 问题是: 是否有 API 可以在运行时为节点任务扩展获取管道内的位置?是否还有一个 API 可以在运行时(在扩展代码内)获取节点任务扩展的 IDNAME。我已经采用了与您类似的方法,但是否有像 azure-pipelines-task-lib/task 这样的官方 API
    猜你喜欢
    • 2020-08-27
    • 2020-10-05
    • 1970-01-01
    • 2020-09-05
    • 2020-05-28
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多