본문 바로가기
study/TIP

JENKINS MVN BUILD OPTION

by 휘루걸음 2026. 1. 14.
728x90
반응형

 

JENKINS 빌드 과정에서 캐시된 라이브러리 때문인지 빌드오류가 발생하는 경우가 있었다.

회사 NEXUS에 분명히 해당 라이브러리가 존재하고, 내가 별도로 올리기도 해봤지만 해당 라이브러리에 대한 참조 오류가 계속 발생하더라.

 

반응형

아래 옵션으로 대응하였다.

728x90

1) mvn clean install -U 정확히 이해하기

clean

  • 이전 빌드 산출물(target/)을 모두 삭제합니다.
  • 장점: 빌드 오염(잔여 클래스/리소스) 방지.
  • 주의: 캐시된 로컬 아티팩트는 유지되므로, 의존성 자체를 초기화하려면 ~/.m2/repository 관리가 필요.

install

  • 현재 프로젝트를 빌드하여 로컬 Maven 저장소(~/.m2/repository)에 설치합니다.
  • 모듈형 프로젝트(멀티모듈)에서 상위/하위 모듈 간 의존을 로컬로 테스트할 때 유용.

-U (또는 --update-snapshots)

  • 스냅샷(SNAPSHOT) 의존성강제로 새로고침합니다.
  • 원격 저장소에서 최신 스냅샷을 다시 가져오므로, “스냅샷이 최신 반영 안 됨” 문제를 해결.
  • 주의(성능): 네트워크 요청 증가 → CI에서 매번 -U 사용하면 빌드 느려질 수 있음. 필요할 때만 쓰는 것이 베스트.

요약\ mvn clean install -U = 깨끗하게 다시 빌드하고, 결과를 로컬 저장소에 설치하며, 스냅샷 의존성을 강제 업데이트.


2) Jenkins에서 Maven 빌드 옵션: 실전 가이드

A. Declarative Pipeline 예시

 

pipeline {
  agent any
  tools {
    maven 'Maven-3.9'    // Jenkins Global Tool에서 등록한 이름
    jdk   'Temurin-17'   // JDK 설정
  }
  options {
    timestamps()
    ansiColor('xterm')
    timeout(time: 30, unit: 'MINUTES')
  }
  environment {
    // 빌드 파라미터/옵션 전달
    MAVEN_OPTS = '-Xms512m -Xmx2g -Djava.awt.headless=true'
  }
  stages {
    stage('Checkout') {
      steps {
        checkout scm
      }
    }
    stage('Build') {
      steps {
        sh 'mvn -B -U -DskipTests clean install'
      }
    }
    stage('Unit Test') {
      steps {
        sh 'mvn -B test'
        junit '*/target/surefire-reports/.xml'
      }
    }
    stage('Package') {
      steps {
        sh 'mvn -B package -DskipTests'
        archiveArtifacts artifacts: '/target/.jar', fingerprint: true
      }
    }
  }
}

핵심 포인트

  • -B (--batch-mode): Jenkins 등 비대화식 환경에서 안전한 로그/출력.
  • -U: 스냅샷 새로고침. 필요할 때만.
  • -DskipTests vs -Dmaven.test.skip=true:
    • -DskipTests: 테스트 실행만 건너뜀, 컴파일은 수행 → 테스트 코드 컴파일 오류는 잡힘.
    • -Dmaven.test.skip=true: 테스트 컴파일+실행 모두 건너뜀 → 가장 빠르지만, 테스트 컴파일 오류를 놓칠 수 있음.

3) 자주 쓰는 Maven 옵션 & 쓰임새

빌드 성능/안정성

  • -T 1C 또는 -T 4: 멀티스레드 빌드(모듈 병렬). CPU 코어 기반 추천 -T 1C.
  • --fail-at-end: 병렬/다중모듈에서 실패는 끝에 보고(나머지 모듈 계속 빌드).
  • --no-transfer-progress: 전송 프로그레스 바 숨김 → Jenkins 로그 깔끔, 빌드 속도 약간 개선.
  • -e: 에러 스택 출력.
  • -X: 디버그 로그(문제 분석 시에만).

프로파일/환경

  • -P dev,ci: 프로파일 활성화. pom.xml/profiles.xml의 설정 분기.
  • -DskipITs: Failsafe(통합 테스트)만 스킵.
  • -Drevision=1.2.3: Flatten/CI 버전 주입(Release 플러그인이나 CI-friendly versioning과 함께).
  • -Duser.timezone=Asia/Seoul: 타임존 민감 로직에 명시적 지정.

의존성/저장소

  • -s /path/settings.xml: Jenkins에서 Config File Provider로 팀 표준 settings.xml 지정(사설 Nexus 인증, 미러, 프록시).
  • -U: 스냅샷 신선도 보장(빈도 조절).
  • -o (--offline): 오프라인 빌드. CI에서는 권장 X(의존성 누락 시 실패).

테스트/리포팅

  • Surefire(Unit): mvn test -Dsurefire.useFile=false → 콘솔 로그 즉시 출력.
  • Failsafe(IT): mvn verify -DskipITs로 통합 테스트 선택적 실행.
  • JaCoCo: mvn verify -P coverage 후 jacoco.xml 생성 → Jenkins에서 커버리지 플러그인/소나큐브 연계.

4) Jenkins 실무 팁 (속도·안정성·재현성)

4.1 캐시 & 네트워크 최적화

  • .m2/repository 캐시: 에이전트마다 공유하거나, 노드 로컬 디스크에 유지.
    • Jenkins Pipeline:
      stage('Cache') {
        steps {
          // 예: 캐시 디렉토리를 워크스페이스 외부 경로로 유지
          sh 'mkdir -p ~/.m2/repository'
        }
      }
  • -U 남용 금지: 스냅샷 갱신이 꼭 필요할 때만. 릴리스 브랜치에서는 보통 불필요.
  • 사설 레지스트리(Nexus/Artifactory) 미러 설정: settings.xml에서 mirror로 중앙 저장소 요청을 내부로 우선 전환.

4.2 설정 관리

  • Jenkins Config File Provider로 팀 공용 settings.xml(레포지토리, 인증, 미러, 프로파일)을 중앙에서 관리.
  • 시크릿(server credentials)은 Jenkins Credentials + settings.xml <server> 연계.

4.3 파이프라인 구조화

  • 단계 분리: compile → unit test → package → integration test → quality gate.
  • 병렬 테스트:
    parallel {
      stage('Unit') { steps { sh 'mvn -B -T 1C test' } }
      stage('IT')   { steps { sh 'mvn -B -T 1C verify -DskipITs=false' } }
    }
  • 재시도: 네트워크 이슈 완화 retry(2) { sh 'mvn -B clean install' }

4.4 로그/리포트

  • junit '**/target/surefire-reports/*.xml'로 실패 케이스를 Jenkins에 수집.
  • archiveArtifacts로 산출물 보관.
  • --no-transfer-progress, -B로 로그 간결화.

5) 스냅샷과 릴리스: 운영 전략

  • 스냅샷(SNAPSHOT): 개발 중 빠른 공유가 목적 → -U로 최신성 확보. 단, 신뢰성·속도 트레이드오프.
  • 릴리스(Release): 고정 버전 의존성, 반복 가능한 빌드 → -U 불필요, 오프라인 캐시 활용 가능.
  • 브랜치 정책:
    • develop: -U 허용 (변경 활발).
    • release/hotfix: 고정 의존성, -U 회피.

6) 문제 해결 체크리스트

  • 의존성 못 받음: settings.xml의 <mirrors>, <proxies>, <servers> 확인. -U로 스냅샷 강제 갱신, -X로 상세 로그 확인.
  • 빌드 느림: -T로 병렬, --no-transfer-progress, 캐시 유지, -Dmaven.test.skip=true(임시).
  • 테스트 실패: Surefire/Failsafe 리포트 경로 확인, junit 스텝 수집, flaky 테스트면 retry 전략.
  • 버전 주입 이슈: CI-friendly versioning(revision, changelist, sha1) 체크 및 flatten-maven-plugin.

7) 주요옵션

  • clean: 이전 산출물 삭제
  • install: 로컬 저장소에 설치
  • -U/--update-snapshots: 스냅샷 의존성 강제 업데이트
  • -B: 배치 모드(비대화식)
  • -DskipTests: 테스트 실행만 건너뜀
  • -Dmaven.test.skip=true: 테스트 컴파일+실행 모두 건너뜀
  • -T 1C: CPU 코어 수만큼 병렬 빌드
  • --fail-at-end: 다른 모듈 계속 빌드 후 실패 보고
  • --no-transfer-progress: 로그 정리, 약간의 성능 향상
  • -e/-X: 에러/디버그 상세 로그
  • -P <profiles>: 환경별 프로파일
  • -s <settings.xml>: 저장소/미러/인증 설정 지정

8) 실전 커맨드 레시피

  • 개발 브랜치 빠른 빌드
    mvn -B -U -DskipTests clean install
  • 품질 게이트 포함(커버리지+IT) mvn -B --no-transfer-progress clean verify -P coverage
  • 멀티모듈+병렬 mvn -B -T 1C --fail-at-end clean install
  • 릴리스 빌드(테스트 포함, 스냅샷 미사용)
    mvn -B clean verify

9) 마무리 활용 팁

  • Jenkins 노드별 .m2 캐시 유지 + 공용 settings.xml로 네트워크 안정성 확보.
  • -U는 정말 최신 스냅샷이 필요할 때만. 릴리스 라인에서는 지양.
  • 파이프라인을 모듈화/병렬화하고, 테스트 리포트를 항상 수집.
  • 로그는 -B + --no-transfer-progress로 간결하게.

 

728x90
반응형