首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >调试Azure DevOps任务扩展(TypeScript)

调试Azure DevOps任务扩展(TypeScript)
EN

Stack Overflow用户
提问于 2021-01-07 13:07:02
回答 2查看 1.7K关注 0票数 3

我用PowerShell开发了所有的任务扩展,现在我开始将我的第一个扩展转换成TypeScript。扩展是一个小任务,应该在构建或释放管道中运行。该任务应该部署到Azure DevOps Server 2020.1 (on prem)中。

准备工作

教程

系统设置

代码语言:javascript
运行
复制
- Visual Studio Code
- Node (v14.15.4)
- TypeScript (Version 4.1.3)
- ts-node (v9.1.1)
- mocha (8.2.0)
- ts-mocha (8.0.0)
- azure-pipelines-task-lib (2.12.0)

Launch.json

代码语言:javascript
运行
复制
{
  "version": "0.2.0",
  "configurations": [
    {
      "args": ["task/index.ts", "--Template", "Custom"],
      "internalConsoleOptions": "openOnSessionStart",
      "name": "Run TypeScript",
      "request": "launch",
      "runtimeArgs": ["--nolazy", "-r", "ts-node/register/transpile-only"],
      "skipFiles": ["<node_internals>/**"],
      "type": "pwa-node"
    }
  ]
}

启动命令:node.exe --nolazy -r ts-node/register/transpile-only task/index.ts --Template Custom

问题

在运行时,当执行带有所需tl.getInputtrue函数时,调试立即停止,没有任何响应(没有错误,没有输出)。

App.ts

代码语言:javascript
运行
复制
import tl = require("azure-pipelines-task-lib/task");
export const App = {
  Param: {
      Test: "Here",
      Template: tl.getInput("Template", true),
  }
}

Index.ts (入境点):

代码语言:javascript
运行
复制
import { App } from "./app";

function run() {
  console.log("Hello");
  console.log(App.Param.Test);
}

run();

输出(仅为零):

代码语言:javascript
运行
复制

Index.ts (修改):

代码语言:javascript
运行
复制
import { App } from "./app";

function run() {
  console.log("Hello");
  // console.log(App.Param.Test);
}

run();

产出(修改):

代码语言:javascript
运行
复制
Hello

显然,它停止了,因为所需的变量Template没有传递给应用程序。

问题

  • 是否有一种方法来调试azure任务扩展?
  • 是否可以通过tl.getInput传递参数并加载它们?
  • 是否有一个最先进的或完整的指导方针,如何开发天蓝色开发任务扩展?

显然,在不使用Azure azure-pipelines-task-lib环境的情况下运行会遇到问题。但是我希望能够模拟所需的管道变量并在本地运行这个库。如果使用azure-pipelines-task-lib意味着您必须部署扩展并在管道中运行它来进行测试,那么它就会得到某种komplex来开发任务,或者?

编辑1:

我找到了关于vsts任务库的废弃存储库。在azure-pipelines-tasks/docs/debugging.md中,手动调试该库。在VS代码中调试TypeScript任务的作者描述了一个launch.json配置示例,并对其进行了修改:

代码语言:javascript
运行
复制
{
      "name": "Launch tar.gz",
      "type": "node",
      "request": "launch",
      "program": "${workspaceFolder}/dist/task/index.js",
      "stopOnEntry": false,
      "args": [],
      "cwd": "${workspaceRoot}/task",
      "preLaunchTask": "tsc: build - tsconfig.json",
      "runtimeExecutable": null,
      "runtimeArgs": ["--nolazy"],
      "env": {
        "NODE_ENV": "development",
        "INPUT_Separator": ";",
        "BUILD_SOURCESDIRECTORY": "C:\\agents\\latest\\_work\\21\\s"
      },
      "sourceMaps": true,
      "outFiles": ["${workspaceRoot}/dist"]
    }

我可以确认,启动调试是可能的,tl.getInput("Separator")将返回;

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-08 07:54:05

在VS代码中调试TypeScript任务的帮助下,我能够完成以下工作:

  • tl.getInputimport tl = require("azure-pipelines-task-lib/task")读取输入参数
  • tl.getVariableimport tl = require("azure-pipelines-task-lib/task")读取环境变量
  • new azdev.WebApiimport * as azdev from "azure-devops-node-api"连接到Azure import * as azdev from "azure-devops-node-api"服务器
  • 使用getBuildApiimport * as ba from "azure-devops-node-api/BuildApi"发出一个build请求
  • 直接使用TypeScript运行和调试应用程序,而不需要JavaScript转换

launch.json

