Jenkins 构建发生在主服务器上,而不是从服务器上

Jenkins 构建发生在主服务器上,而不是从服务器上

我一直在通过 Jenkins 进行 Android 操作系统的自动化构建,存储库非常庞大,构建本身需要相当长的时间。因此,我需要在从属服务器上运行,这样构建时可以使用的功能和线程就更多,而且不会占用主服务器的磁盘空间,导致其他开发人员无法使用。

当我生成第一个构建并将其部署到主服务器时,我检查了配置并查看了 Jenkins 的最佳实践。

https://wiki.jenkins.io/display/JENKINS/Jenkins+Best+Practices

如果您有一个更复杂的安全设置,允许某些用户仅配置作业,但不管理 Jenkins,则需要阻止他们在主节点上运行构建,否则他们可以不受限制地访问 JENKINS_HOME 目录。您可以通过将执行器计数设置为零来实现此目的。相反,确保所有作业都在从属服务器上运行。这确保 jenkins 主服务器可以扩展以支持更多作业,并且还可以保护构建免于意外/恶意修改 $JENKINS_HOME 上的潜在敏感数据。如果您需要在主服务器上运行某些作业(例如 Jenkins 本身的备份),请使用作业限制插件来限制哪些作业可以在那里执行。

我注意到我们在主服务器上有两个可用的执行器,根据最佳实践,如果您不想在主服务器上构建,则应将其设置为零。我将其设置为零并重试构建。

主服务器执行器

令我惊讶的是,它仍在主服务器上构建。下面是我的 Jenkins 文件,它隐含地表示在我的从服务器上构建。

pipeline {
    agent {label 'van-droid'}

    stages {
        stage('Build') {
            steps {
        echo 'Building..'
        sh 'make clean'
        sh 'export USE_CCACHE=1'
        sh 'export CCACHE_DIR=/nvme/.ccache'
        sh './FFTools/make.sh'
             }
        }
    }
}

有人知道发生了什么事吗?

答案1

好的,所以我能够强制在从服务器上构建的唯一方法是安装 Node/Label 插件并添加一个参数,说明该项目只能在我请求的特定从服务器上构建。这似乎是一种更好的方法,因为一些开发人员实际上正在使用主服务器构建某些项目,当我将执行器设置为零时,他们的构建处于待处理状态。

答案2

您也可以尝试

agent {label '!master'}

这是为了避免在主节点中执行作业(通过您分配给主节点的标签更改主节点)。

答案3

“令我惊讶的是,它仍然在主楼上建造。”

所有管道构建都在主服务器上运行“轻量级”执行器。管道构建实际上在它们出队时就开始了。

主进程和享元进程上的实际执行

注意显示的细微差别。

在这里显示的示例中,Master 有 4 个执行器,它们都有编号,并且有两个作业实际上正在 Master 上运行。另外两个(为清晰起见以黄色突出显示)是“Flyweight” - 也称为 OneOffExecutors,它们会出现一段时间,直到它们被分派到其他地方,但它们确实在作业的持续时间内运行。您可以使用如下查询查看在 Master 上运行的 OneOff 作业:

https://YOUR.JENKINS.URL/computer/(master)/api/python?pretty=true&tree=oneOffExecutors[currentExecutable[fullDisplayName,result,id,url]]&depth=1

您不必使用 Python 渲染,但它比 XML 更容易阅读。

Flyweight 或“OneOffExecutors”是主进程跟踪和协调管道作业的方式。您可以在上面分享的链接中了解有关它们的更多信息。

相关内容