InfoGrab Docs

Jenkins에서 GitLab CI/CD로 Maven 빌드 마이그레이션

요약

Jenkins에 Maven 빌드가 있는 경우 Java Spring 프로젝트 템플릿을 사용하여 GitLab으로 마이그레이션할 수 있습니다. 다음 세 가지 Jenkins 예시는 각각 다른 방법을 사용하여 셸 에이전트에서 Maven 프로젝트를 테스트, 빌드 및 설치합니다:

Jenkins에 Maven 빌드가 있는 경우 Java Spring 프로젝트 템플릿을 사용하여 GitLab으로 마이그레이션할 수 있습니다. 템플릿은 기본 의존성 관리에 Maven을 사용합니다.

샘플 Jenkins 구성#

다음 세 가지 Jenkins 예시는 각각 다른 방법을 사용하여 셸 에이전트에서 Maven 프로젝트를 테스트, 빌드 및 설치합니다:

  • 셸 실행이 있는 Freestyle
  • Maven 작업 플러그인이 있는 Freestyle
  • Jenkinsfile을 사용하는 선언적 파이프라인

세 가지 예시 모두 세 개의 다른 스테이지에서 동일한 세 가지 명령을 순서대로 실행합니다:

  • mvn test: 코드베이스에서 발견된 테스트 실행
  • mvn package -DskipTests: POM에 정의된 실행 가능한 유형으로 코드를 컴파일하고 첫 번째 스테이지에서 수행했으므로 테스트 실행을 건너뜁니다.
  • mvn install -DskipTests: 컴파일된 실행 파일을 에이전트의 로컬 Maven .m2 저장소에 설치하고 다시 테스트 실행을 건너뜁니다.

이 예시들은 단일 영구 Jenkins 에이전트를 사용하며, 에이전트에 Maven이 사전 설치되어 있어야 합니다. 이 실행 방법은 셸 실행기를 사용하는 GitLab Runner와 유사합니다.

셸 실행이 있는 Freestyle#

Jenkins의 내장 셸 실행 옵션을 사용하여 에이전트의 셸에서 mvn 명령을 직접 호출하는 경우 구성은 다음과 같을 수 있습니다:

셸 명령으로 정의된 Maven 명령이 있는 빌드 단계를 보여주는 Jenkins UI.

Maven 작업 플러그인이 있는 Freestyle#

Maven 플러그인을 사용하여 Maven 빌드 라이프사이클에서 특정 목표를 선언하고 실행하는 경우 구성은 다음과 같을 수 있습니다:

Maven 플러그인을 사용하여 정의된 Maven 명령이 있는 빌드 단계를 보여주는 Jenkins UI.

이 플러그인은 Jenkins 에이전트에 Maven이 설치되어 있어야 하며 Maven 명령을 호출하기 위한 스크립트 래퍼를 사용합니다.

선언적 파이프라인 사용#

선언적 파이프라인을 사용하는 경우 구성은 다음과 같을 수 있습니다:

pipeline {
    agent any
    tools {
        maven 'maven-3.6.3'
        jdk 'jdk11'
    }
    stages {
        stage('Build') {
            steps {
                sh "mvn package -DskipTests"
            }
        }
        stage('Test') {
            steps {
                sh "mvn test"
            }
        }
        stage('Install') {
            steps {
                sh "mvn install -DskipTests"
            }
        }
    }
}

이 예시는 플러그인 대신 셸 실행 명령을 사용합니다.

기본적으로 선언적 파이프라인 구성은 Jenkins 파이프라인 구성에 저장되거나 Jenksinfile의 Git 저장소에 직접 저장됩니다.

Jenkins 구성을 GitLab CI/CD로 변환#

이전 예시들은 모두 약간 다르지만 모두 동일한 파이프라인 구성으로 GitLab CI/CD로 마이그레이션할 수 있습니다.

사전 조건:

  • 셸 실행기가 있는 GitLab Runner
  • 셸 러너에 Maven 3.6.3 및 Java 11 JDK 설치됨

이 예시는 Jenkins에서 빌드, 테스트 및 설치하는 동작과 구문을 모방합니다.

GitLab CI/CD 파이프라인에서 명령은 스테이지로 그룹화된 "잡"에서 실행됩니다. .gitlab-ci.yml 구성 파일에서 마이그레이션된 구성은 두 개의 전역 키워드(stagesvariables)와 3개의 잡으로 구성됩니다:

stages:
  - build
  - test
  - install

variables:
  MAVEN_OPTS: >-
    -Dhttps.protocols=TLSv1.2
    -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository
  MAVEN_CLI_OPTS: >-
    -DskipTests

build-JAR:
  stage: build
  script:
    - mvn $MAVEN_CLI_OPTS package

test-code:
  stage: test
  script:
    - mvn test

install-JAR:
  stage: install
  script:
    - mvn $MAVEN_CLI_OPTS install

이 예시에서:

  • stages는 순서대로 실행되는 세 개의 스테이지를 정의합니다. 이전 Jenkins 예시와 마찬가지로 테스트 잡이 먼저 실행되고, 빌드 잡이 이어지고, 마지막으로 설치 잡이 실행됩니다.
  • variables는 모든 잡이 사용할 수 있는 CI/CD 변수를 정의합니다:
    • MAVEN_OPTS는 Maven이 실행될 때마다 필요한 Maven 환경 변수입니다:
      • -Dhttps.protocols=TLSv1.2는 파이프라인의 모든 HTTP 요청에 대해 TLS 프로토콜을 버전 1.2로 설정합니다.
      • -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository는 로컬 Maven 저장소의 위치를 러너의 GitLab 프로젝트 디렉토리로 설정하여 잡이 저장소에 액세스하고 수정할 수 있습니다.
    • MAVEN_CLI_OPTSmvn 명령에 추가할 특정 인수입니다:
      • -DskipTests는 Maven 빌드 라이프사이클에서 test 스테이지를 건너뜁니다.
  • test-code, build-JARinstall-JAR은 파이프라인에서 실행할 잡의 사용자 정의 이름입니다:
    • stage는 잡이 실행되는 스테이지를 정의합니다. 파이프라인에는 하나 이상의 스테이지가 있고 스테이지에는 하나 이상의 잡이 있습니다. 이 예시에는 세 개의 스테이지가 있으며 각각 단일 잡이 있습니다.
    • script는 잡에서 실행할 명령을 정의하며 Jenkinsfilesteps와 유사합니다. 잡은 이미지 컨테이너에서 실행되는 여러 명령을 순서대로 실행할 수 있지만 이 예시에서 잡은 각각 하나의 명령만 실행합니다.

Docker 컨테이너에서 잡 실행#

Jenkins 샘플처럼 이 빌드 프로세스를 처리하기 위해 영구 머신을 사용하는 대신 이 예시는 실행을 처리하기 위해 임시 Docker 컨테이너를 사용합니다. 컨테이너를 사용하면 가상 머신과 그 위에 설치된 Maven 버전을 유지 관리할 필요가 없습니다. 또한 파이프라인의 기능을 확장하고 연장하는 유연성이 향상됩니다.

사전 조건:

  • 프로젝트에서 사용할 수 있는 Docker 실행기가 있는 GitLab Runner. GitLab.com을 사용하는 경우 공개 인스턴스 러너를 사용할 수 있습니다.

이 마이그레이션된 파이프라인 구성은 세 개의 전역 키워드(stages, defaultvariables)와 3개의 잡으로 구성됩니다. 이 구성은 이전 예시와 비교하여 개선된 파이프라인을 위해 추가적인 GitLab CI/CD 기능을 사용합니다:

stages:
  - build
  - test
  - install

default:
  image: maven:3.6.3-openjdk-11
  cache:
    key: $CI_COMMIT_REF_SLUG
    paths:
      - .m2/

variables:
  MAVEN_OPTS: >-
    -Dhttps.protocols=TLSv1.2
    -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository
  MAVEN_CLI_OPTS: >-
    -DskipTests

build-JAR:
  stage: build
  script:
    - mvn $MAVEN_CLI_OPTS package

test-code:
  stage: test
  script:
    - mvn test

install-JAR:
  stage: install
  script:
    - mvn $MAVEN_CLI_OPTS install

이 예시에서:

  • stages는 순서대로 실행되는 세 개의 스테이지를 정의합니다. 이전 Jenkins 예시와 마찬가지로 테스트 잡이 먼저 실행되고, 빌드 잡이 이어지고, 마지막으로 설치 잡이 실행됩니다.
  • default는 기본적으로 모든 잡에서 재사용할 표준 구성을 정의합니다:
    • image는 명령을 사용하고 실행할 Docker 이미지 컨테이너를 정의합니다. 이 예시에서는 이미 모든 것이 설치된 공식 Maven Docker 이미지입니다.
    • cache는 의존성을 캐시하고 재사용하는 데 사용됩니다:
      • key는 특정 캐시 아카이브의 고유 식별자입니다. 이 예시에서는 사전 정의된 CI/CD 변수로 자동 생성된 Git 커밋 ref의 단축 버전입니다. 동일한 커밋 ref에 대해 실행되는 모든 잡은 동일한 캐시를 재사용합니다.
      • paths는 캐시에 포함할 디렉토리 또는 파일입니다. 이 예시는 잡 실행 간에 의존성을 재설치하는 것을 피하기 위해 .m2/ 디렉토리를 캐시합니다.
  • variables는 모든 잡이 사용할 수 있는 CI/CD 변수를 정의합니다:
    • MAVEN_OPTS는 Maven이 실행될 때마다 필요한 Maven 환경 변수입니다:
      • -Dhttps.protocols=TLSv1.2는 파이프라인의 모든 HTTP 요청에 대해 TLS 프로토콜을 버전 1.2로 설정합니다.
      • -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository는 로컬 Maven 저장소의 위치를 러너의 GitLab 프로젝트 디렉토리로 설정하여 잡이 저장소에 액세스하고 수정할 수 있습니다.
    • MAVEN_CLI_OPTSmvn 명령에 추가할 특정 인수입니다:
      • -DskipTests는 Maven 빌드 라이프사이클에서 test 스테이지를 건너뜁니다.
  • test-code, build-JARinstall-JAR은 파이프라인에서 실행할 잡의 사용자 정의 이름입니다:
    • stage는 잡이 실행되는 스테이지를 정의합니다. 파이프라인에는 하나 이상의 스테이지가 있고 스테이지에는 하나 이상의 잡이 있습니다. 이 예시에는 세 개의 스테이지가 있으며 각각 단일 잡이 있습니다.
    • script는 잡에서 실행할 명령을 정의하며 Jenkinsfilesteps와 유사합니다. 잡은 이미지 컨테이너에서 실행되는 여러 명령을 순서대로 실행할 수 있지만 이 예시에서 잡은 각각 하나의 명령만 실행합니다.

Jenkins에서 GitLab CI/CD로 Maven 빌드 마이그레이션

Tier: Free, Premium, Ultimate
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
원문 보기
요약

Jenkins에 Maven 빌드가 있는 경우 Java Spring 프로젝트 템플릿을 사용하여 GitLab으로 마이그레이션할 수 있습니다. 다음 세 가지 Jenkins 예시는 각각 다른 방법을 사용하여 셸 에이전트에서 Maven 프로젝트를 테스트, 빌드 및 설치합니다:

Jenkins에 Maven 빌드가 있는 경우 Java Spring 프로젝트 템플릿을 사용하여 GitLab으로 마이그레이션할 수 있습니다. 템플릿은 기본 의존성 관리에 Maven을 사용합니다.

샘플 Jenkins 구성#

다음 세 가지 Jenkins 예시는 각각 다른 방법을 사용하여 셸 에이전트에서 Maven 프로젝트를 테스트, 빌드 및 설치합니다:

  • 셸 실행이 있는 Freestyle
  • Maven 작업 플러그인이 있는 Freestyle
  • Jenkinsfile을 사용하는 선언적 파이프라인

세 가지 예시 모두 세 개의 다른 스테이지에서 동일한 세 가지 명령을 순서대로 실행합니다:

  • mvn test: 코드베이스에서 발견된 테스트 실행
  • mvn package -DskipTests: POM에 정의된 실행 가능한 유형으로 코드를 컴파일하고 첫 번째 스테이지에서 수행했으므로 테스트 실행을 건너뜁니다.
  • mvn install -DskipTests: 컴파일된 실행 파일을 에이전트의 로컬 Maven .m2 저장소에 설치하고 다시 테스트 실행을 건너뜁니다.

이 예시들은 단일 영구 Jenkins 에이전트를 사용하며, 에이전트에 Maven이 사전 설치되어 있어야 합니다. 이 실행 방법은 셸 실행기를 사용하는 GitLab Runner와 유사합니다.

셸 실행이 있는 Freestyle#

Jenkins의 내장 셸 실행 옵션을 사용하여 에이전트의 셸에서 mvn 명령을 직접 호출하는 경우 구성은 다음과 같을 수 있습니다:

셸 명령으로 정의된 Maven 명령이 있는 빌드 단계를 보여주는 Jenkins UI.

Maven 작업 플러그인이 있는 Freestyle#

Maven 플러그인을 사용하여 Maven 빌드 라이프사이클에서 특정 목표를 선언하고 실행하는 경우 구성은 다음과 같을 수 있습니다:

Maven 플러그인을 사용하여 정의된 Maven 명령이 있는 빌드 단계를 보여주는 Jenkins UI.

이 플러그인은 Jenkins 에이전트에 Maven이 설치되어 있어야 하며 Maven 명령을 호출하기 위한 스크립트 래퍼를 사용합니다.

선언적 파이프라인 사용#

선언적 파이프라인을 사용하는 경우 구성은 다음과 같을 수 있습니다:

pipeline {
    agent any
    tools {
        maven 'maven-3.6.3'
        jdk 'jdk11'
    }
    stages {
        stage('Build') {
            steps {
                sh "mvn package -DskipTests"
            }
        }
        stage('Test') {
            steps {
                sh "mvn test"
            }
        }
        stage('Install') {
            steps {
                sh "mvn install -DskipTests"
            }
        }
    }
}

이 예시는 플러그인 대신 셸 실행 명령을 사용합니다.

기본적으로 선언적 파이프라인 구성은 Jenkins 파이프라인 구성에 저장되거나 Jenksinfile의 Git 저장소에 직접 저장됩니다.

Jenkins 구성을 GitLab CI/CD로 변환#

이전 예시들은 모두 약간 다르지만 모두 동일한 파이프라인 구성으로 GitLab CI/CD로 마이그레이션할 수 있습니다.

사전 조건:

  • 셸 실행기가 있는 GitLab Runner
  • 셸 러너에 Maven 3.6.3 및 Java 11 JDK 설치됨

이 예시는 Jenkins에서 빌드, 테스트 및 설치하는 동작과 구문을 모방합니다.

GitLab CI/CD 파이프라인에서 명령은 스테이지로 그룹화된 "잡"에서 실행됩니다. .gitlab-ci.yml 구성 파일에서 마이그레이션된 구성은 두 개의 전역 키워드(stagesvariables)와 3개의 잡으로 구성됩니다:

stages:
  - build
  - test
  - install

variables:
  MAVEN_OPTS: >-
    -Dhttps.protocols=TLSv1.2
    -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository
  MAVEN_CLI_OPTS: >-
    -DskipTests

build-JAR:
  stage: build
  script:
    - mvn $MAVEN_CLI_OPTS package

test-code:
  stage: test
  script:
    - mvn test

install-JAR:
  stage: install
  script:
    - mvn $MAVEN_CLI_OPTS install

이 예시에서:

  • stages는 순서대로 실행되는 세 개의 스테이지를 정의합니다. 이전 Jenkins 예시와 마찬가지로 테스트 잡이 먼저 실행되고, 빌드 잡이 이어지고, 마지막으로 설치 잡이 실행됩니다.
  • variables는 모든 잡이 사용할 수 있는 CI/CD 변수를 정의합니다:
    • MAVEN_OPTS는 Maven이 실행될 때마다 필요한 Maven 환경 변수입니다:
      • -Dhttps.protocols=TLSv1.2는 파이프라인의 모든 HTTP 요청에 대해 TLS 프로토콜을 버전 1.2로 설정합니다.
      • -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository는 로컬 Maven 저장소의 위치를 러너의 GitLab 프로젝트 디렉토리로 설정하여 잡이 저장소에 액세스하고 수정할 수 있습니다.
    • MAVEN_CLI_OPTSmvn 명령에 추가할 특정 인수입니다:
      • -DskipTests는 Maven 빌드 라이프사이클에서 test 스테이지를 건너뜁니다.
  • test-code, build-JARinstall-JAR은 파이프라인에서 실행할 잡의 사용자 정의 이름입니다:
    • stage는 잡이 실행되는 스테이지를 정의합니다. 파이프라인에는 하나 이상의 스테이지가 있고 스테이지에는 하나 이상의 잡이 있습니다. 이 예시에는 세 개의 스테이지가 있으며 각각 단일 잡이 있습니다.
    • script는 잡에서 실행할 명령을 정의하며 Jenkinsfilesteps와 유사합니다. 잡은 이미지 컨테이너에서 실행되는 여러 명령을 순서대로 실행할 수 있지만 이 예시에서 잡은 각각 하나의 명령만 실행합니다.

