Return 来自 Azure 管道中 node.js 脚本的值?

Return a value from node.js script in azure pipeline?

在 Azure Pipelines 中,我看到您可以在管道 运行 期间从 node.js 中的脚本访问环境变量。但是,我实际上想 return 一个值,然后 capture/use 它。

有人知道怎么做吗?我在文档中找不到有关如何执行此操作的任何参考。

为了保持一致性,最好对所有内容都使用节点脚本,而不是在节点和 bash 之间来回切换。

谢谢

好吧,我终于明白了。 Azure 文档在这个主题上有点混乱,但我的方法如下。在这个例子中,我将制作一个相当无意义的简单脚本,它设置一个变量,其值是源分支的名称,但全部小写。

1) 定义变量

定义变量可以很简单地完成(尽管变量的使用方式有很多深度,我建议查阅有关变量创建的 Azure 文档以了解更多信息)。但是,在您的管道 yaml 文件的顶部,您可以这样定义它:

variables
  lowerCaseBranchName: ''

这会创建一个空变量,供您在所有作业中使用。我们将使用此变量作为示例。

2) 创建脚本

从您的脚本“返回一个值”只是意味着通过节点的 stdout 输出它,其输出将被任务消耗以将其设置为管道变量。

要记住的重要一点是,管道中的任何环境变量都可以在节点内使用,它们只是重新格式化并移动到节点的 process.env 全局下。例如,Azure 管道中常用的 Build.SourceBranchName 环境变量可在您的节点脚本中通过其别名 process.env.BUILD_SOURCEBRANCHNAME 访问。这种大写名称转换在所有环境变量中应该是统一的。

这是一个示例 node.js 脚本:

const lowerCaseBranchName = process.env.BUILD_SOURCEBRANCHNAME.toLowerCase();

process.stdout.write(lowerCaseBranchName);

3) 在 azure 管道中使用相关步骤中的输出

要在作业步骤中使用该脚本,请使用脚本任务调用它。请记住,在这种情况下,脚本任务是一个 bash 脚本(尽管您可以使用其他脚本),它在设置变量值时将节点作为命令运行:

- script: |
    echo "##vso[task.setvariable variable=lowerCaseBranchName]$(node path/to/your/script)"
    displayName: 'Get lower case branch name'

分解语法

在我看来,使用变量定义语法非常丑陋,但一旦理解它就非常容易使用。在脚本中设置变量的基本语法如下:

##vso[task.setvariable variable=SOME_VARIABLE_NAME]SOME_VARIABLE_VALUE

上面,SOME_VARIABLE_NAME 是我们变量的名称 (lowerCaseBranchName),正如我们一开始在 Azure 管道配置中定义的那样。同样,SOME_VARIABLE_VALUE 是我们要将该变量设置为的值。

您可以在该行上方添加一行来独立创建一个变量,然后您可以使用该变量来设置 env 变量,但是我选择只内联脚本调用,如您在上面的示例中所见,使用$() 语法。

就是这样。在以下任务中,环境变量 lowerCaseBranchName 可以使用任何变量语法,例如 $(lowerCaseBranchName)

最终结果

在我们的 yaml 文件中定义我们的变量:

variables
  lowerCaseBranchName: ''

我们的 nodejs 脚本:

const lowerCaseBranchName = process.env.BUILD_SOURCEBRANCHNAME.toLowerCase();

process.stdout.write(lowerCaseBranchName);

所述脚本的管道任务implementation/execution:

- script: |
    echo "##vso[task.setvariable variable=lowerCaseBranchName]$(node path/to/your/script)"
    displayName: 'Get lower case branch name'

使用其输出的以下任务:

- script: |
  echo "$(lowerCaseBranchName)"
  displayName: 'Output lower case branch name'

这将在运行时将 lower-cased 分支名称打印到管道控制台。

希望这对某人有所帮助!快乐devops-ing!