Jenkins 如何在没有其他作业在代理/主机上运行时运行流水线

81次阅读
没有评论

问题描述

想要实现一个维护作业,用于清理缓存(如 Maven、NPM)。为了不通过删除缓存来干扰正在运行的作业,维护作业应该只在该节点上没有其他作业正在运行时运行。

解决方案

请注意以下操作可能涉及Jenkins插件和脚本编写,务必备份配置。

方案1 – 使用 Throttle Concurrents 插件

在Jenkins中实现在没有其他作业在代理/主机上运行时运行流水线的方法之一是使用 Throttle Concurrents 插件。这个插件允许你限制并发作业的数量,以及每个节点上的并发作业数量。

以下是使用 Throttle Concurrents 插件的步骤:

  1. 首先,确保你已经安装了 Throttle Concurrents 插件。你可以在 Jenkins 插件管理界面中搜索并安装该插件。

  2. 在你的流水线脚本中,使用 throttle 块来限制并发作业。在这个块中,你可以指定一个或多个分类,以及每个分类下允许的最大总并发数和每个节点上的最大并发数。

以下是一个示例流水线脚本片段:

node {
    // 定义你的流水线脚本
}

throttle(['jenkinsAdministrationCleanCache']) {
    node {
        // 这里是在限制并发作业的范围内运行的流水线脚本
    }
}

在上面的示例中,throttle(['jenkinsAdministrationCleanCache']) 表示限制并发作业的分类为 'jenkinsAdministrationCleanCache'。你可以根据实际情况调整这个分类名。

  1. 在 Jenkins 中配置 Throttle Concurrents 插件的限制。打开 Jenkins 管理界面,找到你的流水线项目,然后配置 Throttle Concurrents 插件的限制参数,包括总并发数和每个节点上的并发数。

方案2 – 自定义脚本实现

如果你希望自定义实现在没有其他作业在代理/主机上运行时运行流水线,你可以编写自己的脚本。以下是一个示例的脚本,用于在没有其他作业运行时运行流水线:

node {
    def isAnyJobRunning = Jenkins.instance.getAllItems(Job.class).any { job ->
        job.isBuilding()
    }

    if (!isAnyJobRunning) {
        // 运行你的流水线脚本
    } else {
        echo "There are other jobs running on this node. Maintenance job will not run."
    }
}

在上面的示例中,脚本会检查是否有其他作业正在运行。如果没有其他作业在运行,它会运行你的流水线脚本;否则,它会打印一条消息表示有其他作业正在运行,维护作业将不会运行。

请注意,这只是一个简单的示例脚本,你可以根据实际需求进行调整和扩展。

总结

以上是在 Jenkins 中实现在没有其他作业在代理/主机上运行时运行流水线的两种方法。你可以根据自己的需求选择适合的方法来实现这个功能。使用 Throttle Concurrents 插件可以在界面上方便地配置并发限制,而自定义脚本则可以更加灵活地实现定制化的逻辑。根据你的实际情况,选择合适的方法来达到你的目标。

正文完