强制多分支管道构建的互斥

时间:2018-06-11 18:07:40

标签: jenkins groovy

以下是多分支管道中使用的Jenkinsfile的摘录:

def GetNextFreePort() {
    lock ('portProvider') {
        def port = powershell(returnStdout: true, script: '((Get-NetTCPConnection | Sort-Object -Property LocalPort | Select-Object -Last 1).LocalPort) + 1')
    }

    return port.trim()
}

我想获得端口号(在Windows上)的行为每个分支返回一个不同的端口。但是,尽管使用了可锁定资源插件,但我无法序列化对获取下一个可用端口的powershell标注的访问。

1 个答案:

答案 0 :(得分:0)

最后,我设法通过Jenkins锁资源插件实现了我想做的事情。这是我获取外部端口号并启动容器的方法:

  def StartContainer() {
        PORT_NUMBER = GetNextFreePort()
        bat "docker run -e \"ACCEPT_EULA=Y\" -e \"SA_PASSWORD=P@ssword1\" --name ${CONTAINER_NAME} -d -i -p ${PORT_NUMBER}:1433 microsoft/mssql-server-linux:2017-GA"    
        powershell "While (\$((docker logs ${CONTAINER_NAME} | select-string ready | select-string client).Length) -eq 0) { Start-Sleep -s 1 }"    
    }

这是对此的调用,其中包含对锁的调用:

 stage('start container') {
            steps {
                RemoveContainer()
                timeout(time: 20, unit: 'SECONDS') {
                    lock ('create SQL Server container') {
                        StartContainer()
                    }
                }
            }
        }