如何修复Jenkins管道中的“进程显然从未在...中启动”错误?

6kkfgxo0  于 2023-05-28  发布在  Jenkins
关注(0)|答案(9)|浏览(571)

我在我的Jenkins管道中得到下面的奇怪错误

[Pipeline] withDockerContainer
acp-ci-ubuntu-test does not seem to be running inside a container
$ docker run -t -d -u 1002:1006 -u ubuntu --net=host -v /var/run/docker.sock:/var/run/docker.sock -v /home/ubuntu/.docker:/home/ubuntu/.docker -w /home/ubuntu/workspace/CD-acp-cassandra -v /home/ubuntu/workspace/CD-acp-cassandra:/home/ubuntu/workspace/CD-acp-cassandra:rw,z -v /home/ubuntu/workspace/CD-acp-cassandra@tmp:/home/ubuntu/workspace/CD-acp-cassandra@tmp:rw,z -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** quay.io/arubadevops/acp-build:ut-build cat
$ docker top 83d04d0a3a3f9785bdde3932f55dee36c079147eb655c1ee9d14f5b542f8fb44 -eo pid,comm
[Pipeline] {
[Pipeline] sh
process apparently never started in /home/ubuntu/workspace/CD-acp-cassandra@tmp/durable-70b242d1
(running Jenkins temporarily with -Dorg.jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS=true might make the problem clearer)
[Pipeline] }
$ docker stop --time=1 83d04d0a3a3f9785bdde3932f55dee36c079147eb655c1ee9d14f5b542f8fb44
$ docker rm -f 83d04d0a3a3f9785bdde3932f55dee36c079147eb655c1ee9d14f5b542f8fb44
[Pipeline] // withDockerContainer

Jenkins管道中的相应阶段是

stage("Build docker containers & coreupdate packages") {
        agent {
            docker {
                image "quay.io/arubadevops/acp-build:ut-build"
                label "acp-ci-ubuntu"
                args "-u ubuntu --net=host -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/.docker:/home/ubuntu/.docker"
              }
          }
          steps {
              script {
                 try {
                    sh "export CI_BUILD_NUMBER=${currentBuild.number}; cd docker; ./build.sh; cd ../test; ./build.sh;"
                    ciBuildStatus="PASSED"
                 } catch (err) {
                    ciBuildStatus="FAILED"
                 }
              }
          }
      }

进程不能在docker容器中启动的原因是什么?关于如何进一步调试的任何指针也是有帮助的。

lnvxswe2

lnvxswe21#

这个错误意味着Jenkins进程被某个命令卡住了。
一些建议:

  • 升级所有插件并重试。
  • 确保你有正确数量的执行程序,并且作业没有卡在队列中。
  • 如果您正在提取图像(而不是本Map像),请尝试添加alwaysPull trueimage的下一行)。
    ***在stage内部使用agent时,需要去掉外部代理。**参见:JENKINS-63449
  • 在Jenkins的 Script Console 中执行org.jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS=true进行调试。
  • 当进程被卡住时,SSH到Jenkins VM并运行docker ps以查看正在运行的命令。
  • 运行docker ps -a以查看最新的失败运行。在我的例子中,它试图在容器设置的自定义CMD命令集旁边运行cat(例如ansible-playbook cat),这是无效的命令。cat command is used by design。要更改入口点,请阅读JENKINS-51307
  • 如果你的容器还在运行,你可以通过docker exec -it -u0 $(docker ps -ql) bash登录到你的Docker容器,然后运行ps wuax来查看正在做什么。
  • 尝试删除一些全局变量(可能是bug),请参阅:parallel jobs not starting with docker workflow
tct7dpnv

tct7dpnv2#

这个问题是由Jenkins durable-task插件v1.31中引入的一些破坏性更改引起的。
来源:
https://issues.jenkins-ci.org/browse/JENKINS-59907https://github.com/jenkinsci/durable-task-plugin/blob/master/CHANGELOG.md
解决方案:将Jenkins持久任务插件升级到v1.33为我们解决了这个问题。

slwdgvem

slwdgvem3#

