Checkout failure on Windows

122 views
Skip to first unread message

Patrick Moran

unread,
Jan 29, 2021, 3:25:59 PM1/29/21
to jenkins...@googlegroups.com

Hello,

 

I have installed Jenkins on my Windows 10 machine, created a pipeline and run it. When it runs I get a message "ERROR: Unable to retrieve commit message"  when I try to checkout the last commit. The commit number is correct and I can run the steps listed in the console output by hand without the error. Does anyone know why I am getting this error?

I am using Jenkins 2.263.3 and Git plugin 4.5.2.

Note that I get the same error whether I use a pipeline or freestyle project. I am not checking out the master branch, does that matter?

The pipeline used (credentials and repo url XXXX'ed out):

#!/usr/bin/env groovy

 

    pipeline {

        agent any

        stages {

            stage('Checkout') {

                steps {

                    checkout([

                        $class: 'GitSCM',

                        branches: [[name: 'feature/test-PM']],

                        userRemoteConfigs: [[credentialsId: 'XXXXXX', url: 'XXXXXX']]

                    ])               

                }  

            }

            stage('Build') {

                steps {

                    echo "Build is $BUILD_NUMBER : Node name is $NODE_NAME"

                }

            }

            stage('Test'){

                steps {

                    echo 'Testing...'

                }

            }

            stage('Deploy') {

                steps {

                    echo 'Deploying...'

                }

            }

        }

    }

 

 

The pipeline output (credentials and repo url XXXX'ed out):

 

Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in C:\Windows\system32\config\systemprofile\AppData\Local\Jenkins\.jenkins\workspace\TestBuild1
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Checkout)
[Pipeline] checkout
The recommended git tool is: NONE
using credential XXXXXX
Cloning the remote Git repository
Cloning repository XXXXXX
 > git.exe init C:\Windows\system32\config\systemprofile\AppData\Local\Jenkins\.jenkins\workspace\TestBuild1 # timeout=10
Fetching upstream changes from XXXXXX
 > git.exe --version # timeout=10
 > git --version # 'git version 2.30.0.windows.2'
using GIT_ASKPASS to set credentials 
 > git.exe fetch --tags --force --progress -- XXXXXX +refs/heads/*:refs/remotes/origin/* # timeout=10
 > git.exe config remote.origin.url XXXXXX # timeout=10
 > git.exe config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10
Avoid second fetch
 > git.exe rev-parse "refs/remotes/origin/feature/test-PM^{commit}" # timeout=10
 > git.exe rev-parse "feature/test-PM^{commit}" # timeout=10
Checking out Revision aeb4a265be3a3a7b1b5fc4dd655c9f0dc6f284fa (refs/remotes/origin/feature/test-PM)
 > git.exe config core.sparsecheckout # timeout=10
 > git.exe checkout -f aeb4a265be3a3a7b1b5fc4dd655c9f0dc6f284fa # timeout=10
ERROR: Unable to retrieve commit message
org.eclipse.jgit.errors.MissingObjectException: Missing unknown aeb4a265be3a3a7b1b5fc4dd655c9f0dc6f284fa
    at org.eclipse.jgit.internal.storage.file.WindowCursor.open(WindowCursor.java:135)
    at org.eclipse.jgit.lib.ObjectReader.open(ObjectReader.java:203)
    at org.eclipse.jgit.revwalk.RevWalk.parseAny(RevWalk.java:917)
    at org.eclipse.jgit.revwalk.RevWalk.parseCommit(RevWalk.java:827)
    at hudson.plugins.git.util.RevCommitRepositoryCallback.invoke(RevCommitRepositoryCallback.java:25)
    at hudson.plugins.git.util.RevCommitRepositoryCallback.invoke(RevCommitRepositoryCallback.java:13)
    at org.jenkinsci.plugins.gitclient.AbstractGitAPIImpl.withRepository(AbstractGitAPIImpl.java:29)
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.withRepository(CliGitAPIImpl.java:84)
    at hudson.plugins.git.GitSCM.printCommitMessageToLog(GitSCM.java:1394)
    at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1360)
    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)
 > git.exe rev-list --no-walk aeb4a265be3a3a7b1b5fc4dd655c9f0dc6f284fa # timeout=10
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Build)
[Pipeline] echo
Build is 37 : Node name is master
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] echo
Testing...
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Deploy)
[Pipeline] echo
Deploying...
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

 

Mark Waite

unread,
Jan 29, 2021, 3:33:24 PM1/29/21
to Jenkins Users
May want to try "origin/feature/test-PM" instead

--
You received this message because you are subscribed to the Google Groups "Jenkins Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to jenkinsci-use...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/jenkinsci-users/CAGu5ryKes3fD-mVZBOPsDBi50LgtcO0F%3D9UsUd_tHc%3Dae%3DPatg%40mail.gmail.com.

Patrick Moran

unread,
Jan 29, 2021, 4:00:08 PM1/29/21
to Jenkins Users
Thanks for the reply Mark. I updated my pipeline script branch setting in the checkout step to "origin/feature/test-PM" but the output was the same.

...
stage('Checkout') {
    steps {
                checkout([
                    $class: 'GitSCM', 
                    branches: [[name: 'origin/feature/test-PM']], 
                    userRemoteConfigs: [[credentialsId: 'b5255326-bc83-40e7-847d-d4bd6a597f40', url: 'https://git.virtualincision.net/scm/a4sw/surgeon-console-software.git']]
                ])                
    }   
}
...

Mark Waite

unread,
Jan 29, 2021, 8:21:41 PM1/29/21
to Jenkins Users
I made my best guess at the steps you took and was unable to duplicate the problem.  You'll need to provide more details of the steps you took and how your system is configured.  Steps I took included (with no claim that any of these steps are especially crucial, they just happen to be the steps that I took):
  • Installed PortableGit-2.30.0.2 in C:\J\Tools\PortableGit-2.30.0.2 and added  C:\J\Tools\PortableGit-2.30.0.2\bin to my PATH
  • Installed AdoptOpenJDK Java 8u282 in C:\J\Tools\jfk8u282-b08 and added C:\J\Tools\jfk8u282-b08\bin  to my PATH and  C:\J\Tools\jfk8u282-b08 as JAVA_HOME
  • Download Jenkins 2.264.4-rc to my Windows 10 computer (used that version because I wanted to also test that version)
  • Run jenkins with the command "java -jar jenkins.war" from a Windows Command Prompt
  • Create a GitHub Personal Access Token on my GitHub account with full permissions
  • Define a Jenkinsfile in the feature/test-PM branch of my https://github.com/MarkEWaite/bin.git repository
  • Create a Pipeline job that uses the personal access token to clone the feature/test-PM branch of my https://github.com/MarkEWaite/bin.git repository using the personal access token
  • Confirm that the Pipeline job checkout works as expected
  • Create a Multibranch Pipeline job with Git as the branch provider for the  https://github.com/MarkEWaite/bin.git repository using the personal access token
  • Confirm that the Multibranch Pipeline job checkout with Git works as expected
  • Create a Multibranch Pipeline job with GitHub as the branch provider for the  https://github.com/MarkEWaite/bin.git repository using the personal access token
  • Confirm that the Multibranch Pipeline job checkout with GitHub works as expected
  • Create a Multibranch Pipeline job with single source as the branch provider for the  https://github.com/MarkEWaite/bin.git repository using the personal access token
  • Confirm that the Multibranch Pipeline job with single source works as expected

The declarative Pipeline Jenkinsfile I used and permuted in various ways was:

pipeline {
  agent {
    label 'windows'
  }

  options {
    skipDefaultCheckout true
  }

  stages {
    stage('Build') {
      steps {
        echo 'Building'

        checkout([$class: 'GitSCM',
                  branches: [[name: 'feature/test-PM']],
                  userRemoteConfigs: [[credentialsId: 'github-access-token',
                                       url: 'https://github.com/MarkEWaite/bin.git']]])
        bat 'type ngrok.yml'
      }
    }

    stage('Test') {
      steps {
        echo 'Testing'
        bat 'type docker_scrub.sh'
      }
    }

    stage('Deploy') {
      steps {
        echo 'Deploying'
        bat 'type inbound-jenkins-agent-alpine'
      }
    }
  }
}


Patrick Moran

unread,
Jan 29, 2021, 9:47:53 PM1/29/21
to jenkins...@googlegroups.com
Thanks Mark! I am new to Jenkins so it may take me a while to go through everything you’ve done here. 

On Jan 29, 2021, at 7:21 PM, Mark Waite <mark.ea...@gmail.com> wrote:



Patrick Moran

unread,
Feb 1, 2021, 3:54:03 PM2/1/21
to Jenkins Users
Mark,

I tried to reproduce your steps as best I could. 
- I already have git, java and jenkins installed so I did not re-install them. 
- I added the git and java paths to the jenkins configuration. 
- I replaced my repo with a public repo on GitHub since it looks like I would need credentials to access yours. 

I still get the same error. 

I did notice the following:

- If I add a bat 'dir' command to the test stage, it shows that the directory is the jenkins working directory, but there are no files in that directory. 
- Once the pipeline has completed, I can look at the jenkins working directory and see all the files I expect to be there.
- If I try to run a batch file from the repo in the test stage (or any other stage), I get an error that the file does not exist. 
- If I try to run a batch file from a different directory on the machine it successfully runs that batch file.

It seems like the checkout has not actually cloned the repo to my jenkins workspace while running the pipeline, but that the files are there when the pipeline has finished. Is this correct?

Thanks,
Pat

Mark Waite

unread,
Feb 1, 2021, 8:01:59 PM2/1/21
to Jenkins Users
On Mon, Feb 1, 2021 at 1:54 PM Patrick Moran wrote:
Mark,

I tried to reproduce your steps as best I could. 
- I already have git, java and jenkins installed so I did not re-install them. 
- I added the git and java paths to the jenkins configuration. 
- I replaced my repo with a public repo on GitHub since it looks like I would need credentials to access yours. 

I still get the same error. 

I did notice the following:

- If I add a bat 'dir' command to the test stage, it shows that the directory is the jenkins working directory, but there are no files in that directory. 
- Once the pipeline has completed, I can look at the jenkins working directory and see all the files I expect to be there.
- If I try to run a batch file from the repo in the test stage (or any other stage), I get an error that the file does not exist. 
- If I try to run a batch file from a different directory on the machine it successfully runs that batch file.

It seems like the checkout has not actually cloned the repo to my jenkins workspace while running the pipeline, but that the files are there when the pipeline has finished. Is this correct?


Since you didn't share your Pipeline definition file, it is difficult to state what should be expected.  In the declarative Pipeline definition that I shared, the option " skipDefaultCheckout true " is enabled.  When that is enabled, then the declarative pipeline does not perform a checkout implicitly when it starts.  Without the skipDefaultCheckout true option, the declarative pipeline performs a checkout step on the agent before any other steps.  If you are using a scripted pipeline, then there is no default checkout.

The sequence of execution is something like:
  1. Jenkins controller finds the Jenkinsfile in the repository and requests a copy of the Jenkinsfile
  2. Jenkins controller begins executing the Jenkinsfile
  3. If the Jenkinsfile is a declarative pipeline and skipDefaultCheckout is not enabled, then an implicit checkout scm is performed on the agent
  4. Other steps in the Jenkinsfile are executed
Mark Waite
 

Patrick Moran

unread,
Feb 1, 2021, 9:38:24 PM2/1/21
to Jenkins Users
I am using a declarative pipeline. It's not in a Jenkinsfile, however.

Thanks,
Pat

The last pipeline definition I used is below:

pipeline {
  agent any

  stages {
    stage('Build') {
      steps {
        echo 'Building'

        checkout([$class: 'GitSCM',
                  branches: [[name: '*/master']],
                  userRemoteConfigs: [[url: 'https://github.com/sixeyed/jenkins-pipeline-demos.git']]])
      }
    }

    stage('Test') {
      steps {
        echo 'Testing'
      }
    }

    stage('Deploy') {
      steps {
        echo 'Deploying'
        bat 'dir'
      }
    }
  }
}

Mark Waite

unread,
Feb 1, 2021, 10:02:23 PM2/1/21
to Jenkins Users
On Mon, Feb 1, 2021 at 7:38 PM Patrick Moran <patmor...@gmail.com> wrote:
I am using a declarative pipeline. It's not in a Jenkinsfile, however.

Thanks,
Pat

The last pipeline definition I used is below:

pipeline {
  agent any

  stages {
    stage('Build') {
      steps {
        echo 'Building'

        checkout([$class: 'GitSCM',
                  branches: [[name: '*/master']],
                  userRemoteConfigs: [[url: 'https://github.com/sixeyed/jenkins-pipeline-demos.git']]])
      }
    }

    stage('Test') {
      steps {
        echo 'Testing'
      }
    }

    stage('Deploy') {
      steps {
        echo 'Deploying'
        bat 'dir'
      }
    }
  }
}


I used that same Pipeline definition on my Windows 10 desktop computer as the Jenkins controller and using a Windows agent from a Linux Jenkins controller.  Both worked as expected.

I wonder if there is some additional process on your computer that blocks access to the repository shortly after it has been downloaded.  For example, sometimes virus scanners on Windows can make files on the file system temporarily unavailable.  Alternately, sometimes users attempt to use a network attached storage device for their Jenkins workspace.  In that case, the file locking semantics expected by git may not be supported by the underlying file system.

