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

Git fetch fails if submodule URL changed

    XMLWordPrintable

Details

    • Bug
    • Status: Closed (View Workflow)
    • Minor
    • Resolution: Duplicate
    • git-plugin
    • None
    • Jenkins 2.235.1
      git-plugin 4.3.0
      git-client-plugin 3.3.1
      git 2.21

    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

        Issue Links

          Activity

            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.

            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.
            markewaite Mark Waite added a comment -

            Closed as duplicate of JENKINS-15399

            markewaite Mark Waite added a comment - Closed as duplicate of JENKINS-15399

            People

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

              Dates

                Created:
                Updated:
                Resolved: