Maven 패키지 레지스트리

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

프로젝트의 패키지 레지스트리에 Maven 아티팩트를 게시합니다. 그런 다음, 필요할 때마다 의존성으로 사용하기 위해 패키지를 설치합니다.

Maven 패키지 관리자 클라이언트가 사용하는 특정 API 엔드포인트에 대한 문서는 Maven API 문서를 참조하세요.

지원되는 클라이언트:

  • mvn. Maven 패키지를 빌드하는 방법을 알아보세요.
  • gradle. Gradle 패키지를 빌드하는 방법을 알아보세요.
  • sbt.

GitLab 패키지 레지스트리에 게시

패키지 레지스트리에 인증

패키지를 게시하려면 토큰이 필요합니다. 달성하려는 목표에 따라 사용 가능한 서로 다른 토큰이 있습니다. 자세한 정보는 토큰 사용 방법을 확인하세요.

토큰을 만들고 나중에 사용하도록 저장합니다.

여기서 문서화되지 않은 인증 방법은 나중에 제거될 수 있습니다.

클라이언트 구성 편집

Maven 리포지터리에 HTTP로 인증하도록 구성을 업데이트합니다.

사용자 정의 HTTP 헤더

사용자가 클라이언트의 구성 파일에 인증 세부 정보를 추가해야 합니다.

mvn
토큰 유형 이름은 반드시 토큰
개인 액세스 토큰 Private-Token 토큰을 그대로 붙여 넣거나, 토큰을 보관할 환경 변수를 정의할 수 있습니다
배포 토큰 Deploy-Token 토큰을 그대로 붙여 넣거나, 토큰을 보관할 환경 변수를 정의할 수 있습니다
CI 작업 토큰 Job-Token ${CI_JOB_TOKEN}
note
<name> 필드는 선택한 토큰과 일치하도록 명명해야 합니다.

다음 섹션을 settings.xml 파일에 추가합니다.

<settings>
  <servers>
    <server>
      <id>gitlab-maven</id>
      <configuration>
        <httpHeaders>
          <property>
            <name>REPLACE_WITH_NAME</name>
            <value>REPLACE_WITH_TOKEN</value>
          </property>
        </httpHeaders>
      </configuration>
    </server>
  </servers>
</settings>
gradle
토큰 유형 이름은 반드시 토큰
개인 액세스 토큰 Private-Token 토큰을 그대로 붙여 넣거나, 토큰을 보관할 환경 변수를 정의할 수 있습니다
배포 토큰 Deploy-Token 토큰을 그대로 붙여 넣거나, 토큰을 보관할 환경 변수를 정의할 수 있습니다
CI 작업 토큰 Job-Token System.getenv("CI_JOB_TOKEN")
note
<name> 필드는 선택한 토큰과 일치하도록 명명해야 합니다.

당신의 GRADLE_USER_HOME 디렉터리에 다음 내용으로 gradle.properties 파일을 만듭니다.

gitLabPrivateToken=REPLACE_WITH_YOUR_TOKEN

다음 내용을 build.gradle 파일에 repositories 섹션으로 추가합니다:

  • Groovy DSL:

    repositories {
        maven {
            url "https://gitlab.example.com/api/v4/groups/<group>/-/packages/maven"
            name "GitLab"
            credentials(HttpHeaderCredentials) {
                name = 'REPLACE_WITH_NAME'
                value = gitLabPrivateToken
            }
            authentication {
                header(HttpHeaderAuthentication)
            }
        }
    }
    
  • Kotlin DSL:

    repositories {
        maven {
            url = uri("https://gitlab.example.com/api/v4/groups/<group>/-/packages/maven")
            name = "GitLab"
            credentials(HttpHeaderCredentials::class) {
                name = "REPLACE_WITH_NAME"
                value = findProperty("gitLabPrivateToken") as String?
            }
            authentication {
                create("header", HttpHeaderAuthentication::class)
            }
        }
    }
    
기본 HTTP 인증

Maven 패키지 레지스트리에 기본 HTTP 인증을 사용할 수도 있습니다.

mvn
토큰 유형 이름은 반드시 토큰
개인 액세스 토큰 사용자 이름 토큰을 그대로 붙여 넣거나, 토큰을 보관할 환경 변수를 정의할 수 있습니다
배포 토큰 배포 토큰의 사용자 이름 토큰을 그대로 붙여 넣거나, 토큰을 보관할 환경 변수를 정의할 수 있습니다
CI 작업 토큰 gitlab-ci-token ${CI_JOB_TOKEN}

다음 섹션을 settings.xml 파일에 추가합니다.

<settings>
  <servers>
    <server>
      <id>gitlab-maven</id>
      <username>REPLACE_WITH_NAME</username>
      <password>REPLACE_WITH_TOKEN</password>
      <configuration>
        <authenticationInfo>
          <userName>REPLACE_WITH_NAME</userName>
          <password>REPLACE_WITH_TOKEN</password>
        </authenticationInfo>
      </configuration>
    </server>
  </servers>
</settings>
gradle
토큰 유형 이름은 반드시 토큰
개인 액세스 토큰 사용자 이름 토큰을 그대로 붙여 넣거나, 토큰을 보관할 환경 변수를 정의할 수 있습니다
배포 토큰 배포 토큰의 사용자 이름 토큰을 그대로 붙여 넣거나, 토큰을 보관할 환경 변수를 정의할 수 있습니다
CI 작업 토큰 gitlab-ci-token System.getenv("CI_JOB_TOKEN")

당신의 GRADLE_USER_HOME 디렉터리에 다음 내용으로 gradle.properties 파일을 만듭니다.

gitLabPrivateToken=REPLACE_WITH_YOUR_TOKEN

다음 내용을 build.gradle 파일에 repositories 섹션으로 추가합니다:

  • Groovy DSL:

    repositories {
        maven {
            url "https://gitlab.example.com/api/v4/groups/<group>/-/packages/maven"
            name "GitLab"
            credentials(PasswordCredentials) {
                username = 'REPLACE_WITH_NAME'
                password = gitLabPrivateToken
            }
            authentication {
                basic(BasicAuthentication)
            }
        }
    }
    
  • Kotlin DSL:

    repositories {
        maven {
            url = uri("https://gitlab.example.com/api/v4/groups/<group>/-/packages/maven")
            name = "GitLab"
            credentials(BasicAuthentication::class) {
                username = "REPLACE_WITH_NAME"
                password = findProperty("gitLabPrivateToken") as String?
            }
            authentication {
                create("basic", BasicAuthentication::class)
            }
        }
    }
    
sbt
토큠 유형 이름은 반드시 토큰
개인 액세스 토큰 사용자 이름 토큰을 그대로 붙여 넣거나, 토큰을 보관할 환경 변수를 정의할 수 있습니다
배포 토큰 배포 토큰의 사용자 이름 토큰을 그대로 붙여 넣거나, 토큰을 보관할 환경 변수를 정의할 수 있습니다
CI 작업 토큰 gitlab-ci-token sys.env.get("CI_JOB_TOKEN").get

SBT에 대한 인증은 basic HTTP Authentication 을 기반으로 합니다. 이름과 암호를 제공해야 합니다.

note
이름 필드는 선택한 토큰과 일치하도록 명명해야 합니다.

sbt를 사용하여 Maven GitLab 패키지 레지스트리에서 패키지를 설치하려면 Maven 리졸버를 구성해야 합니다. 비공개 또는 내부 프로젝트 또는 그룹에 액세스해야 하는 경우 자격 증명을 설정해야 합니다. 리졸버와 인증을 구성한 후에 프로젝트, 그룹 또는 네임스페이스에서 패키지를 설치할 수 있습니다.

당신의 build.sbt에 다음 줄을 추가하세요:

resolvers += ("gitlab" at "<endpoint url>")

credentials += Credentials("GitLab Packages Registry", "<host>", "<name>", "<token>")

이 예에서:

  • <endpoint url>엔드포인트 URL입니다. 예: https://gitlab.example.com/api/v4/projects/<project_id>/packages/maven.
  • <host>는 프로토콜 스키마나 포트를 제외한 <endpoint url>에 포함된 호스트입니다. 예: gitlab.example.com.
  • <name><token>은 위의 표에서 설명되어 있습니다.

네이밍 규칙

Maven 패키지를 설치하기 위해 세 가지 엔드포인트 중 하나를 사용할 수 있습니다. 패키지를 프로젝트에 발행해야 하지만 선택하는 엔드포인트에 따라 pom.xml 파일에 추가해야 할 설정이 결정됩니다.

세 가지 엔드포인트는 다음과 같습니다:

  • 프로젝트 레벨: Maven 패키지가 몇 개이고 GitLab 그룹에 속해 있지 않을 때 사용합니다.
  • 그룹 레벨: 동일한 GitLab 그룹의 많은 다른 프로젝트에서 패키지를 설치하려는 경우 사용합니다. GitLab은 그룹 내 패키지 이름의 고유성을 보장하지 않습니다. 동일한 패키지 이름과 패키지 버전을 가진 두 프로젝트가 있을 수 있습니다. 따라서 GitLab은 더 최근 것을 제공합니다.
  • 인스턴스 레벨: 서로 다른 GitLab 그룹이나 해당 기본 네임스페이스에 많은 패키지가 있는 경우 사용합니다.

인스턴스 레벨 엔드포인트의 경우 Maven의 pom.xml의 관련 섹션이 다음과 같아야 합니다:

<groupId>group-slug.subgroup-slug</groupId>
<artifactId>project-slug</artifactId>

프로젝트 경로가 동일한 패키지만 인스턴스 레벨 엔드포인트에서 노출됩니다.

프로젝트 패키지 인스턴스 레벨 엔드포인트 사용 가능
foo/bar foo/bar/1.0-SNAPSHOT
gitlab-org/gitlab foo/bar/1.0-SNAPSHOT 아니요
gitlab-org/gitlab gitlab-org/gitlab/1.0-SNAPSHOT

엔드포인트 URL

엔드포인트 pom.xml을 위한 엔드포인트 URL 추가 정보
프로젝트 https://gitlab.example.com/api/v4/projects/<project_id>/packages/maven gitlab.example.com을 도메인 이름으로 바꿉니다. <project_id>프로젝트 개요 페이지에서 찾을 수 있는 프로젝트 ID로 대체합니다.
그룹 https://gitlab.example.com/api/v4/groups/<group_id>/-/packages/maven gitlab.example.com을 도메인 이름으로 바꿉니다. <group_id>는 그룹 홈페이지에서 찾을 수 있는 그룹 ID로 대체합니다.
인스턴스 https://gitlab.example.com/api/v4/packages/maven gitlab.example.com을 도메인 이름으로 바꿉니다.

발행 구성 파일 편집

클라이언트의 구성 파일에 발행 세부 정보를 추가해야 합니다.

mvn

어떤 엔드포인트를 선택하든 다음이 있어야 합니다:

  • distributionManagement 섹션에 프로젝트별 URL.
  • repositorydistributionManagement 섹션.

Maven의 pom.xml의 관련 repository 섹션은 다음과 같아야 합니다:

<repositories>
  <repository>
    <id>gitlab-maven</id>
    <url><your_endpoint_url></url>
  </repository>
</repositories>
<distributionManagement>
  <repository>
    <id>gitlab-maven</id>
    <url>https://gitlab.example.com/api/v4/projects/<project_id>/packages/maven</url>
  </repository>
  <snapshotRepository>
    <id>gitlab-maven</id>
    <url>https://gitlab.example.com/api/v4/projects/<project_id>/packages/maven</url>
  </snapshotRepository>
</distributionManagement>
gradle

Gradle을 사용하여 패키지를 발행하려면:

  1. 플러그인 섹션에 Gradle 플러그인 maven-publish을 추가합니다:

    • Groovy DSL에서:

      plugins {
          id 'java'
          id 'maven-publish'
      }
      
    • Kotlin DSL에서:

      plugins {
          java
          `maven-publish`
      }
      
  2. publishing 섹션을 추가합니다:

    • Groovy DSL에서:

      publishing {
          publications {
              library(MavenPublication) {
                  from components.java
              }
          }
          repositories {
              maven {
                  url "https://gitlab.example.com/api/v4/projects/<PROJECT_ID>/packages/maven"
                  credentials(HttpHeaderCredentials) {
                      name = "REPLACE_WITH_TOKEN_NAME"
                      value = gitLabPrivateToken // 변수는 $GRADLE_USER_HOME/gradle.properties에 저장됩니다
                  }
                  authentication {
                      header(HttpHeaderAuthentication)
                  }
              }
          }
      }
      
    • Kotlin DSL에서:

      publishing {
          publications {
              create<MavenPublication>("library") {
                  from(components["java"])
              }
          }
          repositories {
              maven {
                  url = uri("https://gitlab.example.com/api/v4/projects/<PROJECT_ID>/packages/maven")
                  credentials(HttpHeaderCredentials::class) {
                      name = "REPLACE_WITH_TOKEN_NAME"
                      value =
                          findProperty("gitLabPrivateToken") as String? // 변수는 $GRADLE_USER_HOME/gradle.properties에 저장됩니다
                  }
                  authentication {
                      create("header", HttpHeaderAuthentication::class)
                  }
              }
          }
      }
      

패키지 발행

caution
DeployAtEnd 옵션을 사용하면 400 bad request {"message":"Validation failed: Name has already been taken"}으로 업로드를 거부당할 수 있습니다. 자세한 내용은 issue 424238을 참조하십시오.

인증을 설정하고 발행을 위한 엔드포인트를 선택한 후 Maven 패키지를 프로젝트에 발행합니다.

mvn

Maven을 사용하여 패키지를 발행하려면:

mvn deploy

배포가 성공하면 빌드 성공 메시지가 표시됩니다:

...
[INFO] BUILD SUCCESS
...

메시지는 패키지가 올바른 위치로 발행된 것을 보여주어야 합니다:

Uploading to gitlab-maven: https://example.com/api/v4/projects/PROJECT_ID/packages/maven/com/mycompany/mydepartment/my-project/1.0-SNAPSHOT/my-project-1.0-20200128.120857-1.jar
gradle

발행 작업을 실행하려면:

gradle publish

프로젝트의 패키지 및 레지스트리 페이지로 이동하여 발행된 패키지를 확인합니다.

sbt

build.sbt 파일에서 publishTo 설정을 구성합니다:

publishTo := Some("gitlab" at "<endpoint url>")

자격 증명이 올바르게 참조되었는지 확인합니다. 자세한 내용은 sbt 문서를 참조하십시오.

sbt를 사용하여 패키지를 발행하려면:

sbt publish

배포가 성공하면 빌드 성공 메시지가 표시됩니다:

[success] Total time: 1 s, completed Jan 28, 2020 12:08:57 PM

패키지가 올바른 위치로 발행된 것을 확인하기 위해 성공 메시지를 확인합니다:

[info]  published my-project_2.12 to https://gitlab.example.com/api/v4/projects/PROJECT_ID/packages/maven/com/mycompany/my-project_2.12/0.1.1-SNAPSHOT/my-project_2.12-0.1.1-SNAPSHOT.pom

패키지 설치

GitLab 패키지 레지스트리에서 패키지를 설치하려면 원격 및 인증을 구성해야 합니다. 이 작업이 완료되면 프로젝트, 그룹 또는 이름 공간에서 패키지를 설치할 수 있습니다.

동일한 이름과 버전을 가진 여러 패키지가 있는 경우, 패키지를 설치하면 가장 최근에 발행된 패키지가 검색됩니다.

가장 최근에 발행된 패키지를 읽을 수 있는 권한이 충분하지 않은 경우 403 Forbidden이 반환됩니다.

mvn

mvn install을 사용하여 패키지를 설치하려면:

  1. 의존성을 프로젝트의 pom.xml 파일에 매뉴얼으로 추가합니다. 앞서 만든 예를 추가하려면 다음과 같을 것입니다:

    <dependency>
      <groupId>com.mycompany.mydepartment</groupId>
      <artifactId>my-project</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>
    
  2. 프로젝트에서 다음을 실행합니다:

    mvn install
    

메시지에는 패키지가 패키지 레지스트리에서 다운로드되고 있음을 보여줍니다:

Downloading from gitlab-maven: http://gitlab.example.com/api/v4/projects/PROJECT_ID/packages/maven/com/mycompany/mydepartment/my-project/1.0-SNAPSHOT/my-project-1.0-20200128.120857-1.pom

또한 Maven dependency:get 명령을 직접 사용하여 패키지를 설치할 수도 있습니다.

  1. 프로젝트 디렉터리에서 다음을 실행합니다:

    mvn dependency:get -Dartifact=com.nickkipling.app:nick-test-app:1.1-SNAPSHOT -DremoteRepositories=gitlab-maven::::<gitlab endpoint url>  -s <settings.xml의 경로>
    
    • <gitlab endpoint url>은 GitLab endpoint의 URL입니다.
    • <settings.xml의 경로>인증 정보가 포함된 settings.xml 파일의 경로입니다.
note
명령어의 리포지터리 ID(gitlab-maven)와 settings.xml 파일은 일치해야 합니다.

메시지에는 패키지가 패키지 레지스트리에서 다운로드되고 있음을 보여줍니다:

Downloading from gitlab-maven: http://gitlab.example.com/api/v4/projects/PROJECT_ID/packages/maven/com/mycompany/mydepartment/my-project/1.0-SNAPSHOT/my-project-1.0-20200128.120857-1.pom
gradle

gradle을 사용하여 패키지를 설치하려면:

  1. 의존성을 build.gradle의 의존성 섹션에 추가합니다. (의존성 선언에 대한 자세한 내용)

    • Groovy DSL에서:

      dependencies {
          implementation 'com.mycompany.mydepartment:my-project:1.0-SNAPSHOT'
      }
      
    • Kotlin DSL에서:

      dependencies {
          implementation("com.mycompany.mydepartment:my-project:1.0-SNAPSHOT")
      }
      
  2. 프로젝트에서 다음을 실행합니다:

    gradle install
    
sbt

sbt를 사용하여 패키지를 설치하려면:

  1. build.sbt인라인 의존성을 추가합니다:

    libraryDependencies += "com.mycompany.mydepartment" % "my-project" % "8.4"
    
  2. 프로젝트에서 다음을 실행합니다:

    sbt update
    

도움말 힌트

동일한 이름 또는 버전으로 패키지를 게시하는 경우

기존 패키지와 동일한 이름과 버전으로 패키지를 게시하면 새 패키지 파일이 기존 패키지에 추가됩니다. 여전히 UI 또는 API를 사용하여 기존 패키지의 이전 자산에 액세스하고 볼 수 있습니다.

이전의 패키지 버전을 삭제하려면 패키지 API 또는 UI를 사용하는 것을 고려하세요.

중복되는 Maven 패키지를 허용하지 않음

중복된 Maven 패키지를 게시하지 못하도록 사용자를 방지하기 위해 GraphQl API 또는 UI를 사용할 수 있습니다.

UI에서:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 그룹을 찾습니다.
  2. 설정 > 패키지 및 레지스트리를 선택합니다.
  3. Maven 행의 중복 패키지 허용 토글을 끕니다.
  4. 선택 사항. 예외 텍스트 상자에 허용할 패키지의 이름과 버전과 일치하는 정규 표현식을 입력합니다.

변경 사항은 자동으로 저장됩니다.

Maven Central로의 요청 전달

기본적으로 이 기능은 Self-managed 시스템에서 사용할 수 없습니다. 사용하려면 관리자가 maven_central_request_forwarding이름의 피처 플래그를 활성화해야 합니다. 이 기능은 GitLab.com 또는 GitLab Dedicated 사용자에게는 사용할 수 없습니다.

Maven 패키지가 패키지 레지스트리에서 찾을 수 없는 경우, 요청은 Maven Central로 전달됩니다.

피처 플래그가 활성화된 경우, 관리자는 Continuous Integration 설정에서이 동작을 비활성화할 수 있습니다.

Maven 전달은 프로젝트 수준 및 그룹 수준 endpoints로 제한됩니다. 인스턴스 수준 endpoint는 해당 규칙을 따르지 않는 패키지에 대해 사용할 수 없도록하는 네이밍 규칙 제한을 도입하여 공급망 스타일 공격에 대해 너무 많은 보안 위험을 소개합니다.

mvn의 추가 구성

mvn을 사용할 때 Maven 프로젝트를 구성하는 여러 가지 방법이 있으므로 Maven Central에서 GitLab으로 패키지 요청을 보내도록 설정할 수 있습니다. Maven 리포지터리는 특정한 순서로 조회됩니다. 일반적으로 Maven Central이 먼저 확인됩니다(Super POM을 통해), 그래서 GitLab은 maven-central보다 먼저 조회되도록 구성되어야 합니다.

모든 패키지 요청이 Maven Central 대신 GitLab으로 전송되도록 보장하려면 settings.xml<mirror> 섹션을 추가하여 Maven Central을 중앙 리포지터리로 만들 수 있습니다:

<settings>
  <servers>
    <server>
      <id>central-proxy</id>
      <configuration>
        <httpHeaders>
          <property>
            <name>Private-Token</name>
            <value><개인 액세스 토큰></value>
          </property>
        </httpHeaders>
      </configuration>
    </server>
  </servers>
  <mirrors>
    <mirror>
      <id>central-proxy</id>
      <name>GitLab 중앙 리포지터리 프록시</name>
      <url>https://gitlab.example.com/api/v4/projects/<project_id>/packages/maven</url>
      <mirrorOf>central</mirrorOf>
    </mirror>
  </mirrors>
</settings>

GitLab CI/CD를 사용하여 Maven 패키지 생성

리포지터리를 Maven을 위한 패키지 리포지터리를 사용하도록 구성한 후에 GitLab CI/CD를 구성하여 자동으로 새 패키지를 빌드할 수 있습니다.

mvn

