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

Git fetch fails if submodule URL changed

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Duplicate
    • Icon: Minor Minor
    • git-plugin
    • None
    • Jenkins 2.235.1
      git-plugin 4.3.0
      git-client-plugin 3.3.1
      git 2.21

      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.

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

              Created:
              Updated:
              Resolved: