【问题标题】:Is it possible to check if checked out from a specific repository in a Jenkins declarative pipeline?是否可以检查是否从 Jenkins 声明性管道中的特定存储库签出?
【发布时间】:2019-07-05 08:43:19
【问题描述】:

我想在我的 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。

所以我的问题是:如何在声明式管道中实现此检查?

【问题讨论】:

    标签: jenkins jenkins-pipeline


    【解决方案1】:

    您可以从git config remote.origin.url 命令获取远程存储库 URL。您可以使用 when 块内的 expression 指令执行此命令 - 它定义了一个返回 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..."
                }
            }
        }
    }
    

    【讨论】:

    • 谢谢,我会试试这个。此外,我在 Jenkins 提出了一个功能请求,因为我想拥有版本控制系统的独立性。 issues.jenkins-ci.org/browse/JENKINS-58366
    • 我不确定这种期望是否有效。您从单个存储库运行构建管道,因此没有空间在单个管道中混合两个(或更多)VCS 系统。 Jenkins 管道公开了一个对象scm(你可以在你的管道中做println scm.dump() 来调查它)。没有表示存储库 URL 的通用 API - 您可以将 GitSCM (javadoc.jenkins.io/plugin/git/hudson/plugins/git/GitSCM.html) 与 SubversionSCM (github.com/jenkinsci/subversion-plugin/blob/master/src/main/…) 进行比较。
    • 为简单起见,您始终可以在共享变量中定义git config remote.origin.url 命令,这样您就可以从一个地方访问它。但我不希望隐含地公开此类信息(存储库 URL)。父 SCM 类没有定义这样的属性 - javadoc.jenkins-ci.org/hudson/scm/SCM.html 我猜作者这样设计它是有原因的。
    • 为了清楚起见,我不想在单个管道中混合两个或多个 vcs 系统 - 我只想拥有一个可以与每个 vcs 一起重用的(vcs)独立解决方案。
    • 无论我做什么(路径、工具设置等),我都会得到git command not found
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2011-02-19
    • 1970-01-01
    相关资源
    最近更新 更多