기본 브랜치가 업데이트될 때마다 새 패키지를 만들 수 있습니다.

  1. Maven의 settings.xml 파일로 사용될 ci_settings.xml 파일을 생성합니다.

  2. pom.xml 파일에서 정의한 ID와 동일한 ID를 가진 server 섹션을 추가합니다. 예를 들어, ID로 gitlab-maven을 사용합니다.

     <settings xmlns="http://maven.apache.org/SETTINGS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd">
       <servers>
         <server>
           <id>gitlab-maven</id>
           <configuration>
             <httpHeaders>
               <property>
                 <name>Job-Token</name>
                 <value>${CI_JOB_TOKEN}</value>
               </property>
             </httpHeaders>
           </configuration>
         </server>
       </servers>
     </settings>
    
  3. pom.xml 파일이 다음을 포함하는지 확인합니다. Maven이 미리 정의된 CI/CD 변수를 사용하도록 하거나, 이 예제와 같이 서버의 호스트명과 프로젝트 ID를 직접 지정할 수 있습니다.

     <repositories>
       <repository>
         <id>gitlab-maven</id>
         <url>${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/maven</url>
       </repository>
     </repositories>
     <distributionManagement>
       <repository>
         <id>gitlab-maven</id>
         <url>${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/maven</url>
       </repository>
       <snapshotRepository>
         <id>gitlab-maven</id>
         <url>${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/maven</url>
       </snapshotRepository>
     </distributionManagement>
    
  4. .gitlab-ci.yml 파일에 deploy 작업을 추가합니다.

     deploy:
       image: maven:3.6-jdk-11
       script:
         - 'mvn deploy -s ci_settings.xml'
       rules:
         - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
    
  5. 이러한 파일들을 리포지터리에 푸시합니다.

deploy 작업이 다음에 실행될 때에는 ci_settings.xml이 사용자 홈 위치로 복사됩니다. 이 예에서:

  • 사용자는 도커 컨테이너에서 작업이 실행되기 때문에 root입니다.
  • Maven은 구성된 CI/CD 변수를 사용합니다.
gradle

기본 브랜치가 업데이트될 때마다 패키지를 만들 수 있습니다.

  1. CI 작업 토큰을 사용하여 인증.

  2. .gitlab-ci.yml 파일에 deploy 작업을 추가합니다.

     deploy:
       image: gradle:6.5-jdk11
       script:
         - 'gradle publish'
       rules:
         - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
    
  3. 파일을 리포지터리에 커밋합니다.

파이프라인이 성공하면 Maven 패키지가 생성됩니다.

버전 유효성 검사

버전 문자열은 다음의 정규식을 사용하여 유효성을 검사합니다.

\A(?!.*\.\.)[\w+.-]+\z

이 정규식을 사용하여 버전 문자열을 이 정규식 편집기에서 시도해볼 수 있습니다.

유용한 Maven 명령줄 옵션

GitLab CI/CD를 사용할 때 일부 Maven 명령줄 옵션을 사용할 수 있습니다.

  • 파일 전송 진행률은 CI 로그를 읽기 어렵게 만들 수 있습니다. 옵션 -ntp,--no-transfer-progress3.6.1에 추가되었습니다. 또는 -B,--batch-mode를 확인하거나 로그 수준 변경을 살펴보세요.

  • pom.xml 파일의 위치를 명시할 수 있습니다(-f,--file):

      package:
        script:
          - 'mvn --no-transfer-progress -f helloworld/pom.xml package'
    
  • 사용자 설정을 찾을 위치를 명시할 수 있습니다(-s,--settings) 기본 위치 대신. -gs,--global-settings 옵션도 있습니다:

      package:
        script:
          - 'mvn -s settings/ci.xml package'
    

지원되는 CLI 명령어

GitLab Maven 리포지터리는 다음 CLI 몤령어를 지원합니다:

mvn
  • mvn deploy: 패키지를 패키지 레지스트리에 발행합니다.
  • mvn install: Maven 프로젝트에서 지정된 패키지를 설치합니다.
  • mvn dependency:get: 특정 패키지를 설치합니다.
gradle
  • gradle publish: 패키지를 패키지 레지스트리에 발행합니다.
  • gradle install: Gradle 프로젝트에서 지정된 패키지를 설치합니다.

문제 해결

성능을 향상시키기 위해 클라이언트는 패키지와 관련된 파일을 캐시합니다. 문제가 발생하면 다음 명령어로 캐시를 지울 수 있습니다:

mvn
rm -rf ~/.m2/repository
gradle
rm -rf ~/.gradle/caches # 또는 ~/.gradle을 사용자 지정 GRADLE_USER_HOME으로 바꿉니다

네트워크 추적 로그 확인

Maven 리포지터리에서 문제가 있을 경우 네트워크 추적 로그를 확인할 수 있습니다.

예를 들어, PAT 토큰과 함께 로컬에서 mvn deploy를 실행하고 다음 옵션을 사용해보세요:

mvn deploy \
-Dorg.slf4j.simpleLogger.log.org.apache.maven.wagon.providers.http.httpclient=trace \
-Dorg.slf4j.simpleLogger.log.org.apache.maven.wagon.providers.http.httpclient.wire=trace
caution
이러한 옵션을 설정하면 모든 네트워크 요청이 로깅되며 많은 양의 출력이 생성됩니다.

Maven 설정 확인

만약 settings.xml 파일과 관련된 CI/CD 내의 문제가 발생한다면, 유효한 설정을 확인하기 위해 추가적인 스크립트 작업이나 작업을 추가해 보세요.

도움 플러그인은 또한 시스템 속성을 제공할 수 있습니다. 이 속성에는 환경 변수도 포함됩니다.

mvn-settings:
  script:
    - 'mvn help:effective-settings'

package:
  script:
    - 'mvn help:system'
    - 'mvn package'