seoyyyy-dev
젠킨스 CI/CD - 메이븐으로 자바 API 프로젝트 준비 본문
이제 젠킨스에서 애플리케이션의 빌드 수명 주기 전체를 관리하는 실제 사용법을 알아본다.
책에서 메이븐 빌드 도구를 이용하는 법이 나와있기 때문에 실습도 자바 API 프로젝트와 메이븐으로 하겠다.
🐗자바 API 프로젝트 개발 과정
1️⃣ 서드파티 라이브러리 다운로드
- 애플리케이션 구현 시 라이브러리를 활용하는데 자바 API 프로젝트의 경우 JDK가 이에 해당한다. 그리고 기본 라이브러리 외에 다른 API 개발자가 구현한 라이브러리를 사용하는데 이를 서드파티 라이브러리(third-party library)라고 한다. 서드파티 라이브러리들은 보통 mvn 리포지터리와 같은 아티팩트 또는 패키지 레지스트리라고 불리는 별도의 웹 플랫폼을 통해 제공된다. 이 중앙 리포지토리를 통해 사용자가 라이브러리 파일을 다운로드 해야한다.
2️⃣ 프로젝트에 라이브러리 추가
- 1️⃣ 에서 다운로드한 라이브러리를 작업중인 래퍼런스 라이브러리에 추가한다. 자바 API 프로젝트의 경우 프로젝트의 CLASSPATH에 추가된다.
3️⃣ 단위 테스트 케이스 작성
- 특정 함수의 구현이 완료되면 단위 테스트 케이스를 작성한다. 개발자가 테스트 주도 개발 방식(TDD)으로 개발하는 경우 함수 본문을 구현하기 전 테스트 케이스를 먼저 작성한다.
4️⃣ 애플리케이션과 단위 테스트 케이스 코드 컴파일
- 코드를 작성한 후 API 소스 코드와 단위 테스트 케이스를 모두 컴파일한다.
5️⃣ 테스트 케이스 실행
- 컴파일한 후 개발자는 TestNG, Pytest, NUnit과 같은 테스트 도구를 사용해 단위 테스트 케이스를 실행한다. 이 때 사용하는 도구들은 개발 환경에 따라 달라진다.
6️⃣ 애플리케이션 번들링/패키징
- 단위테스트가 완료되고 코드 통합도 끝나면 구현 결과를 라이브러리(.jar) 파일로 패키징 한다.
6️⃣ 아티팩트 리포지터리로 릴리스
- 해당 라이브버리 버전이 생성되면 사용자가 다운로드할 수 있도록 아티팩트 리포지터리로 릴리즈한다.
이제 메이븐 빌드 도구로 자바 API 프로젝트를 빌드하는 법을 실습해보려 한다.
책에서는 이클립스를 사용해주었지만 인텔리제이를 사용하여 실습할 것이다.
실습을 위해 JenkinsBookExample 이라는 프로젝트 하나를 생성해주었다.
자바 프로젝트 생성하는 과정은 자세하게 설명하지는 않고 진행하도록 하겠다.
이렇게 Create를 통해 생성을 해주면 아래와 같은 디렉터리 구조를 확인할 수 있다.
- src/main/java : 자바 패키지의 기본 소스 코드 디렉터리
- src/test/java : 단위 테스트 케이스 파일들이 위치한 디렉터리
🥸 pom.xml 간단하게 살펴보기
POM은 프로젝트 객체 모델(Project Object Model)의 약어이며 pom.xml 파일은 모든 메이븐 프로젝트의 핵심으로 특정 프로젝트의 다양한 세부 정보를 정의하는 파일이다.
✔️ 메이븐 프로젝트 식별 정보 섹션
✔️ 메이븐 프로젝트 속성 섹션
속성 섹션에서는 JAVA 파일을 컴파일할 때 필요한 ANSI, UTF8 등 텍스트 인코딩 및 자바 버전 등의 속성을 정의한다.
✔️ 메이븐 프로젝트 의존성 섹션
의존성 섹션은 서드파티 라이브러리와 해당 라이브러리가 필요한 단계(컴파일 단계 또는 단위테스트, 애플리케이션 실행 단계 등)를 정의한다. 참고로 새로운 메이븐 프로젝트를 파면 현재시점으로 기본 테스트 라이브러리로 JUnit으로 작성되어있는데 책을 따라가기위해 testng 로 변경해주었다.
참고로 메이븐이 기본적으로 생성하는 로컬 리포지터리 경로는 ${user.home}\.m2\repository 이다.
빌드를 실행하는 단계마다 메이븐은 로컬 리포지터리에서 필요한 의존성을 사용할 수 있는지 여부를 확인하고 사용가능하다면 파일을 프로젝트의 CLASSPATH에 추가한다. 사용할 수 없다면 중앙 리포지터리에서 로컬 리포지터리로 다운로드한 후, 프로젝트의 CLASSPATH에 추가한다.
만일 로컬 리포지터리 위치를 변경하고 싶다면 .m2 경로에 settings.xml 파일을 만들어서 localRepository 태그안에 경로를 작성해준다.
✔️ 메이븐 프로젝트 빌드 섹션(너무 길어서 캡쳐불가..)
빌드 섹션에서는 단계별로 필요한 메이븐 플러그인과 애플리케이션의 전체 빌드 수명 주기를 정의한다.
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.4.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.3.1</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.3.0</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.4.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>3.1.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>3.1.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.12.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.6.1</version>
</plugin>
</plugins>
</pluginManagement>
</build>
😀빌드 수명 주기 단계와 순서
- 정리(Clean)
- maven-clean-plugin을 사용해 이전에 생성된 모든 컴파일 파일과 패키지 파일을 정리(삭제)하고, 새로운 빌드 수명주기를 실행
- 리소스 다운로드
- mvnrepository.com 같은 아티팩트 리포지터리에서 프로젝트에 필요한 모든 의존성을 다운로드
- 메이븐 플러그인도 순환 참조를 포함한 모든 프로젝트 의존성을 다운로드함
- 애플리케이션 소스 코드 컴파일
- javac(자바 컴파일)을 내부적으로 사용하는 maven-compiler-plugin을 사용해 애플리케이션 소스 코드를 컴파일한다. 컴파일러 플러그인은 기본 경로인 src/main/java 안에 모든 JAVA 파일을 찾아 컴파일 한다.
- 컴파일러 플러그인은 자바 파일을 입력으로 받아 컴파일을 수행하고 결과물 .class 파일을 생성하며 이 파일은 $(프로젝트_디렉터리)/target/classes 폴더에 저장된다.
- 단위 테스트
- mvn compile:test-compile 단계에서 src/test/java 내의 단위 테스트 코드를 컴파일하고 클래스파일을 $(프로젝트_디렉터리)/target/test-classes 폴더에 저장한다.
- maven-surefire-plugin을 사용해 JUnit 또는 TestNG 프레임워크를 실행하고 단위 테스트 케이스를 시작한다.
- 패키징
- maven-jar-plugin은 $(프로젝트_디렉터리)/target/test-classes 폴더에 생성된 .class 파일 등의 컴파일 결과 파일을 .jar 파일로 묶어 $(프로젝트_디렉터리)/target 폴더에 저장한다.
- 릴리스
- maven-install-plugin을 사용해 JAR 파일을 메이븐의 로컬 리포지터리에 설치한다.
- 만일 이 JAR 파일의 사용자가 원격지에 있다면 이 파일은 mvnrepository.com처럼 웹에서 접속할 수 있는 중앙 리포지터리로 배포되어야 한다.(deploy goal을 실행해 진행하며, 메이븐은 maven-deploy-plugin을 사용해 JAR 파일을 중앙 리포지터리로 배포해 개발자가 이를 다운로드하고 사용할 수 있도록 한다.
😁CLI에서 메이븐 사용
이제 CLI(명령행 인터페이스)를 통해 메이븐을 사용하는 방법을 실습해보자
우선 메이븐이 PC에 설치되어있어야 한다.
설치되어있지 않다면 아래의 링크를 통해 맞는 버전으로 다운로드를 하자
https://archive.apache.org/dist/maven/maven-3/
Index of /dist/maven/maven-3
archive.apache.org
나는 참고로 이전에 설치해둔 메이븐을 사용하겠다. 메이븐을 설치하여 해당 경로에서 bin 폴더에 들어가보면 mvn 명령 파일을 확인할 수 있다.
이 mvn 명령 파일의 경로를 PATH 환경 변수에 추가해야한다.
그리고 꼭 JAVA_HOME 과 JDK 위치도 환경변수로 등록해준다.
만약 환경변수가 정상적으로 세팅이 되었다면 명령 프롬프트(cmd)를 열어서 mvn -version 입력 시 아래와 같이 나타난다.
이제 cd Dos 명령을 이용하여 자바 프로젝트가 존재하는 경로로 이동해보자 (pom.xml이 존재하는 경로로 이동해야 함)
해당 경로에서 이제 mvn package 명령을 실행해보자. 이 명령어는 아래의 작업이 모두 실행된다.
- maven-resources 플러그인을 사용해 프로젝트 의존성을 다운로드
- API 소스 코드를 컴파일
- 단위 테스트 케이스 코드를 컴파일
- maven-surefire 플러그인을 사용해 단위 테스트 케이스 실행
- maven-jar 플러그인을 사용해 JAR 파일을 생성
우선 명령어를 실행하면 Scanning for projects... 부터 시작해서 의존성 라이브러리들이 다운받아지는 것을 확인할 수 있다.
그리고 모든 작업이 완료되면 Building jar 에 명시된 경로로 jar 파일이 생성되며 Build Success 가 나타난다.
이제 Target 경로로 이동해 JenkinsBookExample-1.0-SNAPSHOT.jar 파일을 실행하기 위해서
Java -jar JenkinsBookExample-1.0-SNAPSHOT.jar 명령어를 입력한다.
만일 jar를 실행할 때 아래와 같은 에러가 난다면?
이땐 pom.xml 에서 build 태그안의 pluginManagement의 maven-jar-plugin을 아래처럼 고쳐주도록 한다.
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.4.2</version>
<configuration>
<archive>
<manifest>
<mainClass>org.example.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
'개발 독서 스터디 > 젠킨스로 배우는 CIㆍCD 파이프라인 구축' 카테고리의 다른 글
젠킨스 CI/CD - 자바 API 릴리스를 관리하는 자동 실행 프리스타일 작업 생성 (3) | 2025.08.03 |
---|---|
젠킨스 CI/CD - 메이븐과 넥서스 통합 및 자바 API 릴리즈용 프리스타일 작업 생성 (3) | 2025.07.08 |
젠킨스 CI/CD - 젠킨스 작업의 이해 (1) | 2025.06.16 |
젠킨스 CI/CD - 사용자관리 (1) | 2025.06.16 |
젠킨스 CI/CD - 자격 증명 관리 (0) | 2025.05.25 |