是否可以检查是否从Jenkins声明性管道中的特定存储库中签出?

时间:2019-07-05 08:43:19

标签: jenkins jenkins-pipeline

我想在Jenkinsfile中有一个发布阶段,该阶段仅在从原始存储库中检出时才运行。这是为了避免由于缺少存储库密钥等而导致克隆存储库上出现错误消息。

stage('Release')
 {
  when
   {
    allOf 
     {
      // TODO Check for repository url https://github.com/PowerStat/TemplateEngine.git
      branch 'master'
     }
   }
  steps
   {
    script
     {
      if (isUnix()) 
       {           
        sh 'mvn --batch-mode release:clean'
        sh 'mvn --batch-mode release:prepare'
        sh 'mvn --batch-mode release:perform'
       }
      else
       {
        bat 'mvn --batch-mode release:clean'
        bat 'mvn --batch-mode release:prepare'
        bat 'mvn --batch-mode release:perform'
       }
     }
   }
 }

我已经研究过Pipeline Syntax: when,但不知道如何进行自己想要的测试。

我还考虑过使用环境变量Global Variable Reference,但发现其中没有存储库URL。

所以我的问题是:如何在无标度管道中实施此检查?

1 个答案:

答案 0 :(得分:1)

您可以从git config remote.origin.url命令获取远程存储库URL。您可以使用expression块内的when指令执行此命令-它定义了一个返回boolean值的闭包。

考虑以下示例:

def expectedRemoteUrl = "https://github.com/PowerStat/TemplateEngine.git"

pipeline {
    agent any

    stages {
        stage("Release") {
            when {
                allOf {
                    branch 'tmp'
                    expression {
                        def remoteUrl = isUnix() ?
                            sh(script: "git config remote.origin.url", returnStdout: true)?.trim() :
                            bat(script: "git config remote.origin.url", returnStdout: true)?.trim()

                        return expectedRemoteUrl == remoteUrl
                    }
                }
            }

            steps {
                echo "Do your release steps here..."
            }
        }
    }
}

或者,如果在运行管道的节点中没有git命令,则可以使用scm.userRemoteConfigs?.first()?.url获取远程存储库URL。考虑以下示例:

def expectedRemoteUrl = "https://github.com/PowerStat/TemplateEngine.git"

pipeline {
    agent any

    stages {
        stage("Release") {
            when {
                allOf {
                    branch 'tmp'
                    expression {
                        def remoteUrl = scm.userRemoteConfigs?.first()?.url

                        return expectedRemoteUrl == remoteUrl
                    }
                }
            }

            steps {
                echo "Do your release steps here..."
            }
        }
    }
}