How to deploy Maven projects to Artifactory with GitLab CI/CD

How to deploy Maven projects to Artifactory with GitLab CI/CD

在本文中,我们展示了如何利用来构建Maven项目,将其部署到 ,然后从另一个 Maven 应用程序中将其用作依赖项.

您将创建两个不同的项目:

  • simple-maven-dep :构建并部署到 Artifactory 的应用程序(请参阅simple-maven-dep示例项目)
  • simple-maven-app :使用前一个作为依赖 (请参见simple-maven-app示例项目)

我们假设您已经在上拥有一个 GitLab 帐户,并且您知道 Git 和GitLab CI / CD的基本用法. 我们还假定 Artifactory 实例在 Internet 上可用且可访问,并且您具有在其上部署的有效凭据.

First of all, you need an application to work with: in this specific case we will use a simple one, but it could be any Maven application. This will be the dependency you want to package and deploy to Artifactory, in order to be available to other projects.

对于本文,您将使用可以从示例项目中克隆的 Maven 应用程序:

  1. 登录到您的 GitLab 帐户
  2. 通过选择URL 通过 URL 回购导入项目来创建新项目
  3. 添加以下 URL:

  4. Click 建立专案

该应用程序不过是带有基于 JUnit 的测试套件的存根的基本类. 它公开了一种名为hello的方法,该方法接受字符串作为输入,并在屏幕上显示 hello 消息.

该项目的结构非常简单,您应该考虑以下两个资源:

  • pom.xml :项目对象模型(POM)配置文件
  • src/main/java/com/example/dep/Dep.java :我们应用程序的源代码

Configure the Artifactory deployment

该应用程序已准备就绪,可以使用,但是您需要一些其他步骤才能将其部署到 Artifactory:

  1. 使用您的用户凭据登录到 Artifactory.
  2. 在主屏幕上,单击” 设置我”面板中的libs-release-local项目.
  3. 将” 部署”段落下的配置片段复制到剪贴板.
  4. 更改url值,以使其可通过变量进行配置.
  5. dependencies部分之后,将片段复制到项目的pom.xml文件中. 该代码段应如下所示:

    1. <distributionManagement>
    2. <repository>
    3. <id>central</id>
    4. <name>83d43b5afeb5-releases</name>
    5. <url>${env.MAVEN_REPO_URL}/libs-release-local</url>
    6. </distributionManagement>

将依赖项部署到 Artifactory 之前,您需要做的另一步骤是配置身份验证数据. 这是一个简单的任务,但是 Maven 要求它保留在一个名为settings.xml的文件中,该文件必须位于用户 homedir 的.m2子目录中.

由于要使用 GitLab Runner 自动部署应用程序,因此应在项目的主目录中创建文件,并在.gitlab-ci.yml设置命令行参数以使用自定义位置,而不是默认位置:

  1. 在存储库的根目录中创建一个名为.m2的文件夹
  2. .m2文件夹中创建一个名为settings.xml的文件
  3. 将以下内容复制到settings.xml文件中:

现在是时候设置GitLab CI / CD来自动构建,测试和部署依赖项了!

GitLab CI / CD 使用存储库根目录中的一个名为.gitlab-ci.yml来读取将由已配置的 GitLab Runners 执行的作业的定义. 您可以在阅读有关此文件的更多信息.

首先,请记住为您的部署设置变量. 导航到项目的“设置”>” CI / CD”>”环境变量”页面,并添加以下内容(当然,将它们替换为当前值):

  • MAVEN_REPO_URLhttp://artifactory.example.com:8081/artifactory : //artifactory.example.com : 8081/artifactory (您的 Artifactory URL)
  • MAVEN_REPO_USERgitlab (您的 Artifactory 用户名)
  • MAVEN_REPO_PASSAKCp2WXr3G61Xjz1PLmYa3arm3yfBozPxSta4taP3SeNu2HPXYa7FhNYosnndFNNgoEds8BCS (您的 Artifactory 加密密码)

现在是时候在.gitlab-ci.yml定义作业并将其推送到存储库了:

  1. image: maven:latest
  2. variables:
  3. MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"
  4. MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
  5. cache:
  6. paths:
  7. - .m2/repository/
  8. build:
  9. stage: build
  10. script:
  11. - mvn $MAVEN_CLI_OPTS compile
  12. test:
  13. stage: test
  14. script:
  15. - mvn $MAVEN_CLI_OPTS test
  16. deploy:
  17. stage: deploy
  18. script:
  19. - mvn $MAVEN_CLI_OPTS deploy
  20. only:
  21. - master

GitLab Runner 将使用最新的Maven Docker 映像 ,该已经包含了管理项目以运行作业所需的所有工具和依赖项.

设置环境变量以指示 Maven 在搜索配置和依赖项时使用存储库的homedir而不是用户的homedir .

缓存.m2/repository folder.m2/repository folder所有 Maven 文件的位置)和target文件夹(将创建我们的应用程序的位置),对于按顺序运行所有 Maven 阶段来加快过程非常有用,因此,执行mvn test会在必要时自动运行mvn compile .

build作业和test作业均利用mvn命令来编译应用程序,并按照应用程序一部分的测试套件中的定义对其进行测试.

部署到 Artifactory 的过程已由我们刚刚设置的变量定义. 仅当我们推送或合并到master分支时才进行部署,以便开发版本经过测试但未发布.

做完了! 现在,您已在 GitLab 存储库中进行了所有更改,并且已经为此提交启动了管道. 在” 管道”选项卡中,您可以查看正在发生的事情. 如果部署成功,则部署作业日志将输出:

注意mvn命令从 Internet 下载大量文件,因此,首次运行日志时,您会在日志中看到很多额外的活动.

好极了! 你做到了! 检入 Artifactory 将确认libs-release-local存储库中有可用的新工件.

现在您已经有了 Artifactory 上的依赖项,是时候使用它了! 让我们看看如何将其作为对主应用程序的依赖.

Prepare the main application

我们将再次使用可以从示例项目中克隆的 Maven 应用程序:

  1. 通过选择URL 通过 URL 回购导入项目来创建新项目
    1. https://gitlab.com/gitlab-examples/maven/simple-maven-app.git
  2. Click 建立专案

This one is a simple app as well. If you look at the src/main/java/com/example/app/App.java file you can see that it imports the com.example.dep.Dep class and calls the hello method passing GitLab as a parameter.

由于 Maven 不知道如何解决依赖关系,因此您需要修改配置:

  1. 回到 Artifactory
  2. 选择simple-maven-dep-1.0.jar文件
  3. 从主面板的Dependency Declaration部分中找到配置片段
  4. 将代码段复制到pom.xml文件的dependencies部分中. 该代码段应如下所示:

至此,您已经定义了应用程序的依赖关系,但是仍然错过了可以找到所需文件的位置. 您需要像创建依赖项项目一样创建一个.m2/settings.xml文件,并使用环境变量让 Maven 知道位置.

这是直接从 Artifactory 获取文件内容的方法:

  1. 在主屏幕上,单击” 设置我”面板中的libs-release-local项目
  2. 单击生成 Maven 设置
  3. 点击生成设置
  4. 将配置文件复制到剪贴板
  5. 在存储库中将文件另存为

现在您可以使用 Artifactory 存储库来解决依赖关系,并在主应用程序中使用simple-maven-dep

Configure GitLab CI/CD for simple-maven-app

您需要完成所有步骤:为该项目配置.gitlab-ci.yml文件,就像对simple-maven-dep所做的那样.

您想利用GitLab CI / CD自动构建,测试和运行您的超赞应用程序,并查看是否可以按预期方式获得欢迎!

您需要做的就是将以下.gitlab-ci.yml添加到存储库中:

  1. image: maven:latest
  2. stages:
  3. - build
  4. - test
  5. - run
  6. variables:
  7. MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"
  8. MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
  9. cache:
  10. paths:
  11. - .m2/repository/
  12. - target/
  13. build:
  14. stage: build
  15. script:
  16. - mvn $MAVEN_CLI_OPTS compile
  17. test:
  18. stage: test
  19. script:
  20. - mvn $MAVEN_CLI_OPTS test
  21. run:
  22. stage: run
  23. script:
  24. - mvn $MAVEN_CLI_OPTS package
  25. - mvn $MAVEN_CLI_OPTS exec:java -Dexec.mainClass="com.example.app.App"

它与用于simple-maven-dep的配置非常相似,但是有一个run作业代替了deploy作业. 可能是您不想在实际项目中使用的东西,但是在这里查看自动执行的应用程序很有用.

就是这样! 在run作业输出日志中,您会找到与 GitLab 的友好问好!

在本文中,我们介绍了使用 Artifactory Maven 存储库自动发布和使用工件的基本步骤.

可以使用类似的方法与任何其他 Maven 兼容的 Binary Repository Manager 进行交互. 显然,您可以改进这些示例,优化.gitlab-ci.yml文件以更好地满足您的需求,并适应您的工作流程.