【问题标题】:Why is Jenkins suddenly unable to delete a workspace为什么詹金斯突然无法删除工作区
【发布时间】:2018-11-19 19:39:42
【问题描述】:

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

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

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

堆栈跟踪表明“缺少上下文类 hudson.FilePath”,但配置并没有从工作超过 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$2.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$1$1.call(AbstractSynchronousNonBlockingStepExecution.java:47)
at hudson.security.ACL.impersonate(ACL.java:290)
at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1.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$2.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$1$1.call(AbstractSynchronousNonBlockingStepExecution.java:47)
at hudson.security.ACL.impersonate(ACL.java:290)
at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1.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$2.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

【问题讨论】:

  • /var/lib/jenkins/workspace/ 的文件权限是什么?
  • 通常是permission 问题,或者您的工作区正被另一个作业占用——即,如果您的作业可以同时运行多次并且您尚未添加disableConcurrentBuilds()
  • 我们经常在 Windows 上看到这种情况,在这些窗口中,先前构建遗留下来的进程仍在运行。因为这个进程有一个文件在工作区打开,所以无法清理工作区。
  • 是杀毒软件的原因吗?我们在windows上有类似的问题,怀疑杀毒软件正在检查执行文件。
  • 您的文件名是否包含任何特殊字符?我有同样的问题似乎是由文件名中的德语变音符号引起的。

标签: jenkins bitbucket hudson


【解决方案1】:

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

我看到了上面的解决方案

"解决方案:你也可以将Jenkins用户共享给docker,所以创建的所有文件都和Jenkins自己创建的文件一样。

docker run --user "$(id -u):$(id -g)" -i --rm -v /etc/passwd:/etc/passwd:ro -v pwd:/code: rw docker_image:标签 所以添加这个基本上通过在docker中使用Jenkins用户解决了这个问题。

--user "$(id -u):$(id -g)" -v /etc/passwd:/etc/passwd:ro"

但我不清楚我应该在 Jenkinsfile 中的哪个位置或运行我的作业的机器/节点上运行此命令。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      运行“sudo chown -R jenkins:jenkins /var/lib/jenkins/workspace”解决了这个问题。

      【讨论】:

        【解决方案4】:

        就我而言,我有一个错误

        原因:jenkins.util.io.CompositeIOException:无法删除“/home/jenkins/workspace/my_project”。试了3次

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

        问题文件夹的实际位置是

        /media/jenkins_home/workspace/my_project

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            我删除了目录并再次尝试。为我工作。

            【讨论】:

              【解决方案7】:

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

              我遇到了同样的问题,找到了一些具有 root:root 权限的文件 工作区目录。运行“sudo chown -R jenkins:jenkins /var/lib/jenkins/workspace" 解决了这个问题。

              感谢Olivier Boudry

              【讨论】:

                【解决方案8】:

                工作区中的文件或目录被锁定。

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

                其他一些类似的案例。

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

                编辑:经过几次投票后,我在一些 linux 和 windows slaves 上实现了几个项目。 就我而言,我知道可能的僵尸的名字。
                我添加了一个特殊的作业/构建,它会杀死可能留在 linux 中的进程。
                在 Windows 中,我编写了一个 CS 程序,该程序可以杀死可能的进程和/或使用 Jenkins 作业运行“解锁 IT”,这也释放了资源。

                【讨论】:

                • 感谢您的帮助。这是最奇怪的。我重新启动了服务器,并确保我有唯一的访问权限,但仍然有问题。最后,我使用 sudo 手动删除了目录,Jenkins 构建又回到了正轨!
                • @MarkA,如果重启后问题仍然存在,我会继续搜索以找出原因。这可能会再次重复。我相信你知道重启工作服务器不好。
                • 我遇到了同样的问题,在工作区目录中发现了一些具有 root:root 权限的文件。运行“sudo chown -R jenkins:jenkins /var/lib/jenkins/workspace”解决了这个问题。
                • 在我的情况下,问题是作业目录中的文件之一具有root 作为所有者,因此,jenkins 不允许将其删除。我对目录进行了 sudo 并手动将其删除。
                【解决方案9】:

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

                原因: 我在 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
                

                【讨论】:

                • 我从未见过需要使用--user。现在我明白为什么它如此有用了哈哈。谢谢。
                • 谢谢!我还必须添加-v /home/jenkins/.m2:/home/jenkins/.m2,否则 Maven 无法创建本地存储库。
                • 补充@msa 的评论:更一般地说:-v "$HOME":"$HOME",或者如果实际的 Jenkins 主目录不受影响,则将当前目录挂载为主目录:-v "$(pwd)":"$HOME"
                【解决方案10】:

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

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

                【讨论】:

                • sudo 权限不适用于大多数 jenkins 作业或用户
                【解决方案11】:

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

                【讨论】:

                  猜你喜欢
                  • 2022-09-27
                  • 2016-09-24
                  • 2015-07-25
                  • 2012-12-19
                  • 2019-08-13
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多