The stack trace is indicating that the contents of a local file cannot be read by JGit or that the contents cannot be found, even though they were just downloaded by command line git.

You might also try replacing the "checkout scm" step with "git 'https://github.com/sixeyed/jenkins-pipeline-demos.git'".  It should show the same failure, since it runs the same basic checkout code, but it is a low cost thing to check.

Mark Waite
 

Patrick Moran

unread,
Feb 2, 2021, 5:19:27 PM2/2/21
to Jenkins Users
Mark,

I tried using the git command and stopping my anti-virus as suggested but without success. I experimented some more and discovered an empty Jenkins workspace under the SysWOW64 directory. It looks like Jenkins was cloning the repo to the 64 bit directory but then calling the 'dir' command (and attempting to run batch files) from the redirected SysWow64 directory. After a Google search about this, I found the following: https://stackoverflow.com/questions/47697743/jenkins-run-windows-batch-commands-in-32-bit-mode. I re-installed a 64 bit version of Java and re-installed Jenkins. It is now using the 64 bit workspace for everything...no "ERROR: Unable to retrieve commit message" and batch files are working.

Thanks so much for all your help with this issue!

Regards,
Pat

Mark Waite

unread,
Feb 2, 2021, 5:28:55 PM2/2/21
to Jenkins Users
Thanks for sharing an issue with 32 bit Java on Windows.  I hadn't considered even asking if you were running 32 bit Java.  I'd not heard of that problem before.  I'm glad you found the solution.

Reply all
Reply to author
Forward
0 new messages