问题描述
想要实现一个维护作业,用于清理缓存(如 Maven、NPM)。为了不通过删除缓存来干扰正在运行的作业,维护作业应该只在该节点上没有其他作业正在运行时运行。
解决方案
请注意以下操作可能涉及Jenkins插件和脚本编写,务必备份配置。
方案1 – 使用 Throttle Concurrents 插件
在Jenkins中实现在没有其他作业在代理/主机上运行时运行流水线的方法之一是使用 Throttle Concurrents 插件。这个插件允许你限制并发作业的数量,以及每个节点上的并发作业数量。
以下是使用 Throttle Concurrents 插件的步骤:
-
首先,确保你已经安装了 Throttle Concurrents 插件。你可以在 Jenkins 插件管理界面中搜索并安装该插件。
-
在你的流水线脚本中,使用
throttle
块来限制并发作业。在这个块中,你可以指定一个或多个分类,以及每个分类下允许的最大总并发数和每个节点上的最大并发数。
以下是一个示例流水线脚本片段:
node {
// 定义你的流水线脚本
}
throttle(['jenkinsAdministrationCleanCache']) {
node {
// 这里是在限制并发作业的范围内运行的流水线脚本
}
}
在上面的示例中,throttle(['jenkinsAdministrationCleanCache'])
表示限制并发作业的分类为 'jenkinsAdministrationCleanCache'
。你可以根据实际情况调整这个分类名。
- 在 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 插件可以在界面上方便地配置并发限制,而自定义脚本则可以更加灵活地实现定制化的逻辑。根据你的实际情况,选择合适的方法来达到你的目标。