Jenkins流水线同步控制与优雅终止技术问询
解决方案
一、实现流水线间Deploy/Destroy的同步控制
要解决Deploy必须等前一次Destroy完成才能执行,同时代码推送时跳过测试阶段的需求,推荐使用Lockable Resources插件实现资源互斥:
1. 全局配置锁资源
进入Jenkins「系统管理」→「Manage Nodes and Clouds」→「Lockable Resources」,新建一个锁资源(比如命名为test-environment-lock),这个锁专门用于控制测试环境的部署与销毁操作,确保同一时间只有一个操作在执行。
2. 修改流水线代码
在testEnvDeploy阶段和post的销毁步骤外层包裹锁逻辑,并通过when条件跳过代码推送触发时的测试阶段:
pipeline { agent any stages { stage('testEnvDeploy') { steps { // 申请锁,确保同一时间只有一个Deploy/Destroy在运行 lock(resource: 'test-environment-lock', inversePrecedence: true) { // 你的测试环境部署命令(外部进程) sh './deploy-test-env.sh' } } } stage('testA') { // 仅非代码推送触发的构建(比如手动触发)才执行测试 when { not { triggeredBy cause: 'SCMTrigger' } } steps { // testA逻辑 } } stage('testB') { when { not { triggeredBy cause: 'SCMTrigger' } } steps { // testB逻辑 } } stage('testC') { when { not { triggeredBy cause: 'SCMTrigger' } } steps { // testC逻辑 } } } post { always { // 销毁步骤同样加锁,确保Deploy必须等销毁完成后才能执行 lock(resource: 'test-environment-lock', inversePrecedence: true) { // 你的测试环境销毁命令(外部进程) sh './destroy-test-env.sh' } } } }
inversePrecedence: true:让最新触发的构建优先获得锁,避免旧的非代码推送构建(正在跑测试)占用锁导致新的代码推送构建排队。when { not { triggeredBy cause: 'SCMTrigger' } }:代码推送触发的构建会自动跳过testA/testB/testC阶段,直接进入后续流程。
二、流水线中止时让当前步骤正常完成
要实现流水线被中止时,正在运行的Deploy/Destroy步骤不被强制终止,可使用Jenkins内置的ignoreInterruptions步骤包裹核心命令:
ignoreInterruptions { sh './deploy-test-env.sh' }
这个步骤会忽略Jenkins的中止信号,让内部的命令完整执行完毕后再响应中止操作,适配你所说的「杀死stage无法终止外部进程」的场景。
内容的提问来源于stack exchange,提问作者Raziza O
相关产品推荐
相关产品推荐

