Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-22795

git plugin cleans workspace on initial clone

    Details

    • Type: Bug
    • Status: Open (View Workflow)
    • Priority: Blocker
    • Resolution: Unresolved
    • Component/s: git-plugin
    • Labels:
      None
    • Similar Issues:

      Description

      Expected behavior: having "Wipe out workspace before build" unchecked would mean that the git plugin would not try to delete files in the workspace before building
      Actual behavior: having "Wipe out workspace before build" unchecked does not affect whether or not the git plugin tries to delete files in the workspace before building

      On version 1.5.0 of the git plugin (and judging by the source code, all versions since), the plugin unconditionally calls deleteContentsRecursive during the clone. This causes problems if the jenkins job running built any artifacts as another user, as they won't be able to be cleaned up. As there are checkboxes to indicate whether or not cleaning should occur, it seems like it would be nice to honor them.

      From src/main/java/org/jenkinsci/plugins/gitclient/CliGitAPIImpl.java, line 366-370:

      try {
          Util.deleteContentsRecursive(workspace);
      } catch (Exception e) {
          e.printStackTrace(listener.error("Failed to clean the workspace"));
          throw new GitException("Failed to delete workspace", e);
      }
      

      When there are files not able to be deleted by jenkins, the following stacktrace is helpfully spewed:

      ERROR: Failed to clean the workspace
      java.nio.file.AccessDeniedException: <REDACTED>
      	at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84)
      	at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
      	at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
      	at sun.nio.fs.UnixFileSystemProvider.implDelete(UnixFileSystemProvider.java:244)
      	at sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:103)
      	at java.nio.file.Files.delete(Files.java:1077)
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:606)
      	at hudson.Util.deleteFile(Util.java:239)
      	at hudson.Util.deleteRecursive(Util.java:307)
      	at hudson.Util.deleteContentsRecursive(Util.java:204)
      	at hudson.Util.deleteRecursive(Util.java:298)
      	at hudson.Util.deleteContentsRecursive(Util.java:204)
      	at hudson.Util.deleteRecursive(Util.java:298)
      	at hudson.Util.deleteContentsRecursive(Util.java:204)
      	at hudson.Util.deleteRecursive(Util.java:298)
      	at hudson.Util.deleteContentsRecursive(Util.java:204)
      	at hudson.Util.deleteRecursive(Util.java:298)
      	at hudson.Util.deleteContentsRecursive(Util.java:204)
      	at hudson.Util.deleteRecursive(Util.java:298)
      	at hudson.Util.deleteContentsRecursive(Util.java:204)
      	at hudson.Util.deleteRecursive(Util.java:298)
      	at hudson.Util.deleteContentsRecursive(Util.java:204)
      	at hudson.Util.deleteRecursive(Util.java:298)
      	at hudson.Util.deleteContentsRecursive(Util.java:204)
      	at hudson.Util.deleteRecursive(Util.java:298)
      	at hudson.Util.deleteContentsRecursive(Util.java:204)
      	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl$1.execute(CliGitAPIImpl.java:222)
      	at org.jenkinsci.plugins.gitclient.AbstractGitAPIImpl.clone(AbstractGitAPIImpl.java:59)
      	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.clone(CliGitAPIImpl.java:40)
      	at hudson.plugins.git.GitSCM$2.invoke(GitSCM.java:1012)
      	at hudson.plugins.git.GitSCM$2.invoke(GitSCM.java:948)
      	at hudson.FilePath$FileCallableWrapper.call(FilePath.java:2444)
      	at hudson.remoting.UserRequest.perform(UserRequest.java:118)
      	at hudson.remoting.UserRequest.perform(UserRequest.java:48)
      	at hudson.remoting.Request$2.run(Request.java:326)
      	at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:72)
      	at java.util.concurrent.FutureTask.run(FutureTask.java:262)
      	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
      	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
      	at java.lang.Thread.run(Thread.java:744)
      ERROR: Error cloning remote repo 'origin' : Failed to delete workspace
      hudson.plugins.git.GitException: Failed to delete workspace
      	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl$1.execute(CliGitAPIImpl.java:225)
      	at org.jenkinsci.plugins.gitclient.AbstractGitAPIImpl.clone(AbstractGitAPIImpl.java:59)
      	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.clone(CliGitAPIImpl.java:40)
      	at hudson.plugins.git.GitSCM$2.invoke(GitSCM.java:1012)
      	at hudson.plugins.git.GitSCM$2.invoke(GitSCM.java:948)
      	at hudson.FilePath$FileCallableWrapper.call(FilePath.java:2444)
      	at hudson.remoting.UserRequest.perform(UserRequest.java:118)
      	at hudson.remoting.UserRequest.perform(UserRequest.java:48)
      	at hudson.remoting.Request$2.run(Request.java:326)
      	at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:72)
      	at java.util.concurrent.FutureTask.run(FutureTask.java:262)
      	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
      	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
      	at java.lang.Thread.run(Thread.java:744)
      Caused by: java.nio.file.AccessDeniedException: <REDACTED>
      	at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84)
      	at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
      	at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
      	at sun.nio.fs.UnixFileSystemProvider.implDelete(UnixFileSystemProvider.java:244)
      	at sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:103)
      	at java.nio.file.Files.delete(Files.java:1077)
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:606)
      	at hudson.Util.deleteFile(Util.java:239)
      	at hudson.Util.deleteRecursive(Util.java:307)
      	at hudson.Util.deleteContentsRecursive(Util.java:204)
      	at hudson.Util.deleteRecursive(Util.java:298)
      	at hudson.Util.deleteContentsRecursive(Util.java:204)
      	at hudson.Util.deleteRecursive(Util.java:298)
      	at hudson.Util.deleteContentsRecursive(Util.java:204)
      	at hudson.Util.deleteRecursive(Util.java:298)
      	at hudson.Util.deleteContentsRecursive(Util.java:204)
      	at hudson.Util.deleteRecursive(Util.java:298)
      	at hudson.Util.deleteContentsRecursive(Util.java:204)
      	at hudson.Util.deleteRecursive(Util.java:298)
      	at hudson.Util.deleteContentsRecursive(Util.java:204)
      	at hudson.Util.deleteRecursive(Util.java:298)
      	at hudson.Util.deleteContentsRecursive(Util.java:204)
      	at hudson.Util.deleteRecursive(Util.java:298)
      	at hudson.Util.deleteContentsRecursive(Util.java:204)
      	at hudson.Util.deleteRecursive(Util.java:298)
      	at hudson.Util.deleteContentsRecursive(Util.java:204)
      	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl$1.execute(CliGitAPIImpl.java:222)
      	... 13 more
      

        Attachments

          Issue Links

            Activity

            Hide
            markewaite Mark Waite added a comment -

            Cristian Cureliuc I'm willing to review a pull request that implements what you've proposed. I don't plan to implement that myself.

            Show
            markewaite Mark Waite added a comment - Cristian Cureliuc I'm willing to review a pull request that implements what you've proposed. I don't plan to implement that myself.
            Hide
            roydahan Roy Dahan added a comment - - edited

            I don't know why we started hitting this lately, but we have the exact same problem.

            Every time we run a job, it tries to clean the workspace before cloning the repo.

            It wasn't the behaviour till recently and I'm not sure what has changed.

            Our job create a directory with some results and when it runs again, it cleans this directory although we didn't want it to.

             

            If this was one intention, one would use the options to clean the workspace.

            Show
            roydahan Roy Dahan added a comment - - edited I don't know why we started hitting this lately, but we have the exact same problem. Every time we run a job, it tries to clean the workspace before cloning the repo. It wasn't the behaviour till recently and I'm not sure what has changed. Our job create a directory with some results and when it runs again, it cleans this directory although we didn't want it to.   If this was one intention, one would use the options to clean the workspace.
            Hide
            markewaite Mark Waite added a comment - - edited

            Roy Dahan you may want to check the agent where that job is running. The removal of the contents only happens on the initial creation of the workspace, not on later requests to update an existing workspace. Something on the agent running the build may be causing the plugin to believe that it needs to perform a fresh clone rather than performing an incremental update.

            If you're using a Pipeline, you may also want to check the Pipeline definition that it does not include a separate call to deleteDir().

            Show
            markewaite Mark Waite added a comment - - edited Roy Dahan you may want to check the agent where that job is running. The removal of the contents only happens on the initial creation of the workspace, not on later requests to update an existing workspace . Something on the agent running the build may be causing the plugin to believe that it needs to perform a fresh clone rather than performing an incremental update. If you're using a Pipeline, you may also want to check the Pipeline definition that it does not include a separate call to deleteDir().
            Hide
            roydahan Roy Dahan added a comment - - edited

            I don't know if it's related, but few lines in the log before the delete it seems like the agent is started.

            It happens every run.

            (It's not a pipeline job)

            [ssh-agent] Looking for ssh-agent implementation...20:02:23 [ssh-agent] Exec ssh-agent (binary ssh-agent on a remote machine)20:02:23 $ ssh-agent*20:02:24* SSH_AUTH_SOCK=/tmp/ssh-3IVCGhG3LDLW/agent.20456*20:02:24* SSH_AGENT_PID=20458*20:02:24* [ssh-agent] Started.
            Show
            roydahan Roy Dahan added a comment - - edited I don't know if it's related, but few lines in the log before the delete it seems like the agent is started. It happens every run. (It's not a pipeline job) [ssh-agent] Looking for ssh-agent implementation...20:02:23 [ssh-agent] Exec ssh-agent (binary ssh-agent on a remote machine)20:02:23 $ ssh-agent*20:02:24* SSH_AUTH_SOCK=/tmp/ssh-3IVCGhG3LDLW/agent.20456*20:02:24* SSH_AGENT_PID=20458*20:02:24* [ssh-agent] Started.
            Hide
            markewaite Mark Waite added a comment -

            The log entry you provided which mentions ssh-agent is from the ssh-agent plugin, not from the Jenkins agent. It is unlikely to be related to the deletion of files which exist in the workspace of a job before the first clone into the workspace.

            This bug report is describing a very specific condition which only exists when the workspace of a job is not empty the very first time that Jenkins uses the workspace. That is quite rare. Freestyle jobs usually create the workspace on the Jenkins agent the first time the job is run, then they reuse that workspace on later execution of the same job. When the workspace is created, it is empty and the deletion that is described in this bug report is harmless.

            There are Jenkins plugins which will allow Freestyle jobs to write files into the workspace after the job starts and before the git repository is cloned into the workspace. The deletion behavior described here will delete those files that are created in the workspace before the git repository is first cloned.

            I was trying to suggest earlier that you should confirm that the workspace where the files are being deleted has not been damaged or partially deleted by some other scripts or changes in your environment.

            Show
            markewaite Mark Waite added a comment - The log entry you provided which mentions ssh-agent is from the ssh-agent plugin, not from the Jenkins agent. It is unlikely to be related to the deletion of files which exist in the workspace of a job before the first clone into the workspace. This bug report is describing a very specific condition which only exists when the workspace of a job is not empty the very first time that Jenkins uses the workspace. That is quite rare. Freestyle jobs usually create the workspace on the Jenkins agent the first time the job is run, then they reuse that workspace on later execution of the same job. When the workspace is created, it is empty and the deletion that is described in this bug report is harmless. There are Jenkins plugins which will allow Freestyle jobs to write files into the workspace after the job starts and before the git repository is cloned into the workspace. The deletion behavior described here will delete those files that are created in the workspace before the git repository is first cloned. I was trying to suggest earlier that you should confirm that the workspace where the files are being deleted has not been damaged or partially deleted by some other scripts or changes in your environment.

              People

              • Assignee:
                Unassigned
                Reporter:
                haus Matthaus Owens
              • Votes:
                4 Vote for this issue
                Watchers:
                10 Start watching this issue

                Dates

                • Created:
                  Updated: