如何跳过jenkinsfile管道中某个代理名称或标签的阶段?

时间:2018-04-12 15:07:50

标签: jenkins label jenkins-pipeline

我在Jenkins中有一些带有不同标签的构建节点,其中一些是常见的:

#node name: labels
m_node1: m u16
m_node2: m u16
p_node1: p u16
p_node2: p u16

在我的Jenkinsfile管道中,我有以下代码段:

agent { node { label 'u16' } }
stage('parallel stuff') {
    parallel {
        stage('Stuff not for p') {
            steps {
                echo "My node name is ${env.NODE_NAME}"
                echo "My node labels are ${env.NODE_LABELS}"
                sh './should_not_run_on_p'
            }
        }
        // ... other stages 
    }
}

如名称所示,我希望

Stuff not for p
仅在m_node1或m_node2是当前构建节点时运行。如果阶段落在p_node1或p_node2上,则应跳过该阶段。为此,我希望能够说:"如果标签' p'不在NODE_LABELS"或者#34;如果节点名称不喜欢' p _ *'"则运行。我尝试了基于jenkins pipeline when documentation

的语法
when { not { ${env.NODE_NAME} "p_**" } }

此操作失败并出现以下错误:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 158: Expected a when condition @ line 158, column 34.
                       when { not { ${env.NODE_NAME} "p_**" } }
                                ^
1 error

以下语法不起作用:

when { not { environment name: 'NODE_NAME', value: 'p_*' } }

我如何最好地解决我的问题?

1 个答案:

答案 0 :(得分:0)

您可以使用已经使用的声明性管道为特定阶段定义特定代理:

pipeline{
    agent none
    stage('parallel stuff') {
        parallel {
            stage('Stuff not for p') {
                agent {label 'm_node1 && m_node2'}
                steps {
                    // steps
                }
            }
           // ... other stages 
         }
     }
}