在詹金斯构建上获取本地GIT分支

时间:2019-05-30 12:46:51

标签: shell maven jenkins

我们正在开发多种功能,其中之一是开发,发布和掌握GIT分支。我们为所有JIRA开发任务创建单独的功能分支。我需要让Jenkins建立工作来轮询所有功能分支,并建立那些具有最近PUSH事件的特定分支。启动构建作业后,我希望获取特定的GIT功能分支名称(即JIRA-1234,而不是origin / feature / JIRA-1234),并将其作为APP-0.0.1-JIRA-包含在工件文件名中。 1234-SNAPSHOT,并将其保存到Nexus。

NB:POM.XML文件使用APP-0.0.1-SNAPSHOT配置。

对于每个功能分支版本,我们希望将单独的jar文件保存到Nexus。例如:JIRA-0101下的开发任务将在jar中将jar生成并保存为APP-0.0.1-JIRA-0101-SNAPSHOT

我在POM.xml中包含了$ {branch}参数,如下所示: APP-0.0.1 $ {branch}-快照

并通过Jenkins build命令将该值传递为-mvn clean install -Dbranch = -JIRA-0101

然后我对jenkins构建任务进行了参数化,之后我可以将功能分支名称命名为“ origin / feature / JIRA-0101”,但是我无法在Jenkins中解析整个字符串以仅选择JIRA任务。

其次,mvn jgitflow:release-start和mvn jgitflow:release-finish命令会在POM.xml中产生带有“ APP-0.0.1 $ {branch} -SNAPSHOT”的并发症。因此,在POM中使用$ {branch}无效。

2 个答案:

答案 0 :(得分:0)

我对jgitflow流程并不熟悉,因此我将尝试阅读并定制答案,但是现在我想向您指出这篇关于进行Maven部署的非常好的文章-{{3} }。这篇文章讨论了在pom文件中使用外部设置的版本-他们在代码库中嵌入了“默认的”属性。

    <properties>
        <!-- Sane default when no revision property is passed in from the commandline -->
        <revision>0-SNAPSHOT</revision>
    </properties>

然后,他们在其<build>描述中引用该属性

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-scm-plugin</artifactId>
                <version>1.9.4</version>
                <configuration>
                    <tag>${project.artifactId}-${project.version}</tag>
                </configuration>
            </plugin>
        </plugins>
    </build>

调用Maven时,他们从CI服务器-mvn deploy scm:tag -Drevision=$BUILD_NUMBER

向其传递自定义参数。

我敢肯定,使用jgitflow插件,您可以拥有与上述配置类似的内部属性,但可以将其用作jgitflow版本的一部分,并将分支信息传递到构建中。

---对反馈的响应---

如果您只是尝试提取分支标识符的最后一部分,则有几种方法可以执行。如果仅是最后一个/之后的所有内容,则可以使用basename实用程序。

$ BRANCH="origin/feature/JIRA-0101"
$ basename $BRANCH
JIRA-0101

您可以使用期望ASDF-1234样式模式的正则表达式来更具体

$ echo $BRANCH | sed -e 's|.*/\([A-Z]*-[0-9]*\)$|\1|g'
JIRA-0101

如果要将以上内容捕获到一个新变量中,则可以使用子外壳,直接在对maven的调用中

mvn clean install -Dbranch=$(echo $BRANCH | sed -e 's|.*/\([A-Z]*-[0-9]*\)$|\1|g')

或将其存储在您可以测试以验证其为非零长度的中间变量中

JIRA_ID=$(echo $BRANCH | sed -e 's|.*/\([A-Z]*-[0-9]*\)$|\1|g')
[[ -z "${JIRA_ID}" ]] && echo "Unable to determine JIRA_ID" && exit 1
mvn clean install -Dbranch=${JIRA_ID}

如果您需要将变量传递到其他步骤(如果直接使用maven插件),则将需要类似于Maven Release Plugin: Dead and Buried envinject环境注入插件的插件。 >

答案 1 :(得分:0)

如果我做对了,您希望您的Jenkins自动建立在推送事件上,并成功地将target文件夹发布到您的关系中。如果是这种情况,我建议您使用一些JenkinsFile https://jenkins.io/doc/book/pipeline/jenkinsfile/的jenkins插件,研究一种更高级的名为Multibranch pipelinehttps://wiki.jenkins.io/display/JENKINS/Pipeline+Multibranch+Plugin)的东西,该插件可以自动检测所有存储库中的分支,并为每个分支设置一个作业。 然后,您将需要webhooks(bitbucket和github都有),这些钩子将通知jenkins有关push事件(或您想要的任何其他事件,例如commit / comment等),它们将触发构建作业。某些插件(例如Bitbucket分支源插件https://wiki.jenkins.io/display/JENKINS/Bitbucket+Branch+Source+Plugin)提供了处理这些Webhooks的服务,因此您不必手动进行操作(manual:您必须输入作业url和exec命令,例如ci:port / yourJob / ?build [无法回忆起我使用过以来的整个网址],自动POST ci:port / bitbucket-scmsource-hook / notify /是通用的,插件会将挂钩重定向到适当的工作。)。作为jenkinsfile管道的最后一步,您可以将push命令添加到nexus,这将在您的nexus中添加您想要的文件。 !

我希望我的回答有帮助:)