我们看到一个奇怪的问题,
yarn
块中的任何script
命令都会在yarn命令之后终止该脚本块。
steps:
- script: |
echo "*********1*********"
cd D:\my\src
echo "*********2*********"
yarn add --dev jest-junit
echo "*********3*********"
yarn test:unit --silent --ci --reporters=jest-junit
echo "*********4*********"
将产生以下输出:
"*********1*********"
"*********2*********"
yarn add v1.16.0
[1/4] Resolving packages...
...
Done in 107.91s.
Finishing: CmdLine
所以我们永远无法到达
echo "*********3*********"
即使是像这样简单的事情:
- script: |
echo "Start"
yarn -v
echo "We never get here"
似乎 Cmdline 任务在第一个纱线任务之后就停止了。
这是在本地 Windows Server 2016 上运行的。如果我们在 ubuntu 虚拟机上运行相同的脚本,它可以正常工作。
问题是
yarn
不是可执行文件,它是批处理文件。
根据文档,调用批处理文件时应该使用
call
:
Azure Pipelines 将内联脚本内容放入临时批处理文件 (.cmd) 中以便运行它。当您想在 Windows CMD 中从另一个批处理文件运行一个批处理文件时,必须使用 call 命令,否则第一个批处理文件将终止。这将导致 Azure Pipelines 运行预期的脚本,直到第一个批处理文件,然后运行该批处理文件,然后结束该步骤。第一个脚本中的其他行将不会运行。在 Azure Pipelines 脚本步骤中执行批处理文件之前,您应该始终预先调用。
所以在你的情况下,
yarn ...
应该改为call yarn ...
我刚刚遇到了同样的问题。在我的 Azure Pipeline yml 中,我有以下内容:
- task: CmdLine@2
displayName: 'Install and Build'
inputs:
script: |
yarn install
yarn build
使用 Linux 代理运行我的项目时效果很好。但在 Windows 代理上运行相同的操作,它只会执行纱线安装并跳过纱线构建。