Spring Boot App Build With Gradle Using Jenkins In AWS EC2

지난글 Install Jenkins In AWS EC2 에서 EC2 를 생성하고 Jenkins 를 설치하는 것을 정리해보았다.
이번에는 설치한 Jenkins 를 이용해서 Spring Boot App 을 Build 하고 S3 에서 jar 를 관리하는 것을 정리해보겠다.

먼저, Spring Boot 프로젝트는 Git Repository 가 있다는 전제하에 진행하겠다.
필자의 경우 최근에 공부한 spring-security 프로젝트를 build 해 볼 예정이다.
그리고 Build Tool 은 Gradle 을 이용할 것이다.
또한, S3 에 build 한 jar 를 올릴거니까, S3 가 있어야 되며, EC2 안에서 AWS CLI 를 이용할 것이다.
Jenkins 로 Build 하려면 Jenkins 에게 권한을 줘야한다.

따라서, 정리하자면 아래의 순서대로 진행하겠다.

  1. Generate S3 for jar
  2. EC2 에 S3 FullAccess Role 부여
  3. Install Git
  4. Install Gradle
  5. Grant SU to Jenkins
  6. Jenkins JAVA_HOME, GRADLE_HOME, GIT PATH 설정
  7. Build Script 작성
먼저, jar 용 S3 를 aws console 을 이용해서 만든다.

Bucket 이름은 자유롭게 알아서 해준다. 나의 경우 spring-boot-app-jars 라는 이름을 정했고, region 은 서울로 했다.

여기서 중요한 포인트는 버전 관리를 하는 것이다. 동일한 이름으로 jar 를 S3에 저장할 것이다. 따라서 S3 에 jar Object 를 올릴 때 마다 S3가 해당 jar 파일의 버전을 관리해 줄것이다.

필자는 해당 S3에 대한 모든 퍼블릭 액세스를 허용했다. 아래의 이미지에서도 보이겠지만, 경고 메세지를 띄워주고 체크해줘야 한다. 실제 운영에서는 ACL 이나 Bucket Policy 를 통해서 접근제한을 해야한다.

자 이제 S3 Bucket 생성이 끝났다.
다음은, Jenkins 가 설치된 EC2 가 S3 에 jar 를 올릴 수 있도록, Role 을 부여한다.
IAM 에 들어가서 역할을 만든다.


EC2 를 선택하고
아래와 같이 AmazonS3FullAccess 역할을 선택한다.
그리고 역할 이름은 임의로 설정한다.
그리고 EC2 로 돌아와서 Jenkins 가 설치된 인스턴스에 IAM 역할 연결/바꾸기를 한다.

방금 생성한 jenkins-s3-full-access 역할을 해당 EC2 인스턴스에 부여한다.

그렇다면, 지난번에 Jenkins 를 설치한 EC2 에 SSH 접속을 한다.

이제 Git 을 설치해보자.
sudo yum install git -y 
설치가 완료되면, git --version 을 통해서 version 을 확인해본다.

다음은, Gradle 을 설치하자.

cd ~
sudo mkdir /opt/gradle
cd /opt/gradle 



sudo wget https://services.gradle.org/distributions/gradle-6.4.1-bin.zip 

sudo unzip -d /opt/gradle gradle-6.4.1-bin.zip 

PATH=$PATH:/opt/gradle/gradle-6.4.1/bin
gradle --version
Gradle 설치도 끝이났다. 그렇다면 다음에는 Jenkins 에게 SU 권한을 줘야한다. 왜냐면 Build 를 하는 과정에서 Jenkins 가 mkdir 등의 명령어를 수행할 수 있는 권한이 필요하다.

sudo su - 를 통해서 ec2-user -> root 로 변경된 것을 확인할 수 있다.
visudo 명령어를 통해서 vi editor 를 통해 su 의 권한을 설정합니다.
jenkins ALL=(ALL) NOPASSWD: ALL 을 마지막에 입력해주고, 저장하고 종료합니다.
이제 기본적인 설정은 끝났고, Jenkins 를 시작하자.

JAVA_HOME, GRADLE_HOME, GIT_PATH 을 설정해서, Jenkins 에서 명령어를 사용할 수 있도록 하자.
Jenkins 에 어드민 계정으로 로그인하고 Jenkins 관리로 들어간다.


그리고 Global Tool Configuration 으로 들어간다.

이제 앞서 설치했었던, JDK, Gradle, Git path 설정을 해준다.

이제 드디어 모든 준비가 되었고, Build Script 를 작성해보자.
새로운 Item 을 선택한다.

Freestyle project 를 선택하고 item name 은 알아서 작성해주면 된다. Spring-Boot-App-Gradle-Build 라는 이름을 지어주었다.

소스 코드 관리 section 에서 Git 을 선택하고 Repository URL Build 하려는 Repository URL 을 넣어준다.
나의 경우 https://github.com/ndgndg91/security 을 build 할 것이다.

Credential 은 Add 를 통해 새롭게 만들어준다. Username 과 Password 그리고 ID 를 Git 계정과 바르게 입력해주고 Add 를 통해 생성하고 지정해준다.

그리고 Build section 에서 Execute shell 을 선택하고, 이제 script 를 작성한다.

아래와 같이 script 를 작성했다.

echo "spring-boot-app build start"
export PATH=$PATH:/opt/gradle/gradle-6.4.1/bin
gradle build --daemon
aws s3 cp /var/lib/jenkins/workspace/Spring-Boot-App-Gradle-Build/build/libs/*.jar s3://spring-boot-app-jars/security/spring-boot-app.jar
aws s3api list-object-versions --bucket spring-boot-app-jars --prefix security/spring-boot-app.jar
echo "spring-boot-app build end"

gradle 명령어를 사용할 수 있도록 export 문을 작성했고,
gradle build 명령문을 통해서 jar 를 생성한다.
생성된 jar 를 aws cli 를 이용해서 s3 에 올린다.
방금 올린 jar 에 관련된 version 정보를 출력하고 종료한다.


이제 생성한 프로젝트를 Build 를 하고 성공을 했다. log 를 확인하며 아래와 같이 확인이가능하다.


그리고 S3 에도 정상적으로 올라간 것이 확인이 된다.


이번 글은 여기까지이다.
다음은 Jenkins 를 이용해서 Spring Boot App 을 AWS Elastic Beanstalk 에 Blue/Green Deploy 를 정리해보겠다.

댓글

이 블로그의 인기 게시물

About JVM Warm up

About idempotent

About Kafka Basic

About ZGC

sneak peek jitpack

Spring Boot Actuator readiness, liveness probes on k8s

About Websocket minimize data size and data transfer cost on cloud

About G1 GC

대학생 코딩 과제 대행 java, python, oracle 네 번째