-
Spring boot Gitlab CI/CD 구축 (2)Spring 2023. 9. 19. 22:20반응형
저번 포스팅에서는 GItlab-Runner용 IAM 계정을 생성하고, EC2 서버에 Runner를 설치 했으며, 필요한 설정까지 완료 했습니다. 이번 포스팅에서는 Gitlab Repository 설정과
Package를 설치하고 파이프라인을 구축 해보겠습니다.https://developer-been.tistory.com/37
5. Gitlab Runner 설정
Project > Settings > CI/CD > Variables 접근
앞전에 생성한 AWS IAM 계정의 정보를 Variables에 입력합니다.
입력해야 하는 정보는 아래 내용과 같습니다.
1. AWS_ACCESS_KEY_ID: iam access key
2. AWS_DEFAULT_REGION: region
3. AWS_SECRET_ACCESS_KEY: iam secret key
💡 중요
Variables description을 읽어보면, 환경 변수는 보호된 브랜치 또는 태그에만 노출하여 보호할 수 있다고 합니다.
즉, CI/CD를 연동할 브랜치를 Protected Branch로 설정 해줘야 합니다.
Project > Settings > Repository > Protected Branches에서 Protected branch로 등록합니다.
위 과정을 통해 깃랩, 러너 서버 설정은 마무리를 했고, Spring Boot에서 .gitlab-ci.yml 파일을 작성 해보겠습니다.
React나 Node 환경 변수 설정은 "더보기" 를 참고 해주시길 바랍니다.
더보기🎈 Node, Yarn 설치
nvm 설치
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash source ~/.bashrc
🎈 특정 버전 Node 설치
nvm install 16.13.1
+ ec2-user가 default 일텐데, gitlab-runner 계정으로 CI/CD를 진행중이므로 해당 계정에도 설치를 해야 합니다.
하지만 해당 유저에 bashrc가 없을 경우가 높습니다. 따라서 설정을 해줘야 합니다.
$ sudo su gitlab-runner $ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash $ source ~/.nvm/nvm.sh $ nvm install 16.13.1 $ nvm alias default v16.13.1
아래 명령어로 bashrc 파일을 생성 후 실행하여 시스템 설정 내용을 저장합니다.
$ cd ~ //home 디렉토리로 이동 $ cp /etc/skel/.bashrc ~ //.bashrc 파일 복사 $ source ~/.bashrc //.bashrc 파일 적용
💡 주의사항
.bahsrc만 있다면 '$ source ~/.bashrc' 를 매번 해주지 않는 이상은 리눅스가 부팅시 초기화 됩니다.
즉, 재부팅 할 때 마다 '$ source ~/.bashrc' 명령어를 입력 해줘야 합니다.
그래서 이를 간편하게 하기 위해서는 .bash_profile 파일이 있어야 합니다.
$ cd ~ //home 디렉토리로 이동 $ vi .bash_profile // 편집기를 열어 아래 명령어를 추가합니다. # .bash_profile if [ -f ~/.bashrc ]; then . ~/.bashrc fi
bashrc에도 아래 명령어를 추가합니다.
$ vi ~/.bashrc # .bashrc source ~/.nvm/nvm.sh nvm alias default v16.13.1
🎈 yarn 설치
curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo sudo yum install yarn source ~/.bashrc
6. CI/CD 파이프라인 설정
Spring Boot 애플리케이션을 빌드하고 배포하기 위한 GitLab CI/CD 파이프라인을 정의 해야 합니다.
프로젝트 루트 경로 하위에 해당 파일을 생성합니다. (ex - project/.gitlab-ci.yml)
아래는 파일의 주요 내용과 각 섹션에 대한 설명입니다.
.gitlab-ci.yml
stages: - build - deploy before_script: - export JAVA_HOME=/usr/lib/jvm/java-17-amazon-corretto.x86_64 - export BUCKET_NAME={S3 Bucket for Elasticbeanstalk deployment} - export MAVEN_VERSION=$(./mvnw help:evaluate -f ./web/pom.xml -Dexpression=project.version -q -DforceStdout) - export VERSION_LABEL={ProjectName}-${CI_PIPELINE_ID}-$MAVEN_VERSION - export FILE_PATH=./web/target/web-$MAVEN_VERSION.jar - export JAVA_HOME=/usr/lib/jvm/java-17-amazon-corretto.x86_64 # develop build build-develop: stage: build script: - ./mvnw clean package - aws s3 cp $FILE_PATH s3://$BUCKET_NAME/distributions/develop/$VERSION_LABEL.jar --quiet only: - develop tags: - {Your Gitlab Runner Tags} # develop deploy deploy-develop: stage: deploy script: - export APPLICATION_NAME={Your elasticbeanstalk application name} - export ENV_NAME={Your elasticbeanstalk environment name} - aws elasticbeanstalk create-application-version --application-name $APPLICATION_NAME --version-label $VERSION_LABEL --source-bundle S3Bucket=$BUCKET_NAME,S3Key=distributions/develop/$VERSION_LABEL.jar - aws elasticbeanstalk update-environment --application-name $APPLICATION_NAME --environment-name $ENV_NAME --version-label $VERSION_LABEL only: - develop tags: - {Your Gitlab Runner Tags} # stage build build-stage: stage: build script: - ./mvnw clean package - aws s3 cp $FILE_PATH s3://$BUCKET_NAME/distributions/stage/$VERSION_LABEL.jar --quiet only: - stage tags: - {Your Gitlab Runner Tags} # stage deploy deploy-stage: stage: deploy script: - export APPLICATION_NAME={Your elasticbeanstalk application name} - export ENV_NAME={Your elasticbeanstalk environment name} - aws elasticbeanstalk create-application-version --application-name $APPLICATION_NAME --version-label $VERSION_LABEL --source-bundle S3Bucket=$BUCKET_NAME,S3Key=distributions/stage/$VERSION_LABEL.jar - aws elasticbeanstalk update-environment --application-name $APPLICATION_NAME --environment-name $ENV_NAME --version-label $VERSION_LABEL only: - stage tags: - {Your Gitlab Runner Tags}
각 섹션에 대한 설명입니다.
- stages 섹션:
- stages 섹션은 파이프라인의 실행 단계를 정의합니다. 포스팅에선 build와 deploy 두 개의 단계로 정의 했습니다.
- before_script 섹션:
- before_script 섹션은 모든 작업 스크립트 실행 전에 실행되는 명령어를 정의합니다.
이 섹션에서는 환경 변수와 필요한 값을 설정합니다. - 주요 설정:
- JAVA_HOME: 환경 변수 설정
- BUCKET_NAME: Elastic Beanstalk 배포에 사용할 S3 버킷 이름 설정
- MAVEN_VERSION: Maven을 사용하여 프로젝트 버전을 검색하고 설정
- VERSION_LABEL: Elastic Beanstalk 버전 레이블을 정의하는 변수 설정
- FILE_PATH: 애플리케이션 JAR 파일 경로 설정
- before_script 섹션은 모든 작업 스크립트 실행 전에 실행되는 명령어를 정의합니다.
- build-develop 섹션:
- build-develop 섹션은 build 단계에서 실행되며, develop 브랜치에서만 실행됩니다.
- 스크립트는 Maven을 사용하여 프로젝트를 빌드하고, 빌드된 JAR 파일을 S3 버킷에 업로드합니다.
- deploy-develop 섹션:
- deploy-develop 섹션은 deploy 단계에서 실행되며, develop 브랜치에서만 실행됩니다.
- Elastic Beanstalk 애플리케이션 버전을 생성하고 해당 버전을 환경에 배포하는 스크립트가 포함되어 있습니다.
- build-stage 섹션:
- build-stage 섹션은 build 단계에서 실행되며, stage 브랜치에서만 실행됩니다.
- build-develop 섹션과 유사하게 프로젝트를 빌드하고 JAR 파일을 S3 버킷에 업로드합니다.
- deploy-stage 섹션:
- deploy-stage 섹션은 deploy 단계에서 실행되며, stage 브랜치에서만 실행됩니다.
- Elastic Beanstalk 애플리케이션 버전을 생성하고 해당 버전을 환경에 배포하는 스크립트가 포함되어 있습니다.
- tags의 tag는 gitlab-runner 를 CLI에서 등록할 때 설정 했던 Tag 값입니다. 해당 값은 어떤 runner를 사용할지
선택하는 용도입니다.
즉, CI/CD는 아래 단계를 수행하게 됩니다.
1. .gitlab-ci.yml 파일에서 설정한 only field의 branch에서 Gitlab 원격 저장소로 Push 이벤트 발생2. GitLab CI/CD 파이프라인이 자동으로 시작되며 .gitlab-ci.yml 파일에 정의된 설정을 기반으로 파이프라인 생성
3. stages에 설정한 단계대로 실행
4. before_script가 실행 되면서 환경 변수 설정
5. build 단계에서는 프로젝트를 빌드 후, AWS S3에 빌드 파일 업로드
6. deploy 단계에서는 S3에 업로드 한 빌드 파일로 Elasticbeanstalk의 Application Version을 생성하고, 이를 환경에 배포
실제로 git push를 한 뒤, Gitlab Project > CI/CD > Pipeline에서 확인해보면 정상적으로 동작하는 것을 확인할 수 있습니다.
이번 포스팅에서는 AWS EC2에 Gitlab Runner를 설치하고, Spring Boot에서 CI/CD를 구축하여
Elasticbeanstalk에 배포하는 방법까지 진행 했습니다.반응형'Spring' 카테고리의 다른 글
[Aws + Spring] Spring Boot + Aws Glue + S3를 활용한 방문자 통계 구축 (1) (0) 2024.01.02 [Spring] Spring Boot에서 아임포트 다날 본인인증 연동(Rest Api) (0) 2023.09.21 Spring boot Gitlab CI/CD 구축 (1) (0) 2023.09.10 [AWS + Spring] Spring Boot에서 S3와 CloudFront를 이용한 파일 업로드 (2) (0) 2023.09.03 [AWS + Spring] Spring Boot에서 S3와 CloudFront를 이용한 파일 업로드 (1) (0) 2023.08.05 - stages 섹션: