# How to deploy Maven projects to Artifactory with GitLab CI/CD
> 原文:[https://docs.gitlab.com/ee/ci/examples/artifactory_and_gitlab/](https://docs.gitlab.com/ee/ci/examples/artifactory_and_gitlab/)
* [Introduction](#introduction)
* [Create the simple Maven dependency](#create-the-simple-maven-dependency)
* [Prepare the dependency application](#prepare-the-dependency-application)
* [Configure the Artifactory deployment](#configure-the-artifactory-deployment)
* [Configure GitLab CI/CD for `simple-maven-dep`](#configure-gitlab-cicd-for-simple-maven-dep)
* [Create the main Maven application](#create-the-main-maven-application)
* [Prepare the main application](#prepare-the-main-application)
* [Configure the Artifactory repository location](#configure-the-artifactory-repository-location)
* [Configure GitLab CI/CD for `simple-maven-app`](#configure-gitlab-cicd-for-simple-maven-app)
* [Conclusion](#conclusion)
# How to deploy Maven projects to Artifactory with GitLab CI/CD[](#how-to-deploy-maven-projects-to-artifactory-with-gitlab-cicd "Permalink")
## Introduction[](#introduction "Permalink")
在本文中,我们展示了如何利用[GitLab CI / CD 的功能](https://about.gitlab.com/stages-devops-lifecycle/continuous-integration/)来构建[Maven](https://maven.apache.org/)项目,将其部署到[Artifactory](https://jfrog.com/artifactory/) ,然后从另一个 Maven 应用程序中将其用作依赖项.
您将创建两个不同的项目:
* `simple-maven-dep` :构建并部署到 Artifactory 的应用程序(请参阅[simple-maven-dep](https://gitlab.com/gitlab-examples/maven/simple-maven-dep)示例项目)
* `simple-maven-app` :使用前一个作为依赖[项的应用程序](https://gitlab.com/gitlab-examples/maven/simple-maven-app) (请参见[simple-maven-app](https://gitlab.com/gitlab-examples/maven/simple-maven-app)示例项目)
我们假设您已经在[GitLab.com](https://gitlab.com/)上拥有一个 GitLab 帐户,并且您知道 Git 和[GitLab CI / CD](https://about.gitlab.com/stages-devops-lifecycle/continuous-integration/)的基本用法. 我们还假定 Artifactory 实例在 Internet 上可用且可访问,并且您具有在其上部署的有效凭据.
## Create the simple Maven dependency[](#create-the-simple-maven-dependency "Permalink")
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.
### Prepare the dependency application[](#prepare-the-dependency-application "Permalink")
对于本文,您将使用可以从示例项目中克隆的 Maven 应用程序:
1. 登录到您的 GitLab 帐户
2. 通过选择**URL 通过 URL 回购导入项目来**创建新项目
3. 添加以下 URL:
```
https://gitlab.com/gitlab-examples/maven/simple-maven-dep.git
```
4. Click **建立专案**
该应用程序不过是带有基于 JUnit 的测试套件的存根的基本类. 它公开了一种名为`hello`的方法,该方法接受字符串作为输入,并在屏幕上显示 hello 消息.
该项目的结构非常简单,您应该考虑以下两个资源:
* `pom.xml` :项目对象模型(POM)配置文件
* `src/main/java/com/example/dep/Dep.java` :我们应用程序的源代码
### Configure the Artifactory deployment[](#configure-the-artifactory-deployment "Permalink")
该应用程序已准备就绪,可以使用,但是您需要一些其他步骤才能将其部署到 Artifactory:
1. 使用您的用户凭据登录到 Artifactory.
2. 在主屏幕上,单击" **设置我"**面板中的`libs-release-local`项目.
3. 将" **部署"**段落下的配置片段复制到剪贴板.
4. 更改`url`值,以使其可通过变量进行配置.
5. 在`dependencies`部分之后,将片段复制到项目的`pom.xml`文件中. 该代码段应如下所示:
```
central
83d43b5afeb5-releases
${env.MAVEN_REPO_URL}/libs-release-local
```
将依赖项部署到 Artifactory 之前,您需要做的另一步骤是配置身份验证数据. 这是一个简单的任务,但是 Maven 要求它保留在一个名为`settings.xml`的文件中,该文件必须位于用户 homedir 的`.m2`子目录中.
由于要使用 GitLab Runner 自动部署应用程序,因此应在项目的主目录中创建文件,并在`.gitlab-ci.yml`设置命令行参数以使用自定义位置,而不是默认位置:
1. 在存储库的根目录中创建一个名为`.m2`的文件夹
2. 在`.m2`文件夹中创建一个名为`settings.xml`的文件
3. 将以下内容复制到`settings.xml`文件中:
```
central
${env.MAVEN_REPO_USER}
${env.MAVEN_REPO_PASS}
```
用户名和密码将使用变量替换为正确的值.
### Configure GitLab CI/CD for `simple-maven-dep`[](#configure-gitlab-cicd-for-simple-maven-dep "Permalink")
现在是时候设置[GitLab CI / CD](https://about.gitlab.com/stages-devops-lifecycle/continuous-integration/)来自动构建,测试和部署依赖项了!
GitLab CI / CD 使用存储库根目录中的一个名为`.gitlab-ci.yml`来读取将由已配置的 GitLab Runners 执行的作业的定义. 您可以在[GitLab 文档中](../../yaml/README.html)阅读有关此文件的更多信息.
首先,请记住为您的部署设置变量. 导航到项目的**"设置">" CI / CD">"环境变量"**页面,并添加以下内容(当然,将它们替换为当前值):
* **MAVEN_REPO_URL** : `http://artifactory.example.com:8081/artifactory` : **//artifactory.example.com** : **8081/artifactory** (您的 Artifactory URL)
* **MAVEN_REPO_USER** : `gitlab` (您的 Artifactory 用户名)
* **MAVEN_REPO_PASS** : `AKCp2WXr3G61Xjz1PLmYa3arm3yfBozPxSta4taP3SeNu2HPXYa7FhNYosnndFNNgoEds8BCS` (您的 Artifactory 加密密码)
现在是时候在`.gitlab-ci.yml`定义作业并将其推送到存储库了:
```
image: maven:latest
variables:
MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"
MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
cache:
paths:
- .m2/repository/
- target/
build:
stage: build
script:
- mvn $MAVEN_CLI_OPTS compile
test:
stage: test
script:
- mvn $MAVEN_CLI_OPTS test
deploy:
stage: deploy
script:
- mvn $MAVEN_CLI_OPTS deploy
only:
- master
```
GitLab Runner 将使用最新的[Maven Docker 映像](https://hub.docker.com/_/maven/) ,该[映像](https://hub.docker.com/_/maven/)已经包含了管理项目以运行作业所需的所有工具和依赖项.
设置环境变量以指示 Maven 在搜索配置和依赖项时使用存储库的`homedir`而不是用户的`homedir` .
缓存`.m2/repository folder` ( `.m2/repository folder`所有 Maven 文件的位置)和`target`文件夹(将创建我们的应用程序的位置),对于按顺序运行所有 Maven 阶段来加快过程非常有用,因此,执行`mvn test`会在必要时自动运行`mvn compile` .
`build`作业和`test`作业均利用`mvn`命令来编译应用程序,并按照应用程序一部分的测试套件中的定义对其进行测试.
部署到 Artifactory 的过程已由我们刚刚设置的变量定义. 仅当我们推送或合并到`master`分支时才进行部署,以便开发版本经过测试但未发布.
做完了! 现在,您已在 GitLab 存储库中进行了所有更改,并且已经为此提交启动了管道. 在" **管道"**选项卡中,您可以查看正在发生的事情. 如果部署成功,则部署作业日志将输出:
```
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.983 s
```
> **注意** : `mvn`命令从 Internet 下载大量文件,因此,首次运行日志时,您会在日志中看到很多额外的活动.
好极了! 你做到了! 检入 Artifactory 将确认`libs-release-local`存储库中有可用的新工件.
## Create the main Maven application[](#create-the-main-maven-application "Permalink")
现在您已经有了 Artifactory 上的依赖项,是时候使用它了! 让我们看看如何将其作为对主应用程序的依赖.
### Prepare the main application[](#prepare-the-main-application "Permalink")
我们将再次使用可以从示例项目中克隆的 Maven 应用程序:
1. 通过选择**URL 通过 URL 回购导入项目来**创建新项目
2. 添加以下 URL:
```
https://gitlab.com/gitlab-examples/maven/simple-maven-app.git
```
3. 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. 浏览`libs-release-local`存储库
3. 选择`simple-maven-dep-1.0.jar`文件
4. 从主面板的**Dependency Declaration**部分中找到配置片段
5. 将代码段复制到`pom.xml`文件的`dependencies`部分中. 该代码段应如下所示:
```
com.example.dep
simple-maven-dep
1.0
```
### Configure the Artifactory repository location[](#configure-the-artifactory-repository-location "Permalink")
至此,您已经定义了应用程序的依赖关系,但是仍然错过了可以找到所需文件的位置. 您需要像创建依赖项项目一样创建一个`.m2/settings.xml`文件,并使用环境变量让 Maven 知道位置.
这是直接从 Artifactory 获取文件内容的方法:
1. 在主屏幕上,单击" **设置我"**面板中的`libs-release-local`项目
2. 单击**生成 Maven 设置**
3. 点击**生成设置**
4. 将配置文件复制到剪贴板
5. 在存储库中将文件另存为`.m2/settings.xml`
现在您可以使用 Artifactory 存储库来解决依赖关系,并在主应用程序中使用`simple-maven-dep` !
### Configure GitLab CI/CD for `simple-maven-app`[](#configure-gitlab-cicd-for-simple-maven-app "Permalink")
您需要完成所有步骤:为该项目配置`.gitlab-ci.yml`文件,就像对`simple-maven-dep`所做的那样.
您想利用[GitLab CI / CD](https://about.gitlab.com/stages-devops-lifecycle/continuous-integration/)自动构建,测试和运行您的超赞应用程序,并查看是否可以按预期方式获得欢迎!
您需要做的就是将以下`.gitlab-ci.yml`添加到存储库中:
```
image: maven:latest
stages:
- build
- test
- run
variables:
MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"
MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
cache:
paths:
- .m2/repository/
- target/
build:
stage: build
script:
- mvn $MAVEN_CLI_OPTS compile
test:
stage: test
script:
- mvn $MAVEN_CLI_OPTS test
run:
stage: run
script:
- mvn $MAVEN_CLI_OPTS package
- mvn $MAVEN_CLI_OPTS exec:java -Dexec.mainClass="com.example.app.App"
```
它与用于`simple-maven-dep`的配置非常相似,但是有一个`run`作业代替了`deploy`作业. 可能是您不想在实际项目中使用的东西,但是在这里查看自动执行的应用程序很有用.
就是这样! 在`run`作业输出日志中,您会找到与 GitLab 的友好问好!
## Conclusion[](#conclusion "Permalink")
在本文中,我们介绍了使用 Artifactory Maven 存储库自动发布和使用工件的基本步骤.
可以使用类似的方法与任何其他 Maven 兼容的 Binary Repository Manager 进行交互. 显然,您可以改进这些示例,优化`.gitlab-ci.yml`文件以更好地满足您的需求,并适应您的工作流程.