azure-devops - 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 个阶段的发布管道。
- 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"
解决方案
我们可以通过 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
推荐阅读
- python - 我们可以在 django 框架上存储文件吗?
- c# - UWP获取Datagrid的ScrollViewer的垂直偏移量
- c++ - 跨不同名称空间的朋友类不起作用并且名称空间无法识别
- javascript - Javascript 不适用于图标
- flutter - Flutter 谷歌翻译缓存
- azure-cosmosdb - 如何使用 partionkey 在 cosmosdb 中创建项目。?我尝试了下面的代码它不起作用
- php - 更改PHP中复选框的值?
- flutter - 不能再在 Riverpod 中使用 ChangeNotifier?
- python - 将列表应用到 dic
- javascript - Puppeteer:内存泄漏错误和超时处理