我使用PowerShell
编写所有任务扩展,现在我开始将我的第一个扩展翻译成TypeScript
。该扩展是一个小任务,应在构建或发布管道中运行。该任务应部署到Azure DevOps Server 2020.1(本地)。
准备工作
教程
- 我按照创建自定义管道任务的教程,并用它构建了一个示例应用程序
- 我克隆了ansible任务扩展并检查了编程风格
系统设置
- 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
问题
运行时,当执行带有必需参数true
的tl.getInput
函数时,调试立即停止,没有任何响应(无错误,无输出)。
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
未传递给应用程序。
问题
- 有没有一种方法来调试Azure DevOps任务扩展?
- 是否可以通过
tl.getInput
传递参数并加载它们? - 是否有现成的技术或完整的指南来开发Azure DevOps任务扩展?
很明显,在没有Azure DevOps环境的情况下运行azure-pipelines-task-lib
会遇到问题。但我希望能够模拟所需的管道变量并在本地运行此库。 如果使用azure-pipelines-task-lib
意味着您必须部署扩展并在管道中运行它以进行测试,则使用它开发任务会变得复杂,对吗?
编辑1:
我找到了关于vsts-task-lib的弃用存储库。在azure-pipelines-tasks/docs/debugging.md
中,有关于调试该库的手册。在VS Code中调试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")
会返回;
。