我正试图找出一种方法来获得远程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()