我遇到了同样的问题,在我的情况下,它与传递给代理的-u <user>参数有关。最后,将我的管道改为使用-u root解决了这个问题。
在最初的帖子中,我注意到使用了-u ubuntu来运行容器:

docker run -t -d -u 1002:1006 -u ubuntu ... -e ******** quay.io/arubadevops/acp-build:ut-build cat

我还使用了一个自定义用户,这是我在构建Docker镜像时添加的。

agent {
  docker {
    image "app:latest"
    args "-u someuser"
    alwaysPull false
    reuseNode true
  }
}
steps {
  sh '''
    # DO STUFF
  '''
}

使用相同的Jenkins命令在本地启动容器工作正常:

docker run -t -d -u 1000:1000 -u someuser app:image cat
docker top <hash> -eo pid,comm
docker exec -it <hash> ls  # DO STUFF

但在Jenkins中,它会失败,并出现相同的“process never started..”错误:

$ docker run -t -d -u 1000:1000 -u someuser app:image cat
$ docker top <hash> -eo pid,comm
[Pipeline] {
[Pipeline] unstash
[Pipeline] sh
process apparently never started in /home/jenkins/agent/workspace/branch@tmp/durable-f5dfbb1c

出于某种原因,将其更改为-u root起作用了。

agent {
  docker {
    image "app:latest"
    args "-u root"      # <=-----------
    alwaysPull false
    reuseNode true
  }
}
w9apscun

w9apscun4#

如果你已经将durable-task插件升级到1.33或更高版本,它仍然无法工作,请检查是否有一个空的环境变量配置在你的管道中或存储在Jenkins配置中(虚线),并删除它:

pb3skfrl

pb3skfrl5#

除了kenorb's answer

  • 检查您正在运行的容器内的权限以及构建主机上的Jenkins目录。

我正在运行自定义Docker容器,经过几个小时的调试,我发现在尝试执行Jenkins试图在运行容器中执行的内容(通过exec进入容器,运行echo "$(ps waux)",并逐个执行那些sh -c命令)之后。我发现Jenkins无法在容器内创建日志文件,因为UID和GID不匹配。

tpxzln5u

tpxzln5u6#

如果您在Docker中运行Jenkins,并使用DinD容器运行Docker作业,请确保将Jenkins数据卷挂载到提供Docker守护程序的服务中的/var/jenkins_home。日志创建实际上是由守护进程尝试的,这意味着守护进程容器需要访问正在操作的工作区所在的卷。
docker-compose.yml的示例代码段:

services:
  dind:
    container_name: dind-for-jenkins
    privileged: true
    image: docker:stable-dind
    volumes:
      - 'jenkins-data:/var/jenkins_home'
gg0vcinb

gg0vcinb7#

它吞噬了我的生命!我在至少10个SO帖子上尝试了每一种可以想象的解决方案,最后是因为我的管道名称中有空格。:|
所以我用“scripts_try”改变了“let's try scripting”,它就工作了。

2mbi3lxu

2mbi3lxu8#

构建一个在Docker容器中运行的Jenkins作业,遇到了同样的错误。Durable-Task插件的版本是v1.35,所以这不是问题所在。我的问题是我的工作是试图运行一个chmod -R 755 *.sh命令,并在容器内的活动用户没有足够的权限来执行chmod对这些文件。本以为Jenkins会在这里失败,但是使用一个ID启动容器,该ID * 确实 * 有权限运行chmod命令,从而克服了这个错误。

wnavrhmk

wnavrhmk9#

在我的案例中,问题与使用Kubernetes代理有关:

agent {
    kubernetes {
        cloud 'cloud'
        namespace 'namespace'
        yamlFile '.ci/build-pod.yaml'
    }
}

我需要将runAsUser添加到pod定义中,以便Jenkins假设用户在图像中具有所需的权限:

apiVersion: v1
kind: Pod
spec:
  containers:
    - name: jnlp
      image: custom-build-image:latest
      args:
        - jenkins-slave
      tty: false
      workingDir: /home/jenkins
  securityContext:
    runAsUser: 1000

相关问题