我正在Jenkins上开发一个声明式管道,其中一个必要条件是它必须同时适用于Windows和Linux。
现在,为了实现这一目标,我正在使用两个阶段,一个用于Linux环境,另一个用于Windows环境,因为可以在下面的代码中看到
stage('Integration Tests on Windows') {
when { expression { env.OS == 'BAT' }}
steps
{
dir('')
{
bat 'gradlew.bat integrationTest'
junit '**/build/test-results/integrationTest/*.xml'
}
}
}
stage('Integration Tests on LINUX') {
when { expression { env.OS == 'UNIX' }}
steps
{
dir('')
{
sh 'gradlew integrationTest'
junit '**/build/test-results/integrationTest/*.xml'
}
}
}
我想知道是否有更好的方法来做到这一点,同时保持管道声明性?
不确定您是否正在使用git。然而,我们更喜欢的方法是在Linux和Windows上使用sh
步骤:
我们通过使用Windows git附带的bash/sh来完成。你只需要确保它(sh
)在路径中(例如,如果你手动安装git,它甚至会要求你将它的命令行工具添加到路径中)。对于Jenkins节点,你可能想把它添加到你的Jenkins节点配置中。
我们使用的一个替代方法是一个包装器函数,你可以在你的Jenkinsfile或Pipeline库中指定它。它可能看起来像这样:
def executeCmd(def args) {
if (isUnix()) {
sh args
} else {
bat args
}
}
请注意,这显然只能处理在Windows和Linux上参数100%相同的情况。
因此我建议在Windows和Linux上使用sh
。
或者,如果你喜欢,你可能想在Linux上使用Powershell,而使用pwsh
步骤。