linux - 使用管道的 Jenkins 奴隶忽略系统定义的限制

标签 linux jenkins jenkins-plugins jenkins-pipeline

我正在尝试运行一个管道作业,该作业在我在亚马逊上动态构建的从机上运行 Scala 测试。

配置一台机器 --> 在配置的机器上构建代码 --> 运行测试

当我的测试开始时,几分钟后我遇到了“打开的文件太多”错误并且我的工作退出了。 我尝试更改从机上的限制,但在我通过 Jenkins 作业运行它时,我所做的一切似乎都被忽略了。

注意:当我从从属机器手动运行相同的命令时,它就像一个魅力,我确实看到限制是为我在系统上定义的 jenkins 用户正确定义的。

我是这样设置的(从机是CentOS 7.2)

作为 root,我更改了/etc/security/limits.conf 文件并添加:

*  hard    nofile     100000
*  soft    nofile     100000
jenkins  hard    nofile     100000
jenkins  soft    nofile     100000

我还确保/etc/security/limits.d/下没有任何内容可以覆盖这些值。 (我最初使用这些值创建了一个/etc/security/limits.d/30-jenkins.conf,但没有帮助)

我已经确定/etc/pam.d/login 有以下行:

session    required   pam_limits.so

重启后,我确保从 jenkins 用户运行“ulimit -a”确实显示了新值。

我创建了一个简单的管道作业:

node('master') {
    stage('master-limits') {
        sh('ulimit -a')
    }
}
node('swarm') {
    stage('slave-limits') {
        sh('ulimit -a')
    }
}

运行时,我得到以下输出:

[Pipeline] stage
[Pipeline] { (master-limits)
[Pipeline] sh
00:00:00.053 [ulimit-test] Running shell script
00:00:00.305 + ulimit -a
00:00:00.306 time(seconds)        unlimited
00:00:00.306 file(blocks)         unlimited
00:00:00.306 data(kbytes)         unlimited
00:00:00.306 stack(kbytes)        8192
00:00:00.306 coredump(blocks)     0
00:00:00.306 memory(kbytes)       unlimited
00:00:00.306 locked memory(kbytes) 64
00:00:00.306 process              64111
00:00:00.306 nofiles              65536
00:00:00.306 vmemory(kbytes)      unlimited
00:00:00.306 locks                unlimited
00:00:00.306 rtprio               0

[Pipeline] stage
[Pipeline] { (slave-limits)
[Pipeline] sh
00:00:00.348 [ulimit-test] Running shell script
00:00:00.606 + ulimit -a
00:00:00.606 time(seconds)        unlimited
00:00:00.606 file(blocks)         unlimited
00:00:00.606 data(kbytes)         unlimited
00:00:00.606 stack(kbytes)        8192
00:00:00.606 coredump(blocks)     0
00:00:00.606 memory(kbytes)       unlimited
00:00:00.606 locked memory(kbytes) 64
00:00:00.606 process              257585
00:00:00.606 nofiles              4096
00:00:00.606 vmemory(kbytes)      unlimited
00:00:00.606 locks                unlimited
00:00:00.606 rtprio               0

从结果中可以看出,即使我已将其更改为 100000,slave 上的限制仍显示为“4096”。

我的 swarm 插件作为服务运行并配置如下:

[Unit]
Description=Jenkins slave daemon
After=network.target

[Service]
User=jenkins
ExecStart=/usr/java/jdk1.8.0_112/bin/java -jar /var/lib/jenkins/swarm-client-3.3.jar -fsroot /var/lib/jenkins -username jenkins@jenkins.com -password * -name swarm -master http://jenkins.com -executors 1 -mode exclusive -labels swarm -disableSslVerification
ExecStop=/usr/bin/killall -w -s 2 java

[Install]
WantedBy=multi-user.target

我正在使用带有 swarm 插件的 Jenkins 2.62 按需设置从站。 我在主从上都使用 JAVA 1.8.0_112。 该问题与基于 Ubuntu 的从站或基于 CentOS 的从站一致。

我错过了什么吗?

最佳答案

在我开始阅读有关 systemd 初始化系统的内容之前,这个问题也一直困扰着我。它似乎遵守您在/etc/security/limits.conf 文件中设置的任何限制

相反,您需要这样编辑 systemd 配置文件:

[Unit]
Description=Jenkins slave daemon
After=network.target

[Service]
User=jenkins
LimitNOFILE=100000
ExecStart=/usr/java/jdk1.8.0_112/bin/java -jar /var/lib/jenkins/swarm-client-3.3.jar -fsroot /var/lib/jenkins -username jenkins@jenkins.com -password * -name swarm -master http://jenkins.com -executors 1 -mode exclusive -labels swarm -disableSslVerification
ExecStop=/usr/bin/killall -w -s 2 java

[Install]
WantedBy=multi-user.target

在这里找到答案:https://serverfault.com/a/678861

关于linux - 使用管道的 Jenkins 奴隶忽略系统定义的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44283799/

相关文章:

jenkins - 如何通过在 jenkins 脚本控制台上编写 groovy 脚本来获取环境变量的值?

git - Jenkins + Git 插件 CheckoutConflictException

Visual Studio 上的 C 或 C++

linux - 当 DNAT 80 端口到树莓派 nginx 时无法访问互联网

linux - 运行 "$ ls -la | script.sh"之类的 shell 脚本有什么用?

regex - 删除所有包含数字的目录,除了最近使用 Regex 在 Red Hat Linux Server 中创建的目录之外

jenkins - 在 Jenkins 声明性管道的参数中定义凭证参数?

jenkins - $ 凭证绑定(bind) + sh 逃避声明性管道的疯狂

javascript - 安装插件后无法在 Jenkins 中看到 Node 选项 'Global Configure'

ruby-on-rails - #<BottleSpecification :0x00000000e9fdb8> 的未定义方法 `rebuild'