如何限制Jenkins声明式管道作业在相关节点上运行?

时间:2019-10-29 15:47:32

标签: jenkins-pipeline

我有一个声明性的Jenkins管道作业,该作业在三个节点上运行。第一个节点是主节点,因此与我的问题无关。其他两个节点实际上是我有两个代理的同一台机器。这些代理之一(名为“ Win10-E-Admin”)以管理员身份运行,另一个代理(名为“ Win10-E-Normal”)以普通登录用户身份运行。这样一来,我可以执行安装软件包之类的操作,然后以普通用户身份对其进行测试。

因此,问题是:如何强制此管道作业仅在属于同一台计算机的节点上运行?换句话说,我想告诉该作业继续并在任何Win10节点上运行,但是一旦它在特定节点上启动,那么所有* -Admin和* -Normal步骤都需要保留在同一台计算机上? / p>

管道示例:

pipeline {
agent none
stages {
    stage('Kill Edge') {
        agent { label 'rk-Win10-E-Normal' }
        steps {
            bat (script: "taskkill /F /IM MicrosoftEdgeCP.exe > NUL 2>&1", returnStatus: true)
            bat (script: "taskkill /F /IM MicrosoftEdgeCP.exe > NUL 2>&1", returnStatus: true)
            bat (script: "taskkill /F /IM MicrosoftEdgeCP.exe > NUL 2>&1", returnStatus: true)
            bat (script: "taskkill /F /IM MicrosoftEdgeCP.exe > NUL 2>&1", returnStatus: true)
            bat (script: "taskkill /F /IM MicrosoftEdgeCP.exe > NUL 2>&1", returnStatus: true)
            bat (script: "taskkill /F /IM MicrosoftEdge.exe > NUL 2>&1", returnStatus: true)
            bat (script: "taskkill /F /IM MicrosoftEdge.exe > NUL 2>&1", returnStatus: true)
            bat (script: "taskkill /F /IM MicrosoftEdge.exe > NUL 2>&1", returnStatus: true)
            bat (script: "taskkill /F /IM MicrosoftEdge.exe > NUL 2>&1", returnStatus: true)
            bat (script: "taskkill /F /IM MicrosoftEdge.exe > NUL 2>&1", returnStatus: true)
        }    
    }
    stage("Start Timestamp") {
        agent { label 'rk-Win10-E-Admin' }
        steps {
            bat (script: '"C:\\Program Files\\Python37\\python.exe" "Needed files\\Scripts\\CreateStartTimestamp.py"')
        }    
    }
    stage('Activate Edge') {
        agent { label 'rk-Win10-E-Normal' }
        steps {
            bat "start microsoft-edge:http://www.cnn.com"
        }    
    }
    stage('With Edge Running') {
        agent { label 'rk-Win10-E-Admin' }
        steps {
            bat (script: "some_command_that_needs_to_be_run_as_administrator_and_needs_Edge.exe")
        }    
    }
}
}

所以,要解释-您会注意到,我指定了要在(rk-Win10-E)上运行该机器的计算机,以及要使用的代理(-Normal或-Admin)。 我想做的是,不是指定机器,而是想指定(使用标签)在具有Edge和Python的机器上运行。但是据我了解,当詹金斯进入代理行时,它将选择我提供Edge和Python的任何计算机,因此无法保证管道的最后一部分能够正常工作,因为它可能会选择完全不同的计算机在以后运行命令。

然后我的问题是,在第一次代理调用之后,脚本是否有办法找出正在使用的代理,然后使用字符串操作来获取与-Normal节点相对应的-Admin节点的名称。那是最初使用的?

1 个答案:

答案 0 :(得分:0)

因此,这实际上并不难做。我使用脚本调用来设置名称,然后在以后的块中使用这些名称。因此,修改后的管道如下所示:

windowsAdminNode = 'temp'
windowsNormalNode = 'temp'

pipeline {
agent none
stages {
stage('Kill Edge') {
    agent { label 'Win10' && 'Python' }
    steps {
        script {
            windowsNormalNode = NODE_NAME
            windowsAdminNode = windowsNormalNode.minus('-Normal').plus('-Admin')
        }
        bat (script: "taskkill /F /IM MicrosoftEdgeCP.exe > NUL 2>&1", returnStatus: true)
        bat (script: "taskkill /F /IM MicrosoftEdgeCP.exe > NUL 2>&1", returnStatus: true)
        bat (script: "taskkill /F /IM MicrosoftEdgeCP.exe > NUL 2>&1", returnStatus: true)
        bat (script: "taskkill /F /IM MicrosoftEdgeCP.exe > NUL 2>&1", returnStatus: true)
        bat (script: "taskkill /F /IM MicrosoftEdgeCP.exe > NUL 2>&1", returnStatus: true)
        bat (script: "taskkill /F /IM MicrosoftEdge.exe > NUL 2>&1", returnStatus: true)
        bat (script: "taskkill /F /IM MicrosoftEdge.exe > NUL 2>&1", returnStatus: true)
        bat (script: "taskkill /F /IM MicrosoftEdge.exe > NUL 2>&1", returnStatus: true)
        bat (script: "taskkill /F /IM MicrosoftEdge.exe > NUL 2>&1", returnStatus: true)
        bat (script: "taskkill /F /IM MicrosoftEdge.exe > NUL 2>&1", returnStatus: true)
    }    
}
stage("Start Timestamp") {
    agent { node windowsAdminNode }
    steps {
        bat (script: '"C:\\Program Files\\Python37\\python.exe" "Needed files\\Scripts\\CreateStartTimestamp.py"')
    }    
}
stage('Activate Edge') {
    agent { node windowsNormalNode }
    steps {
        bat "start microsoft-edge:http://www.cnn.com"
    }    
}
stage('With Edge Running') {
    agent { node windowsAdminNode }
    steps {
        bat (script: "some_command_that_needs_to_be_run_as_administrator_and_needs_Edge.exe")
    }    
}
}
}