我用PowerShell
开发了所有的任务扩展,现在我开始将我的第一个扩展转换成TypeScript
。扩展是一个小任务,应该在构建或释放管道中运行。该任务应该部署到Azure DevOps Server 2020.1 (on prem)中。
准备工作
教程
系统设置
- 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
{
"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.getInput
的true
函数时,调试立即停止,没有任何响应(没有错误,没有输出)。
App.ts
import tl = require("azure-pipelines-task-lib/task");
export const App = {
Param: {
Test: "Here",
Template: tl.getInput("Template", true),
}
}
Index.ts
(入境点):
import { App } from "./app";
function run() {
console.log("Hello");
console.log(App.Param.Test);
}
run();
输出(仅为零):
Index.ts
(修改):
import { App } from "./app";
function run() {
console.log("Hello");
// console.log(App.Param.Test);
}
run();
产出(修改):
Hello
显然,它停止了,因为所需的变量Template
没有传递给应用程序。
问题
tl.getInput
传递参数并加载它们?显然,在不使用Azure azure-pipelines-task-lib
环境的情况下运行会遇到问题。但是我希望能够模拟所需的管道变量并在本地运行这个库。如果使用azure-pipelines-task-lib
意味着您必须部署扩展并在管道中运行它来进行测试,那么它就会得到某种komplex来开发任务,或者?
编辑1:
我找到了关于vsts任务库的废弃存储库。在azure-pipelines-tasks/docs/debugging.md
中,手动调试该库。在VS代码中调试TypeScript任务的作者描述了一个launch.json
配置示例,并对其进行了修改:
{
"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")
将返回;
。
发布于 2021-01-08 07:54:05
在在VS代码中调试TypeScript任务的帮助下,我能够完成以下工作:
tl.getInput
从import tl = require("azure-pipelines-task-lib/task")
读取输入参数tl.getVariable
从import tl = require("azure-pipelines-task-lib/task")
读取环境变量new azdev.WebApi
从import * as azdev from "azure-devops-node-api"
连接到Azure import * as azdev from "azure-devops-node-api"
服务器getBuildApi
从import * as ba from "azure-devops-node-api/BuildApi"
发出一个build请求launch.json
{
"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:
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
服务器的:
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);
}
}
发布于 2021-01-08 06:08:09
是否有一种方法来调试azure任务扩展?
是的,根据文章“PowerShell
”中的第一步,在安装了所有所需的库和依赖项并添加了所有所需的任务实现文件之后,您可以使用添加自定义管道任务扩展或其他shell进行编译并运行任务。默认情况下,任务是以调试模式运行的。参见下面我分享的例子。
是否可以通过tl.getInput传递参数并加载它们?
当然,您可以将tl.getInput
的值作为参数传递。参见下面我分享的例子。
是否有一个最先进的或完整的指导方针,如何开发天蓝色开发任务扩展?
目前,有关DevOps扩展的Microsoft是我们开发DevOps扩展的最佳指南。
按照您的情况,我也会在我这边进行测试,下面是我使用的主要源代码:
{
"$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"
}
}
}
import tl = require("azure-pipelines-task-lib/task");
export const App = {
Param: {
Here: "Here",
UserName: tl.getInput("UserName", true),
}
}
import { App } from "./App";
function run() {
console.log("Hello,", App.Param.UserName);
console.log("Look", App.Param.Here);
}
run();
tsc
$env:INPUT_USERNAME="xxxx"
node index.js
从结果中可以看到,这两个参数可以正常传递。
https://stackoverflow.com/questions/65612951
复制相似问题