代码语言:javascript
运行
复制
{
  "name": "Run TypeScript",
  "type": "pwa-node",
  "request": "launch",
  "internalConsoleOptions": "openOnSessionStart",
  "stopOnEntry": false,
  // path to your ts file
  "args": ["index.ts"],
  "cwd": "${workspaceRoot}/task",
  "runtimeArgs": ["--nolazy", "-r", "ts-node/register/transpile-only"],
  "env": {
    "NODE_ENV": "development",
    // param (enter your input params here!)
    "INPUT_WebhookUrl": "MyVariables",
    "INPUT_Template": "Empty",
    "INPUT_Json": "{\"text\":\"I am a test message\",\"attachments\":[{\"text\":\"And here’s an attachment!\"}]}",
    "INPUT_Separator": ";",
    // env
    "AGENT_JOBSTATUS": "Succeeded",
    "AGENT_NAME": "MyAgent",
    "BUILD_BUILDID": "5",
    "BUILD_BUILDNUMBER": "20210108.1",
    "BUILD_REASON": "Scheduled",
    "BUILD_REPOSITORY_NAME": "MyRepo",
    "BUILD_SOURCEBRANCHNAME": "master",
    "BUILD_SOURCEVERSION": "122a24f",
    "BUILDCONFIGURATION": "Debug",
    "BUILDPLATFORM": "Any CPU",
    "SYSTEM_ACCESSTOKEN": "",
    "SYSTEM_DEFINITIONNAME": "MyDefinitionName",
    "SYSTEM_TEAMFOUNDATIONSERVERURI": "https://myurl.de/mycollection/",
    "SYSTEM_TEAMPROJECT": "PSItraffic",
    // debug
    "DEBUG_PAT": "my debug pat"
  },
  "skipFiles": ["<node_internals>/**"]
}

使用酶

app.ts 读取param & env:

代码语言:javascript
运行
复制
import tl = require("azure-pipelines-task-lib/task");

export const App = {
  // ------------------------------------------------------------ param
  Param: {
    WebhookUrl: tl.getDelimitedInput("WebhookUrl", "\n", true),
    Template: tl.getInput("Template", true)
  },
  // ------------------------------------------------------------ env
  Env: {
    Agent: {
      Jobstatus: getVariable("AGENT_JOBSTATUS"),
      Name: getVariable("AGENT_NAME"),
    },

    ...

    System: {
      AccessToken: getVariable("SYSTEM_ACCESSTOKEN"),
      DefinitionName: getVariable("SYSTEM_DEFINITIONNAME"),
      TeamFoundationServerUri: getVariable("SYSTEM_TEAMFOUNDATIONSERVERURI"),
      TeamProject: getVariable("SYSTEM_TEAMPROJECT"),
    },
  // ------------------------------------------------------------ debug
  Debug: {
    Pat: getVariable("DEBUG_PAT"),
  },
}

function getVariable(name: string): string {
  // get variable
  let v = tl.getVariable(name);
  if (v === undefined) return "";
  return v;
}

连接到蔚蓝rest.ts服务器的

代码语言:javascript
运行
复制
import { App } from "./app";
import * as azdev from "azure-devops-node-api";
import * as ba from "azure-devops-node-api/BuildApi";


export class Rest {
  static AuthHanlder: IRequestHandler = Rest.Auth();
  static Connection: azdev.WebApi = new azdev.WebApi(App.Env.System.TeamFoundationServerUri, Rest.AuthHanlder);

  static Auth(): IRequestHandler {
    // auth
    if (App.Env.System.AccessToken === "") return azdev.getPersonalAccessTokenHandler(App.Debug.Pat);
    // no sure if this works on production
    return azdev.getBearerHandler(App.Env.System.AccessToken);
  }
}
票数 1
EN

Stack Overflow用户

发布于 2021-01-08 06:08:09

是否有一种方法来调试azure任务扩展?

是的,根据文章“PowerShell”中的第一步,在安装了所有所需的库和依赖项并添加了所有所需的任务实现文件之后,您可以使用添加自定义管道任务扩展或其他shell进行编译并运行任务。默认情况下,任务是以调试模式运行的。参见下面我分享的例子。

是否可以通过tl.getInput传递参数并加载它们?

当然,您可以将tl.getInput的值作为参数传递。参见下面我分享的例子。

是否有一个最先进的或完整的指导方针,如何开发天蓝色开发任务扩展?

目前,有关DevOps扩展的Microsoft是我们开发DevOps扩展的最佳指南。

按照您的情况,我也会在我这边进行测试,下面是我使用的主要源代码:

  • task.json
代码语言:javascript
运行
复制
{
    "$schema": "https://raw.githubusercontent.com/Microsoft/azure-pipelines-task-lib/master/tasks.schema.json",
    "id": "dc7322d8-6c98-4be7-91c9-dcbf7f4df7dd",
    "name": "buildAndReleaseTask",
    "friendlyName": "Build and Release task",
    "description": "Test create a Build and Release task.",
    "helpMarkDown": "",
    "category": "Utility",
    "author": "Bright Ran",
    "version": {
        "Major": 0,
        "Minor": 1,
        "Patch": 0
    },
    "instanceNameFormat": "Echo $(UserName)",
    "inputs": [
        {
            "name": "UserName",
            "type": "string",
            "label": "User name",
            "defaultValue": "",
            "required": true,
            "helpMarkDown": "An user name"
        }
    ],
    "execution": {
        "Node10": {
            "target": "index.js"
        }
    }
}
  • App.ts (几乎和你的一样)
代码语言:javascript
运行
复制
import tl = require("azure-pipelines-task-lib/task");
export const App = {
  Param: {
      Here: "Here",
      UserName: tl.getInput("UserName", true),
  }
}
  • index.ts (几乎和你的一样)
代码语言:javascript
运行
复制
import { App } from "./App";

function run() {
  console.log("Hello,", App.Param.UserName);
  console.log("Look", App.Param.Here);
}

run();
  • 结果编译并运行该任务。
代码语言:javascript
运行
复制
tsc
$env:INPUT_USERNAME="xxxx"
node index.js

从结果中可以看到,这两个参数可以正常传递。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65612951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档