[Bug 253857] devel/jenkins-lts: Aborted builds leave processes behind

bugzilla-noreply at freebsd.org bugzilla-noreply at freebsd.org
Thu Feb 25 20:58:57 UTC 2021


https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=253857

            Bug ID: 253857
           Summary: devel/jenkins-lts: Aborted builds leave processes
                    behind
           Product: Ports & Packages
           Version: Latest
          Hardware: Any
                OS: Any
            Status: New
          Severity: Affects Only Me
          Priority: ---
         Component: Individual Port(s)
          Assignee: swills at FreeBSD.org
          Reporter: grembo at FreeBSD.org
             Flags: maintainer-feedback?(swills at FreeBSD.org)
          Assignee: swills at FreeBSD.org

Jenkins makes use of a feature called the ProcessTreeKiller[0] to kill
processes when aborting a build (e.g., timeout, manual abort, etc.). The
ProcessTreeKiller checks the environment of all processes to see if they
contain the BUILD_ID of the current build, and if they do, it kills them.

The ProcessTreeKiller doesn't support FreeBSD though, as it depends on being
able to read the environment from procfs[1].

In theory, it should be able to modify the ProcessTree implementation in
Jenkins to support this, so that it works as expected. Doing so might be quite
some work (especially when trying to upstream a patch).

So if fixing the problem isn't possible, it would be good if the port would
warn about it (and recommending a workaround).

I'm currently using the script below, called from within a shell build step, to
emulate expected ProcessTreeKiller behavior:

build_cleanup.sh:

#!/bin/sh
#
# 2021 Michael Gmelin <grembo at FreeBSD.org>
#
# When aborting a build, Jenkins kills all processes containing
# the correct BUILD_ID in their environment using the
# ProcessTreeKiller.
#
# As the ProcessTreeKiller is not supported on FreeBSD,
# aborting a build can leave processes behind.
#
# This script mitigates this by waiting for the
# script it was executed by to end and then
# emulating ProcessTreeKiller behavior (check
# all processes if they're containing BUILD_ID=<build_id>
# in their environment.
#
# Example invocation from build script:
# (env -u BUILD_ID build_cleanup.sh "$$" "$BUILD_ID")&

pwait $1

for p in $(ps -xopid | grep -v PID); do
  if [ "$p" -ne "$$" ]; then
    procstat -e $p 2>/dev/null | tr " " "\n" | grep -q "BUILD_ID=$2"
    if [ $? -eq 0 ]; then
      kill $p
    fi
  fi
done

Example build.sh:

#!/bin/sh

(env -u BUILD_ID build_cleanup.sh "$$" "$BUILD_ID")&
exec ./build_all.sh

[0]https://wiki.jenkins.io/display/JENKINS/ProcessTreeKiller
[1]https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/util/ProcessTree.java

-- 
You are receiving this mail because:
You are the assignee for the bug.


More information about the freebsd-ports-bugs mailing list