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

Git fetch fails if submodule URL changed

    Details

    • Type: Bug
    • Status: Open (View Workflow)
    • Priority: Minor
    • Resolution: Unresolved
    • Component/s: git-plugin
    • Labels:
      None
    • Environment:
      Jenkins 2.235.1
      git-plugin 4.3.0
      git-client-plugin 3.3.1
      git 2.21
    • Similar Issues:

      Description

      If the submodule URL is changed, and submodule SHA is updated on fetch, fetch tries to download the submodule by the old URL, and fails as follows:

      Fetching changes from the remote Git repository
       ERROR: Error fetching remote repo 'origin'
       hudson.plugins.git.GitException: Failed to fetch from ssh://url
       	at hudson.plugins.git.GitSCM.fetchFrom(GitSCM.java:909)
       	at hudson.plugins.git.GitSCM.retrieveChanges(GitSCM.java:1131)
       	at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1167)
       	at org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:125)
       	at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:93)
       	at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:80)
       	at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:47)
       	at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
       	at java.util.concurrent.FutureTask.run(Unknown Source)
       	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
       	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
       	at java.lang.Thread.run(Unknown Source)
       Caused by: hudson.plugins.git.GitException: Command "/path/to/git fetch --tags --force --progress -- ssh://url refs/changes/76/20076/8" returned status code 1:
       From ssh://url
        * branch            refs/changes/76/20076/8 -> FETCH_HEAD
       Fetching submodule 3rdparty/library
       remote: 
       remote: ========================================================================
       remote: 
       remote: Internal API unreachable
       remote: 
       remote: ========================================================================
       remote: 
       fatal: Could not read from remote repository.
       
       Please make sure you have the correct access rights
       and the repository exists.
       remote: 
       remote: ========================================================================
       remote: 
       remote: Internal API unreachable
       remote: 
       remote: ========================================================================
       remote: 
       fatal: Could not read from remote repository.
       
       Please make sure you have the correct access rights
       and the repository exists.
       
       	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2430)
       	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandWithCredentials(CliGitAPIImpl.java:2044)
       	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.access$500(CliGitAPIImpl.java:81)
       	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl$1.execute(CliGitAPIImpl.java:569)
       	at org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:161)
       	at org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:154)
       	at hudson.remoting.UserRequest.perform(UserRequest.java:211)
       	at hudson.remoting.UserRequest.perform(UserRequest.java:54)
       	at hudson.remoting.Request$2.run(Request.java:369)
       	at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:72)
       	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)
       	Suppressed: hudson.remoting.Channel$CallSiteStackTrace: Remote call to opal
       		at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1788)
       		at hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:356)
       		at hudson.remoting.Channel.call(Channel.java:998)
       		at org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.execute(RemoteGitImpl.java:146)
       		at sun.reflect.GeneratedMethodAccessor400.invoke(Unknown Source)
       		at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
       		at java.lang.reflect.Method.invoke(Unknown Source)
       		at org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.invoke(RemoteGitImpl.java:132)
       		at com.sun.proxy.$Proxy80.execute(Unknown Source)
       		at hudson.plugins.git.GitSCM.fetchFrom(GitSCM.java:907)
       		at hudson.plugins.git.GitSCM.retrieveChanges(GitSCM.java:1131)
       		at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1167)
       		at org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:125)
       		at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:93)
       		at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:80)
       		at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:47)
       		at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
       		at java.util.concurrent.FutureTask.run(Unknown Source)
       		at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
       		at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
       		at java.lang.Thread.run(Unknown Source)

      The issue is: Git by default fetches with fetch.recurseSubmodules = on-demand. If updates to the submodule SHA and updates to the URL aren't separate fetch events, Git will try to download the new commit by the old URL.

      My suggestion is: make git always use git fetch --recurse-submodules=no. The Jenkins Git script already does the correct steps after checkout is done - git submodule sync; git submodule update.

        Attachments

          Activity

          Hide
          markewaite Mark Waite added a comment -

          There are so many ways that submodule updates can break that you may want to apply the workaround of deleting the workspace when a submodule URL changes.

          Show
          markewaite Mark Waite added a comment - There are so many ways that submodule updates can break that you may want to apply the workaround of deleting the workspace when a submodule URL changes.

            People

            • Assignee:
              Unassigned
              Reporter:
              oktuba Olga K
            • Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

              • Created:
                Updated: