73

我一直在尝试没有任何成功,我正在运行一个托管在 Linux 上的 Gitlab,并试图了解 CI 功能。

根据 Gitlab 文档,您只需要创建一个.gitlab-ci.yml文件,即 Travis-CI 的 Gitlab 实现。现在从它的外观来看,您可以使用.gitlab-ci.yml. 没有提及如何构建 Java Maven 项目。

如何在 Java 中构建一个简单的应用程序?我可以使用共享运行器,还是应该使用特定的运行器,在这种情况下,我应该选择什么或哪个运行器实现:ssh、docker 或 shell?那么,我.gitlab-ci.yml至少应该在文件中放入什么来使用 Maven 构建项目?

4

7 回答 7

73

注册 Docker 运行器并使用官方 Maven Docker 映像之一,例如,maven:3-jdk-11在您的.gitlab-ci.yml文件中:

image: maven:3-jdk-11

build:
  script: "mvn install -B"

请注意-B flag,建议将其用于非交互式使用。

据我了解,跑步者是共享的还是特定的都没有关系。

于 2016-01-08T15:41:56.167 回答
8

我想在这里添加一些信息。首先让我们澄清一些关于共享和特定跑步者的困惑。

Shared Runner: 顾名思义,shared runners 是构建流程实例,可用于在已安装的 gitlab 实例中执行每个项目的作业,并启用Allowed Shared runners选项。当然,要做到这一点,您需要管理权限。根据当前的 gitlab 文档,只有使用管理权限才能定义共享运行器。

特定的跑步者这种跑步者只执行一个项目的工作。

此外,在为您的项目选择跑步者时,这些是需要牢记的几个要点。

  1. Shared Runners对于在多个项目之间具有相似要求的工作很有用。您可以让单个或少量的跑步者处理多个项目,而不是让多个跑步者闲置在许多项目中。这使得维护和更新通用项目的运行器变得更加容易。
  2. 特定的跑步者对于有特殊要求的工作或有特定需求的项目很有用。如果某项工作有一定的要求,您可以考虑到这一点来设置特定的跑步者,而不必对所有跑步者都这样做。例如,如果你想部署某个项目,你可以设置一个特定的运行器来获得正确的凭据。

现在要为项目选择正确的执行器,我们对 gitlab runner 的所有可用执行器有鸟瞰图非常重要。Gitlab 在这里提供了很好的文档,解释了使用不同的执行器可以获得哪些不同的选项,从而使这项工作对我们来说很容易。

如果您想了解更多关于 runner 和不同 executor 的信息,我建议您从这篇文章开始, Gitlab Runner

于 2017-01-20T07:34:23.610 回答
7

我花了相当多的时间尝试在 Gitlab CI 上设置我们的 Java 项目。我得到了一定程度的成功。正如 rolve 所提到的,最直接的解决方案是使用来自官方 repo 的图像: https ://hub.docker.com/_/maven

但是,我们有一个公司代理,导致我的构建在获取项目的依赖项时收到超时请求。我尝试了很多解决方案,最后看到了这篇文章:https ://gitlab.com/gitlab-org/gitlab-ce/issues/15167 。

这篇文章本身是关于设置 maven 以在本地 repo 中缓存下载的依赖项,该 repo 可以在构建之间访问。这个想法是你可以通过在.gitlab-ci.yml中编写一个本地 maven 配置文件来设置你的缓存目录和你的代理。

before_script:
  -echo '<settings
          xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
          https://maven.apache.org/xsd/settings-1.0.0.xsd">
          <localRepository>/cache/.m2</localRepository>
          <proxies>
              <proxy>
                  <active>true</active>
                  <protocol>'$PROXY_PROTOCOL'</protocol>
                  <host>'$PROXY_HOST'</host>
                  <port>'$PROXY_PORT'</port>
              </proxy>
          </proxies>
      </settings>' > $HOME/.m2/settings.xml

build_debug1:
  stage: build
  script: "echo $PROXY_HOST"

build_debug2:
  stage: build
  script: "cat $HOME/.m2/settings.xml"

build_maven:
  stage: build
  script: "mvn $MAVEN_CLI_OPTS package"
  artifacts:
    paths:
      - target/*.jar

deploy_debug1:
  stage: package
  script: "ls target/"

请注意,构建调试作业只是为了查看代理设置是否被正确注入。您可以使用 Gitlab 将代理环境变量设置为秘密,方法是转到项目 -> 设置 -> CI/CD 管道 -> 秘密变量。

最后一项deploy_debug工作是查看目标目录中生成的内容。

于 2017-07-06T14:00:37.470 回答
5

这里有几个问题。

我将开始回答 Java 构建问题,然后是 Runners 问题。

Java 构建

我将从最基本的 Java 构建配置开始,逐步添加功能。

1.基本Java构建

此配置有望运行您的 Maven 构建(并且只有构建,明确排除单元测试):

stages:
  - build

java-build:
  # select the most appropriate image for your project
  image: maven:3.8-openjdk-11
  stage: build
  script:
    - mvn package -DskipTests=true

2. 带有工件、缓存和推荐的 Maven 选项

这个新版本:

  • 将 Maven 构建输出声明为 GitLab 工件(供以后在下游管道中使用),
  • 利用GitLab 的缓存来缓存本地 Maven 存储库(在 中.m2/repository),
  • 还强制一些推荐的 Maven 选项在 CI/CD 上下文中使用。
stages:
  - build

variables:
  # This will suppress any download for dependencies and plugins or upload messages which would clutter the console log.
  # `showDateTime` will show the passed time in milliseconds. You need to specify `--batch-mode` to make this work.
  MAVEN_OPTS: >-
    -Dhttps.protocols=TLSv1.2
    -Dmaven.repo.local=.m2/repository
    -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN
    -Dorg.slf4j.simpleLogger.showDateTime=true
    -Djava.awt.headless=true
  # As of Maven 3.3.0 instead of this you may define these options in `.mvn/maven.config` so the same config is used
  # when running from the command line.
  # `installAtEnd` and `deployAtEnd` are only effective with recent version of the corresponding plugins.
  MAVEN_CLI_OPTS: >-
    --batch-mode
    --errors
    --fail-at-end
    --show-version
    -DinstallAtEnd=true
    -DdeployAtEnd=true  

java-build:
  # select the most appropriate image for your project
  image: maven:3.8-openjdk-11
  stage: build
  # Cache downloaded dependencies and plugins between builds.
  # The key here separates one cache per branch/tag ($CI_COMMIT_REF_SLUG)
  cache:
    key: "maven-$CI_COMMIT_REF_SLUG"
    paths:
      - .m2/repository
  script:
    - mvn $MAVEN_CLI_OPTS package -DskipTests=true
  artifacts:
    name: "Maven artifacts from $CI_PROJECT_NAME on $CI_COMMIT_REF_SLUG"
    paths:
      - "**/target"

3. 有单元测试

在 CI/CD 管道中集成单元测试时有两种选择:

  1. 在与构建相同的作业中运行它们
  2. 在单独的工作中运行它们

作为管道执行速度和绿色 IT 考虑的问题,我绝对更喜欢选项 1,但我承认人们可能更喜欢第二种。

这是.gitlab-ci.yml文件的新版本,也实现了GitLab 单元测试集成

stages:
  - build

variables:
  # This will suppress any download for dependencies and plugins or upload messages which would clutter the console log.
  # `showDateTime` will show the passed time in milliseconds. You need to specify `--batch-mode` to make this work.
  MAVEN_OPTS: >-
    -Dhttps.protocols=TLSv1.2
    -Dmaven.repo.local=.m2/repository
    -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN
    -Dorg.slf4j.simpleLogger.showDateTime=true
    -Djava.awt.headless=true
  # As of Maven 3.3.0 instead of this you may define these options in `.mvn/maven.config` so the same config is used
  # when running from the command line.
  # `installAtEnd` and `deployAtEnd` are only effective with recent version of the corresponding plugins.
  MAVEN_CLI_OPTS: >-
    --batch-mode
    --errors
    --fail-at-end
    --show-version
    -DinstallAtEnd=true
    -DdeployAtEnd=true  

java-build-and-test:
  # select the most appropriate image for your project
  image: maven:3.8-openjdk-11
  stage: build
  # Cache downloaded dependencies and plugins between builds.
  # The key here separates one cache per branch/tag ($CI_COMMIT_REF_SLUG)
  cache:
    key: "maven-$CI_COMMIT_REF_SLUG"
    paths:
      - .m2/repository
  script:
    # the 'verify' goal is definitely the most appropriate here
    - mvn $MAVEN_CLI_OPTS verify
  artifacts:
    name: "Maven artifacts from $CI_PROJECT_NAME on $CI_COMMIT_REF_SLUG"
    paths:
      - "**/target"
    reports:
      # declare the JUnit reports (recursive pattern for multi-module projects)
      junit:
        - "**/target/*-reports/TEST-*.xml"

4. 更进一步

从这一步开始,构建工作仍然可以进一步增强,例如代码覆盖率计算和集成,但这需要更多的代码。

另一种以更少努力实现最先进管道的方法是使用 GitLab CI/CD 模板。例如:

to be Continuous是一个开源项目,它提供了一系列即用型、可配置、可扩展、可组合的模板。

关于跑步者

GitLab 架构非常通用,具有Runners的概念。Runners 是基本的执行器池,可以执行 GitLab CI/CD 作业。

关于跑步者需要了解的 2 件事

1.你可以让你的跑步者专业化

使用 GitLab,您可以注册多种跑步者,用于特殊和互补目的。

为了隔离它们,GitLab 支持标签的概念。注册跑步者时,应将它们与功能.gitlab-ci.yml标签名称相关联,这将有助于开发人员在其文件中选择最合适的名称。

例如,假设您有 4 个跑步者:

# 描述 建议的标签
1 基于 Linux 的通用运行程序,用于构建代码、运行测试等,可透明访问互联网 linux, general,internet
您还应该允许这个运行未标记的作业(使其成为一种默认运行器)
2 基于 Microsoft 的通用运行程序,用于构建您的 .NET 代码 windows, general,internet
3 计算优化的跑步者,用于训练无法访问互联网的超级秘密神经网络 linux, compute, ml(用于机器学习
4 位于本地数据中心内 DMZ 后面的运行器,用于执行代码/基础架构部署 linux, deploy,datacenter

通过此设置,具有 Java 和 .NET 代码的 monorepo 项目可以声明以下.gitlab-ci.yml文件:

stages:
  - build
  - test
  - deploy

# this job declares no tag: will be executed by default runner (#1)
java-build:
  image: maven:3.8-openjdk-11
  stage: build
  script:
    - Java build code here

dotnet-build:
  image: mcr.microsoft.com/dotnet/sdk:5.0
  stage: build
  tags:
    - windows
    - general
  script:
    - .NET build code here

# this job declares no tag: will be executed by default runner (#1)
java-test:
  image: maven:3.8-openjdk-11
  stage: test
  script:
    - Java test code here

dotnet-test:
  image: mcr.microsoft.com/dotnet/sdk:5.0
  stage: test
  tags:
    - windows
    - general
  script:
    - .NET test code here

deploy:
  stage: deploy
  tags:
    - deploy
    - datacenter
  script:
    - deployment code here

2. 跑步者有不同的范围

引用官方文档

跑步者可根据您想要访问的人提供:

  • 共享运行器可用于 GitLab 实例中的所有组和项目。
  • 运行器可用于组中的所有项目和子组。
  • 特定的跑步者与特定的项目相关联。通常,特定的跑步者一次用于一个项目。
于 2021-11-14T11:15:21.287 回答
4

该文档描述了用于控制构建的 YAML 语法:

那么为什么不尝试从以下开始呢?:

job1:
  script: "mvn package"

据推测,这仅在已安装 Maven 的情况下才有效,因此您需要一个支持此功能的运行器。

我没有使用 GitLab,但文档建议您可以进一步自定义它以使用官方 Maven Docker 映像来执行构建。看起来很有趣,但我同意文档缺少 Java 示例。

于 2015-10-30T08:56:27.407 回答
4

我使用这个命令,但一般来说,关于 java/maven 构建的文档似乎很少见

maven-package:
  script: "mvn install -B"
于 2016-04-15T08:50:27.153 回答
1

借助如何使用 GitLab CI/CD 将 Maven 项目部署到 Artifactory

您可以通过将.gitlab-ci.yml文件添加到存储库的根目录来编译您的 java maven 项目,其中包含以下内容:

image: maven:latest

variables:
  MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"

cache:
  paths:
    - .m2/repository/
    - target/

build:
  stage: build
  script:
    - mvn compile
于 2020-05-16T23:44:15.900 回答