在Jenkins声明式流水线中,是否有可能检查是否从特定代码库签出?

3
我希望我的Jenkinsfile中有一个发布阶段,仅在从原始代码库中检出时运行。这是为了避免在克隆的代码库上由于缺失密钥等问题而导致错误消息的出现。请注意保留HTML标记。
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语法: when,但不知道如何实现我想要的测试。

我考虑使用环境变量全局变量参考,但没有找到包含存储库URL的变量。

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

1个回答

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管道公开了一个名为“scm”的对象(您可以在管道内部执行“println scm.dump()”来进行调查)。没有通用的API表示存储库URL - 您可以将“GitSCM”(https://javadoc.jenkins.io/plugin/git/hudson/plugins/git/GitSCM.html)与“SubversionSCM”(https://github.com/jenkinsci/subversion-plugin/blob/master/src/main/java/hudson/scm/SubversionSCM.java)进行比较。 - Szymon Stepniak
只是为了明确,我不想在单个流水线中混合两个或多个版本控制系统 - 我只想拥有一个(版本控制系统)独立的解决方案,可以在每个版本控制系统中重复使用。 - PowerStat
无论我做什么(路径、工具设置等),都会出现“找不到git命令”的提示。 - PowerStat
@PowerStat,看起来你的工作节点没有安装git客户端。有一种替代方法可以获取repo URL。请查看更新后的答案。 - Szymon Stepniak
好的,第二个变量以 Scripts not permitted to use method hudson.plugins.git.GitSCM getUserRemoteConfigs. 结尾。 - PowerStat
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接