在Jenkins管道库中查找未使用的端口

时间:2017-10-23 06:52:41

标签: jenkins groovy jenkins-pipeline

我目前正在努力改进我的Jenkins Pipeline,它启动了一个带有暴露端口的docker容器。但是由于Jenkins实例被很多人及其项目大量使用,我遇到了问题,暴露的端口映射已经在使用中。

我的想法是确定主机上未使用的端口,以避免此问题。为了做到这一点,我想扩展我们的Jenkins共享库,使用一种简单的方法来检查并返回主机系统中第一个未使用的端口。

有谁知道如何实现这个目标?

我目前的解决方案是利用一个以某种方式使用netstat工具的shell函数。

文件:getRandomFreePort.groovy

def call() {
sh '''
    #!/bin/bash
    while
    [[!-z $CHECK]]; do
    PORT = $(((RANDOM % 60000) + 1025))
    CHECK = $(sudo netstat - ap | grep $PORT)
    done

    echo $PORT
'''
}

3 个答案:

答案 0 :(得分:3)

使用ServerSocket,您可以使用以下命令获取未使用的端口:

try {
    def serverSocket = new ServerSocket(0);
    System.out.println("listening on port: " + serverSocket.getLocalPort());
    //Do anything
    serverSocket.close()
} catch (IOException ex) {
    System.err.println("no available ports");
}

如果您需要在某个范围内找到可用端口,请查看以下帖子:How to find an available port in a range?

答案 1 :(得分:0)

简单的单线:

def port = new ServerSocket(0).withCloseable { socket -> socket.getLocalPort() }

创建绑定到0的套接字会分配一个任意的空闲端口。

请注意,如果启用了安全性,则需要script approval

答案 2 :(得分:0)

我花了很多时间寻找未经批准而做的可能性。 并使用Groovy内的Python找到了它。

String port = sh(script: 'echo $(python -c \'import socket; s=socket.socket(); s.bind(("", 0)); print(s.getsockname()[1]); s.close()\');', returnStdout: true)

该解决方案看起来不是很干净,但是效果很好。

相关问题