在jenkins作业中使用git的repo名称作为ENV变量



我正试图找出一种方法来获得远程git项目名称在詹金斯工作作为一个环境变量。我想使用项目名称作为"本地子目录名称"时,詹金斯克隆的repo。有办法做到这一点吗?

可能是${GIT_REPO_NAME}

我知道有${GIT_REPO_URL},它包括项目名称,但我需要能够在本地子目录字段中使用它。

如果有人有更好的解决办法,我洗耳恭听。

谢谢!

下面是一个简单的一行代码:

env.GIT_REPO_NAME = env.GIT_URL.replaceFirst(/^.*/([^/]+?).git$/, '$1')

/^.*/([^/]+?).git$/是一个正则表达式,它只创建一个反向引用的回购名称。

^.*?(?:://.*?/|:)(.*).git$如果您想获得完整的repo路径,则对http和ssh使用此模式{owner}/{repo_name}

不确定这是否适用于您的特定用例,但我想我将提供它,以防万一:

默认情况下,Jenkins会将git repo克隆到作业的工作区的根目录。然后你可以在任何脚本中使用内置的$WORKSPACE (Jenkins设置)来引用git根目录,我发现使用它非常简单。

我是这样做的:

在构建流中使用DSL,我在变量中获取GIT_URL,如下所示:

"def projectName = build.environment.get("GIT_URL").replaceAll('https://github.com/', '').replaceAll('.git', '')"

在这种情况下,我使用了额外的replaceAll('/','-'),因为我想在projectName中保留组织名称。

否则,您可以使用额外的replaceAll或使用.substring(x,y)字符串函数获取子字符串来删除它。

最后,您可以将projectName存储在Jenkins参数中,以便将该值传播到由流触发的其他构建中。

你也可以用projectName值设置Env变量,但我不会使用这个方法,因为你用jenkins用户设置它。

以下是我在Github组织构建中使用的代码:

def projectName() {
  // Handle branch builds
  if (env.JOB_BASE_NAME == java.net.URLEncoder.encode(env.BRANCH_NAME)) {
    jobNameSplit = env.JOB_NAME.split("/")
    switch (jobNameSplit.size()) {
      case 1:
        // project name == branch name ¯_(ツ)_/¯
        break
      case 2:
      case 3:
        return jobNameSplit[1]
        break
      default:
        throw Error("unable to get job name")
        break
    }
  }
  return env.JOB_BASE_NAME
}

默认为作业名称,所以即使你不使用github组织插件,但使用与你的git repo名称匹配的作业名称,你应该都设置好了。

我用env.REPO_NAME = env.GIT_URL.replace('.git', '').split('/').last()

最新更新