Is it impossible to checkout a different branch in Jenkinsfile?

前端 未结 5 2105
耶瑟儿~
耶瑟儿~ 2021-02-05 08:03

I have two branches on BitBucket: master and develop. I\'ve also got a BitBucket Team Folder job configured on my Jenkins server to build that reposito

相关标签:
5条回答
  • 2021-02-05 08:18

    You can use the intrinsic function in Jenkins Pipeline created for Git cloning and pulling. I would also suggest cloning the branches into separate directories.

    checkout([$class: 'GitSCM',
      branches: [[name: '*/branch_name']],
      doGenerateSubmoduleConfigurations: false,
      extensions: [[$class: 'RelativeTargetDirectory',
        relativeTargetDir: 'different_directory']],
      submoduleCfg: [],
      userRemoteConfigs: [[url: 'git@github.domain:org/repo.git']]])
    
    0 讨论(0)
  • 2021-02-05 08:25

    The problem is that Jenkins is defining the origin with only the branch that is discovered.

    @swoop81 answer is working but if you just want to checkout one branch, you could fetch only this one.

    git config --add remote.origin.fetch +refs/heads/<branch-name>:refs/remotes/origin/<branch-name>
    git fetch --no-tags https://<github-url> +refs/heads/<branch-name>:refs/remotes/origin/<branch-name>
    
    0 讨论(0)
  • 2021-02-05 08:30

    You can use the git command which is the less advanced version of the checkout command

    stage('Repo Checkout') {
                steps {
                    deleteDir()
                    dir("repo-one-master") {
                        git url: "ssh://git@host.com/folder/project",
                            branch: 'master'
                    }
                    dir("repo-one-feature) {
                        git url: "ssh://git@host.com/folder/project",
                            branch: 'some-branch'
                    }
                }
            }
    
    0 讨论(0)
  • 2021-02-05 08:36

    I could not get the two answers above to work. I was triggering a Jenkins pipeline job by specifying a branch and was trying to checkout another branch (develop) in the job which was failing with:

    error: pathspec 'develop' did not match any file(s) known to git.
    

    I could see this in the failing job, which indicated that only the triggering branch was being fetched:

    git fetch --no-tags --progress https://<github URL> +refs/heads/branch-name:refs/remotes/origin/branch-name
    

    I got it to work by changing the remote fetch config and fetching all branches by doing the following after doing just the default checkout scm step in the triggered job's Jenkinsfile:

    sh """
        git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
        git fetch --all
    """
    

    This is thanks to this answer https://stackoverflow.com/a/39986737/1988883

    This also avoids having to configure Jenkins for GitSCM script approvals which I had to do for trying out the two solutions above

    0 讨论(0)
  • 2021-02-05 08:37

    After some hours of trial and error, I came up with a possible solution. It builds partly on Matt's answer, but I had to alter it to make it work.

    Matt was correct in the essentials: checkout scm simply wasn't flexible enough to allow me to do what I needed, so I had to use GitSCM to customize it. The major points of interest are:

    • Added extension LocalBranch to make sure I check out to an actual branch, and not just a detached HEAD.
    • Added extension WipeWorkspace to delete everything in the workspace and force a complete clone. I don't think this was a part of the solution to my question, but it was still handy to have.
    • Specified the SSH credentials using the credentialsId property since the repository is private.

    For whatever reason, when the checkout step is executed, it only checks out the branch, but does not set it to track the remote branch. Until I find a more elegant solution, I had to do this manually.

    After all that was done, I could use regular sh "git checkout master" and even sh "git push", as long as I enclosed them in an sshagent step.

    I added a working example of the resulting Jenkinsfile below, but please keep in mind that it shouldn't be used for anything close to production as it's still very much in its infancy; hardcoded version numbers and no checks for which branch you're in, for example.

    node {
        mvnHome = tool 'Maven'
        mvn = "${mvnHome}/bin/mvn"
    
        stage('Checkout') {
            checkout([
                $class: 'GitSCM',
                branches: scm.branches,
                extensions: scm.extensions + [[$class: 'LocalBranch'], [$class: 'WipeWorkspace']],
                userRemoteConfigs: [[credentialsId: 'Bitbucket', url: 'git@bitbucket.org:NAVFREG/jenkinsfile-tests.git']],
                doGenerateSubmoduleConfigurations: false
            ])
        }
    
        stage('Release') {
            // Preparing Git
            sh "git branch -u origin/develop develop"
            sh "git config user.email \"jenkins@thomaskasene.com\""
            sh "git config user.name \"Jenkins\""
    
            // Making and committing new verison
            sh "${mvn} versions:set -DnewVersion=2.0.0 -DgenerateBackupPoms=false"
            sh "git commit -am \"Released version 2.0.0\""
    
            // Merging new version into master
            sh "git checkout master"
            sh "git merge develop"
            sh "git checkout develop"
    
            // Making and committing new snapshot version
            sh "${mvn} versions:set -DnewVersion=3.0.0-SNAPSHOT -DgenerateBackupPoms=false"
            sh "git commit -am \"Made new snapshot version 3.0.0-SNAPSHOT\""
    
            // Pushing everything to remote repository
            sshagent(['Bitbucket']) {
                sh "git push"
                sh "git checkout master"
                sh "git push"
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题