Docker 컨테이너에서 잡 실행#

Jenkins 샘플처럼 이 빌드 프로세스를 처리하기 위해 영구 머신을 사용하는 대신 이 예시는 실행을 처리하기 위해 임시 Docker 컨테이너를 사용합니다. 컨테이너를 사용하면 가상 머신과 그 위에 설치된 Maven 버전을 유지 관리할 필요가 없습니다. 또한 파이프라인의 기능을 확장하고 연장하는 유연성이 향상됩니다.

사전 조건:

  • 프로젝트에서 사용할 수 있는 Docker 실행기가 있는 GitLab Runner. GitLab.com을 사용하는 경우 공개 인스턴스 러너를 사용할 수 있습니다.

이 마이그레이션된 파이프라인 구성은 세 개의 전역 키워드(stages, defaultvariables)와 3개의 잡으로 구성됩니다. 이 구성은 이전 예시와 비교하여 개선된 파이프라인을 위해 추가적인 GitLab CI/CD 기능을 사용합니다:

stages:
  - build
  - test
  - install

default:
  image: maven:3.6.3-openjdk-11
  cache:
    key: $CI_COMMIT_REF_SLUG
    paths:
      - .m2/

variables:
  MAVEN_OPTS: >-
    -Dhttps.protocols=TLSv1.2
    -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository
  MAVEN_CLI_OPTS: >-
    -DskipTests

build-JAR:
  stage: build
  script:
    - mvn $MAVEN_CLI_OPTS package

test-code:
  stage: test
  script:
    - mvn test

install-JAR:
  stage: install
  script:
    - mvn $MAVEN_CLI_OPTS install

이 예시에서:

  • stages는 순서대로 실행되는 세 개의 스테이지를 정의합니다. 이전 Jenkins 예시와 마찬가지로 테스트 잡이 먼저 실행되고, 빌드 잡이 이어지고, 마지막으로 설치 잡이 실행됩니다.
  • default는 기본적으로 모든 잡에서 재사용할 표준 구성을 정의합니다:
    • image는 명령을 사용하고 실행할 Docker 이미지 컨테이너를 정의합니다. 이 예시에서는 이미 모든 것이 설치된 공식 Maven Docker 이미지입니다.
    • cache는 의존성을 캐시하고 재사용하는 데 사용됩니다:
      • key는 특정 캐시 아카이브의 고유 식별자입니다. 이 예시에서는 사전 정의된 CI/CD 변수로 자동 생성된 Git 커밋 ref의 단축 버전입니다. 동일한 커밋 ref에 대해 실행되는 모든 잡은 동일한 캐시를 재사용합니다.
      • paths는 캐시에 포함할 디렉토리 또는 파일입니다. 이 예시는 잡 실행 간에 의존성을 재설치하는 것을 피하기 위해 .m2/ 디렉토리를 캐시합니다.
  • variables는 모든 잡이 사용할 수 있는 CI/CD 변수를 정의합니다:
    • MAVEN_OPTS는 Maven이 실행될 때마다 필요한 Maven 환경 변수입니다:
      • -Dhttps.protocols=TLSv1.2는 파이프라인의 모든 HTTP 요청에 대해 TLS 프로토콜을 버전 1.2로 설정합니다.
      • -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository는 로컬 Maven 저장소의 위치를 러너의 GitLab 프로젝트 디렉토리로 설정하여 잡이 저장소에 액세스하고 수정할 수 있습니다.
    • MAVEN_CLI_OPTSmvn 명령에 추가할 특정 인수입니다:
      • -DskipTests는 Maven 빌드 라이프사이클에서 test 스테이지를 건너뜁니다.
  • test-code, build-JARinstall-JAR은 파이프라인에서 실행할 잡의 사용자 정의 이름입니다:
    • stage는 잡이 실행되는 스테이지를 정의합니다. 파이프라인에는 하나 이상의 스테이지가 있고 스테이지에는 하나 이상의 잡이 있습니다. 이 예시에는 세 개의 스테이지가 있으며 각각 단일 잡이 있습니다.
    • script는 잡에서 실행할 명령을 정의하며 Jenkinsfilesteps와 유사합니다. 잡은 이미지 컨테이너에서 실행되는 여러 명령을 순서대로 실행할 수 있지만 이 예시에서 잡은 각각 하나의 명령만 실행합니다.