为什么詹金斯突然无法删除工作区

Why is Jenkins suddenly unable to delete a workspace

我们有一个 Jenkins 服务器,它已经成功地构建了我们的代码 200 多次——直到几天前。

我们现在收到一条错误消息,表明 Jenkins 无法删除工作区(完整消息后跟已编辑的标识元素。)

我检查了最近的代码更改,没有发现可能导致此问题的任何内容,并且该服务器上的任何内容几周都没有更改。

堆栈跟踪表明 "the context class hudson.FilePath is missing",但配置并未从工作超过 200 次的配置中更改。

有人可以建议可以采取哪些步骤来解决这个问题吗?

Started by user <REDACTED>
 > git rev-parse --is-inside-work-tree # timeout=10
Setting origin to https://<REDACTED>@bitbucket.org/<REDACTED>/<REDACTED>.git
 > git config remote.origin.url             
https://<REDACTED>@bitbucket.org/<REDACTED>/<REDACTED>.git # timeout=10
Fetching origin...
Fetching upstream changes from origin
 > git --version # timeout=10
using GIT_ASKPASS to set credentials <REDACTED>@bitbucket
 > git fetch --tags --progress origin +refs/heads/*:refs/remotes/origin/*
Seen branch in repository origin/master
Seen branch in repository origin/temp
Seen 2 remote branches
Obtained code/Jenkinsfile from <REDACTED>
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] node
Running on Jenkins in /var/lib/jenkins/workspace/<REDACTED>
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Declarative: Checkout SCM)
[Pipeline] checkout
Cloning the remote Git repository
Cloning with configured refspecs honoured and without tags
Cloning repository https://<REDACTED>@bitbucket.org/<REDACTED>/<REDACTED>.git
ERROR: Failed to clean the workspace
java.io.IOException: Unable to delete '/var/lib/jenkins/workspace/<REDACTED>. Tried 3 times (of a maximum of 3) waiting 0.1 sec between attempts.
    at hudson.Util.deleteContentsRecursive(Util.java:252)
    at     org.jenkinsci.plugins.gitclient.CliGitAPIImpl.execute(CliGitAPIImpl.java:555)
at hudson.plugins.git.GitSCM.retrieveChanges(GitSCM.java:1120)
at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1160)
at org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:113)
at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:85)
at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:75)
at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution.call(AbstractSynchronousNonBlockingStepExecution.java:47)
at hudson.security.ACL.impersonate(ACL.java:290)
at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution.run(AbstractSynchronousNonBlockingStepExecution.java:44)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at     java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.nio.file.FileSystemException: /var/lib/jenkins/workspace/<REDACTED>/code/<REDACTED>-query/target/classes/application.properties: Operation not permitted
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:91)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
at sun.nio.fs.UnixFileAttributeViews$Posix.setMode(UnixFileAttributeViews.java:238)
at sun.nio.fs.UnixFileAttributeViews$Posix.setPermissions(UnixFileAttributeViews.java:260)
at java.nio.file.Files.setPosixFilePermissions(Files.java:2045)
at hudson.Util.makeWritable(Util.java:332)
at hudson.Util.tryOnceDeleteFile(Util.java:292)
at hudson.Util.tryOnceDeleteRecursive(Util.java:383)
at hudson.Util.tryOnceDeleteContentsRecursive(Util.java:402)
at hudson.Util.tryOnceDeleteRecursive(Util.java:382)
at hudson.Util.tryOnceDeleteContentsRecursive(Util.java:402)
at hudson.Util.tryOnceDeleteRecursive(Util.java:382)
at hudson.Util.tryOnceDeleteContentsRecursive(Util.java:402)
at hudson.Util.tryOnceDeleteRecursive(Util.java:382)
at hudson.Util.tryOnceDeleteContentsRecursive(Util.java:402)
at hudson.Util.tryOnceDeleteRecursive(Util.java:382)
at hudson.Util.tryOnceDeleteContentsRecursive(Util.java:402)
at hudson.Util.deleteContentsRecursive(Util.java:247)
... 14 more
ERROR: Error cloning remote repo 'origin'
hudson.plugins.git.GitException: Failed to delete workspace
at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.execute(CliGitAPIImpl.java:558)
at hudson.plugins.git.GitSCM.retrieveChanges(GitSCM.java:1120)
at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1160)
at org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:113)
at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:85)
at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:75)
at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution.call(AbstractSynchronousNonBlockingStepExecution.java:47)
at hudson.security.ACL.impersonate(ACL.java:290)
at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution.run(AbstractSynchronousNonBlockingStepExecution.java:44)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: Unable to delete '/var/lib/jenkins/workspace/<REDACTED>'. Tried 3 times (of a maximum of 3) waiting 0.1 sec between attempts.
at hudson.Util.deleteContentsRecursive(Util.java:252)
at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.execute(CliGitAPIImpl.java:555)
... 13 more
Caused by: java.nio.file.FileSystemException: /var/lib/jenkins/workspace/<REDACTED>/code/<REDACTED>-query/target/classes/application.properties: Operation not permitted
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:91)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
at sun.nio.fs.UnixFileAttributeViews$Posix.setMode(UnixFileAttributeViews.java:238)
at sun.nio.fs.UnixFileAttributeViews$Posix.setPermissions(UnixFileAttributeViews.java:260)
at java.nio.file.Files.setPosixFilePermissions(Files.java:2045)
at hudson.Util.makeWritable(Util.java:332)
at hudson.Util.tryOnceDeleteFile(Util.java:292)
at hudson.Util.tryOnceDeleteRecursive(Util.java:383)
at hudson.Util.tryOnceDeleteContentsRecursive(Util.java:402)
at hudson.Util.tryOnceDeleteRecursive(Util.java:382)
at hudson.Util.tryOnceDeleteContentsRecursive(Util.java:402)
at hudson.Util.tryOnceDeleteRecursive(Util.java:382)
at hudson.Util.tryOnceDeleteContentsRecursive(Util.java:402)
at hudson.Util.tryOnceDeleteRecursive(Util.java:382)
at hudson.Util.tryOnceDeleteContentsRecursive(Util.java:402)
at hudson.Util.tryOnceDeleteRecursive(Util.java:382)
at hudson.Util.tryOnceDeleteContentsRecursive(Util.java:402)
at hudson.Util.deleteContentsRecursive(Util.java:247)
... 14 more
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] stage
[Pipeline] { (Declarative: Post Actions)
[Pipeline] step
Required context class hudson.FilePath is missing
Perhaps you forgot to surround the code with a step that provides this, such as: node
[Pipeline] }
[Pipeline] // stage
[Pipeline] End of Pipeline
ERROR: Error cloning remote repo 'origin'
Finished: FAILURE

有东西锁定了工作区中的文件或目录。

  • 有人登录到 Jenkins 并直接使用文件系统而不是通过 Jenkins 从工作区访问文件。
  • 构建过程留下了一个僵尸程序。

其他一些类似的案例。

如果您有 shell 访问 FS 的权限,请使用 lsof 之类的东西来查找锁定过程。

编辑:经过几次投票后,我在一些 linux 和 windows 奴隶上实施了几个项目。 就我而言,我知道可能的僵尸名称。
我添加了一个特殊的 job/build 来杀死可能留在 linux.
中的进程 在 windows 中,我编写了一个 CS 程序来终止可能的进程 and/or 使用 Jenkins 作业运行 'UnLock IT',这也释放了资源。

作为临时解决方案,请尝试重命名您的项目。

我遇到了类似的问题。问题的原因是我正在将 Jenkins 工作区安装到 docker 并执行 python 代码,它创建了一些具有不同权限的 Pycache 可执行文件并且 Jenkins 无法删除它。

对此的临时修复是删除 git 克隆命令然后使用 sudo rm -rf code_directory 然后构建。它将删除所有代码。 然后恢复 git 克隆和所有其他命令

我终于找到了解释一切的解决方案。

原因: 我在 Jenkins 中使用 docker 并在 Docker (-v pwd:/code:rw) 中安装了 Jenkins 工作目录。 在运行时,我的程序生成一些文件,这些文件在安装时也会进入 Jenkins 工作目录。但用户是 docker root 而不是 Jenkins 用户,因为 Jenkins 用户无法删除这些文件并导致此错误。

解决方法: 您还可以与 docker 共享 Jenkins 用户,因此创建的所有文件都与 Jenkins 本身创建的文件相同。

docker run --user "$(id -u):$(id -g)" -i --rm -v /etc/passwd:/etc/passwd:ro  -v `pwd`:/code:rw docker_image:tag

所以通过在 docker.

中使用 Jenkins 用户,添加这基本上解决了问题
--user "$(id -u):$(id -g)" -v /etc/passwd:/etc/passwd:ro

这个页面仍然受到很多关注,这可能是我原来问题的正确答案。

I had the same problem, found some files with permission root:root in the workspace directory. Running "sudo chown -R jenkins:jenkins /var/lib/jenkins/workspace" solved the problem.

感谢Olivier Boudry

我删除了目录,然后重试。为我工作。

我删除了工作区目录中的目录,重新运行作业,并解决了问题。

就我而言,我遇到了一个错误

Caused by: jenkins.util.io.CompositeIOException: Unable to delete '/home/jenkins/workspace/my_project'. Tried 3 times

但事实上,当我 ssh 到那个文件夹时,它是空的。

有问题的文件夹的实际位置是

/media/jenkins_home/workspace/my_project

当我在那里删除并重新启动构建时,一切都成功了。 /home/jenkins/workspace/ 绝对不是符号链接,我仍然不明白为什么错误日志中的文件夹不同但猜测它与 Docker 卷或 smth..

有关

我遇到了同样的问题,在工作区目录中找到了一些权限为 root:root 的文件。尝试 运行 find . -user root -exec chmod 777 {} ; 更改文件的权限,但由于一些悬空的符号 link 而失败。尝试通过 find <folder name> -xtype l -delete 删除悬挂的符号 link 但对于某些符号 link 它也失败了(因为那些符号给出了太多级别的符号 links)

运行

sudo chown -R jenkins:jenkins /var/lib/jenkins/workspace

解决了问题。

我 运行 在我的 Jenkins 管道中也遇到了这个问题,特别是在我有任何迁移文件之前与 Flywaydb 集成时,所以我挂载的目录不存在。为我修复的是使用 .gitkeep 创建空目录,然后可以删除该卷。

我在 Jenkins 中使用 docker 并在 Docker 容器中安装 Jenkins 工作目录。

我看到了上面的解决方案

Solution: you can also share Jenkins user with docker, So all file created is same as file created by Jenkins itself.

docker run --user "$(id -u):$(id -g)" -i --rm -v /etc/passwd:/etc/passwd:ro  -v `pwd`:/code:rw docker_image:tag

所以通过在 docker.

中使用 Jenkins 用户,添加这基本上解决了问题
--user "$(id -u):$(id -g)" -v /etc/passwd:/etc/passwd:ro"

但我不清楚我应该 运行 在 Jenkinsfile 中的什么地方或 machine/node 我 运行 我工作的地方 运行 这个命令。

我刚刚尝试重命名该作业,但效果很好