Jenkins에서 GitLab CI/CD로의 Maven 빌드 마이그레이션
Jenkins에 Maven 빌드가 있는 경우, Java Spring 프로젝트 템플릿을 사용하여 GitLab로 마이그레이션할 수 있습니다. 이 템플릿은 내부 의존성 관리를 위해 Maven을 사용합니다.
Jenkins 구성 예시
다음 세 가지 Jenkins 예시는 각각 다른 방법으로 Maven 프로젝트를 테스트하고 빌드하며, 쉘 에이전트에 설치하는 메서드를 사용합니다.
- 쉘 실행 기반 자유형(자유 설정 프로젝트) 프로젝트
- Maven 작업 플러그인을 사용한 자유형 프로젝트
- Jenkinsfile을 사용한 선언적 파이프라인
세 가지 예시 모두 세 가지 다른 단계에서 세 개의 명령을 실행합니다:
-
mvn test
: 코드 베이스에서 발견된 테스트를 실행합니다. -
mvn package -DskipTests
: 코드를 POM에서 정의된 실행 가능한 유형으로 컴파일하고 테스트 실행은 처음 단계에서 완료했으므로 테스트를 건너뜁니다. -
mvn install -DskipTests
: 컴파일된 실행 파일을 에이전트의 로컬 Maven.m2
리포지터리에 설치하고 테스트 실행을 다시 건너뜁니다.
이 예시들은 Maven이 에이전트에 미리 설치되어 있는 단일한 지속적인 Jenkins 에이전트를 사용합니다. 이 실행 방법은 shell executor를 사용하는 GitLab Runner와 유사합니다.
쉘 실행 기반 자유형
Jenkins의 내장된 쉘 실행 옵션을 사용하여 에이전트에서 쉘을 통해 mvn
명령을 직접 호출하는 경우, 구성은 다음과 같을 수 있습니다:
Maven 작업 플러그인을 사용한 자유형
Jenkins에서 Maven 플러그인을 사용하여 Maven 빌드 라이프사이클에서 특정 목표를 선언하고 실행하는 경우, 구성은 다음과 같을 수 있습니다:
이 플러그인은 Maven이 Jenkins 에이전트에 설치되어 있어야 하며 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
의 직접적인 리포지터리에 저장됩니다.
Jenkins 구성을 GitLab CI/CD로 변환
위의 예시들은 모두 약간 다르지만, 모두 동일한 파이프라인 설정으로 GitLab CI/CD로 마이그레이션할 수 있습니다.
전제 조건:
- 쉘 executor를 가진 GitLab Runner
- 쉘 실행기(runner)에 설치되어 있는 Maven 3.6.3 및 Java 11 JDK
이 예시는 Jenkins와 유사하게 빌드, 테스트 및 설치 구문 및 구문을 모방합니다.
GitLab CI/CD 파이프라인에서 명령어는 “jobs”에서 실행되며, 이는 단계별로 그룹화됩니다.
.gitlab-ci.yml
구성 파일의 마이그레이션된 구성은 두 가지 전역 키워드(stages
및 variables
) 다음에 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 리포지터리의 위치를 runner에서 GitLab 프로젝트 디렉터리로 설정하여 작업이 리포지터리에 액세스하고 수정할 수 있도록 합니다.
-
-
MAVEN_CLI_OPTS
는mvn
명령에 추가할 특정 인수를 정의합니다:-
-DskipTests
는 Maven 빌드 라이프사이클의test
단계를 건너뛰도록 합니다.
-
-
-
test-code
,build-JAR
,install-JAR
는 파이프라인에서 실행할 사용자 정의 작업에 대한 이름입니다:-
stage
는 작업이 실행될 단계를 정의합니다. 파이프라인에는 하나 이상의 단계가 있으며, 각 단계에는 하나 이상의 작업이 있습니다. 이 예시는 세 개의 단계가 있으며, 각 단계에는 하나의 작업만 있습니다. -
script
는 해당 작업에서 실행할 명령을 정의합니다. 이것은Jenkinsfile
에서steps
와 유사합니다. 작업은 이미지 컨테이너에서 실행되는 여러 명령을 실행할 수 있지만, 이 예시에서는 각 작업이 각각 하나의 명령만 실행합니다.
-
Docker 컨테이너에서 작업 실행
Jenkins 예시에서와 같이 이 빌드 프로세스를 처리하기 위해 지속적인 머신을 사용하는 대신, 이 예시는 일시적인 Docker 컨테이너를 사용하여 실행합니다. 컨테이너 사용은 가상 머신 유지 관리 및 그 위에 설치된 Maven 버전을 관리할 필요를 제거합니다. 또한 파이프라인의 기능을 확장하고 확장하는 데 유연성을 높입니다.
필수 조건:
- 프로젝트에서 사용할 수 있는 Docker executor를 사용하는 GitLab Runner GitLab.com을 사용하는 경우, 공용 인스턴스 러너를 사용할 수 있습니다.
이 마이그레이션된 파이프라인 구성은 세 가지 전역 키워드(stages
, default
, variables
) 다음에 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
는 해당 캐시 아카이브의 고유 식별자를 정의합니다. 이 예시에서는 Git 커밋 ref의 줄임말로, 사전 정의된 CI/CD 변수로 자동 생성됩니다. 동일한 커밋 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 리포지터리의 위치를 runner에서 GitLab 프로젝트 디렉터리로 설정하여 작업이 리포지터리에 액세스하고 수정할 수 있도록 하며
-
-
MAVEN_CLI_OPTS
는mvn
명령에 추가할 특정 인수를 정의합니다:-
-DskipTests
는 Maven 빌드 라이프사이클의test
단계를 건너뛰도록 합니다.
-
-
-
test-code
,build-JAR
,install-JAR
는 파이프라인에서 실행할 사용자 정의 작업에 대한 이름입니다:-
stage
는 작업이 실행될 단계를 정의합니다. 파이프라인에는 하나 이상의 단계가 있으며, 각 단계에는 하나 이상의 작업이 있습니다. 이 예시는 세 개의 단계가 있으며, 각 단계에는 하나의 작업만 있습니다. -
script
는 해당 작업에서 실행할 명령을 정의합니다. 이것은Jenkinsfile
에서steps
와 유사합니다. 작업은 이미지 컨테이너에서 실행되는 여러 명령을 실행할 수 있지만, 이 예시에서는 각 작업이 각각 하나의 명령만 실행합니다.
-