我的问题具体是,我无法在一个步骤中可靠地启动模拟服务器并使其在以下步骤中保持活动状态。服务器关闭或该步骤永远无法完成。
上下文:几天来我一直在努力在 Azure 管道上运行模拟服务器。在本例中,我使用的是 prism 模拟服务器,但同样的问题也适用于任何其他模拟服务器(例如mockoon),我开发了一个简单的 powershell 脚本,该脚本读取 CSV 文件的内容,其中包含端口和路径列。然后我创建了一些 prism 模拟服务器以供以后使用。这是脚本的关键部分
foreach($pathAndPortPair in $pathsPortsDictionary.GetEnumerator()) {
$key = $pathAndPortPair.Name
$value = $pathAndPortPair.Value
if (-Not $value.Contains($rootFolder)) {
$value = Join-Path $rootFolder $value
}
if($IsWindows) {
start-process pwsh.exe -ArgumentList "-noexit -command prism mock -d -p $key $value"
}
if($IsLinux) {
...
}
}
其中 $key 是端口,$value 是 api 规范的路径。 这一切在我的 Windows 机器上运行得非常顺利。但是当我尝试在 Azure 管道上运行脚本时,我遇到了许多问题。具体来说,正如我上面所写,我无法可靠地启动服务器并使其在以下步骤中保持活动状态。
我尝试了以下命令来启动服务器:
Start-Process -FilePath "npx" -ArgumentList "prism mock -d -p $key $value
- 不起作用,显示 npm 错误。
Invoke-Expression "/bin/bash prism mock -d -p $key $value
- 不起作用,bash 脚本错误:
/usr/local/bin/npx: npx: line 3: syntax error near unexpected token
(' /usr/local/bin/npx: npx: 第 3 行: const cli = require('../lib/cli.js')
Start-Job -ScriptBlock { prism mock -d -p $key $value }
- 作业启动...但随后关闭,大概是在服务器启动后。当我运行 Get-Job 命令时,作业状态被标记为“完成”,并且该服务器上没有进一步的操作会产生所需的结果。
Start-Process -FilePath "prism" -ArgumentList "mock -d -p $key $value
- 这实际上启动了服务器,但由于该进程在前台运行,因此该步骤永远不会在天蓝色管道中结束。我还收到一条错误消息:“STDIO 流在进程 '/usr/bin/pwsh' 退出事件发生后 10 秒内未关闭。这可能表明子进程继承了 STDIO 流并且尚未退出。”
start-process pwsh.exe -ArgumentList "-noexit -command prism mock -d -p $key $value"
- 显示消息:An error occurred trying to start process 'pwsh.exe' with working | directory '/home/vsts/work/1/s'. No such file or directory
还有人有其他想法吗?我完全不知所措。如何在后台运行这些服务器,以便管道步骤结束,并开始新的步骤,但服务器不会终止?
我必须承认我放弃了 powershell 并创建了一个简单的 bash 脚本来完成这项工作。关键是使用 nohup 前缀来防止在 Azure 管道上的步骤完成后进程被终止。如果在 powershell 中有类似的方法可以做到这一点,我不知道该怎么做。
无论如何,我会分享在这里,让其他人受益:
#!/bin/bash
# Get root folder of git repo
rootFolder=$(git rev-parse --show-toplevel)
# Set path to csv file and read it
echo "Top-level directory: $rootFolder"
fullPath="$rootFolder/testFiles/csvs/test_csv.csv"
csv_file=$(cat $fullPath)
# Initialize an empty associative array (dictionary)
declare -A port_path_dict
# Split the CSV file into lines
lines=($csv_file)
# Skip the header line
for ((i=1; i<${#lines[@]}; i++)); do
# Split each line into port and path
line="${lines[$i]}"
IFS=',' read -r port path <<< "$line"
# Remove quotes from port and path
port="${port//\"}"
path="${path//\"}"
# Add to the dictionary
port_path_dict["$port"]="$path"
done
# Print the key-value pairs
for port in "${!port_path_dict[@]}"; do
path=${port_path_dict[$port]}
echo "prism mock -d -p $port ${port_path_dict[$port]}"
# Run mock server but disable terminating it after terminal is closed
nohup $(npx prism mock -d -p $port ${port_path_dict[$port]}) >/dev/null 2>&1 &
done