取消job

当我们点击一个job上的[x]按钮,Jenkins会做执行步骤来停止来job:

  • 浏览器给Jenkins服务端发送一个请求
  • 服务端中断(通过Thread.interrupt())正在执行这个编译的进程(即executor 进程)
  • 服务端返回

这时,你的浏览器返回了,但是实际的取消过程是异步发生的:

  1. 进程收到了中断信号。这一个过程多久发生取决于中断发生时执行器在做什么。特别地,由于Java的设计方式,一个执行器进程只有在“断点”处才能被中断。

    • 等待一个子进程(比如,编译可能正在运行Ant)完成是一个断点。这意味着,如果执行器正在做这件事,它可以立即被中断。
    • 等待一个客户端上的运算完成也是一个断点。
    • 等待文件或者网络I/O不是一个断点。这个通常会导致编译看起来无法被中断。比如检出SVN仓库失败。
    • 正常的运算也不是一个断点。
  2. 执行器执行一个清理的操作。这取决于当它收到中断时正在做什么

    • 如果它正在等待子进程的完成,Jenkins会搜索所有的子进程然后杀掉他们。在Unix上,这是由java.lang.UnixProcess.destroyProcess通过发送SIGTERM信号完成。在windows上,这是通过TerminateProcess API完成。
    • 如果它正在等待一个客户端上的计算完成,正在执行计算的进程会被异步中断。多久会被中断取决于上述原因。
  3. 执行器开始展开堆栈,并最终完成展开。这时,编译被标记为取消,执行器返回空闲状态。

Pipeline job可以通过发送HTTP POST请求来中断一个编译:

  • BUILD ID URL/stop - 取消一个编译
  • BUILD ID URL/term - 强制取消一个编译(stop不管用时使用)
  • BUILD ID URL/kill - hard kill。最后不得已时才使用。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容