当我们点击一个job上的[x]按钮,Jenkins会做执行步骤来停止来job:
- 浏览器给Jenkins服务端发送一个请求
- 服务端中断(通过Thread.interrupt())正在执行这个编译的进程(即executor 进程)
- 服务端返回
这时,你的浏览器返回了,但是实际的取消过程是异步发生的:
-
进程收到了中断信号。这一个过程多久发生取决于中断发生时执行器在做什么。特别地,由于Java的设计方式,一个执行器进程只有在“断点”处才能被中断。
- 等待一个子进程(比如,编译可能正在运行Ant)完成是一个断点。这意味着,如果执行器正在做这件事,它可以立即被中断。
- 等待一个客户端上的运算完成也是一个断点。
- 等待文件或者网络I/O不是一个断点。这个通常会导致编译看起来无法被中断。比如检出SVN仓库失败。
- 正常的运算也不是一个断点。
-
执行器执行一个清理的操作。这取决于当它收到中断时正在做什么
- 如果它正在等待子进程的完成,Jenkins会搜索所有的子进程然后杀掉他们。在Unix上,这是由
java.lang.UnixProcess.destroyProcess
通过发送SIGTERM信号完成。在windows上,这是通过TerminateProcess API完成。 - 如果它正在等待一个客户端上的计算完成,正在执行计算的进程会被异步中断。多久会被中断取决于上述原因。
- 如果它正在等待子进程的完成,Jenkins会搜索所有的子进程然后杀掉他们。在Unix上,这是由
执行器开始展开堆栈,并最终完成展开。这时,编译被标记为取消,执行器返回空闲状态。
Pipeline job可以通过发送HTTP POST请求来中断一个编译:
- BUILD ID URL/stop - 取消一个编译
- BUILD ID URL/term - 强制取消一个编译(stop不管用时使用)
- BUILD ID URL/kill - hard kill。最后不得已时才使用。