ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

     

    Spring boot Gitlab CI/CD 구축 (1)

    개발 프로세스에서 CI/CD(Continuous Integration/Continuous Deployment)는 애플리케이션 개발과 배포의 효율성을 높이고 소프트웨어 개발 수명 주기를 단축하는 중요한 구성 요소입니다. 이 포스팅에서는 AWS

    developer-been.tistory.com

     

     

     

    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 파일을 작성 해보겠습니다.

    ReactNode 환경 변수 설정은 "더보기" 를 참고 해주시길 바랍니다.

     

    더보기

    🎈 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}

     

     

    각 섹션에 대한 설명입니다.

    1. stages 섹션:
      • stages 섹션은 파이프라인의 실행 단계를 정의합니다. 포스팅에선 build와 deploy 두 개의 단계로 정의 했습니다.
    2. before_script 섹션:
      • before_script 섹션은 모든 작업 스크립트 실행 전에 실행되는 명령어를 정의합니다.
        이 섹션에서는 환경 변수와 필요한 값을 설정합니다.
      • 주요 설정:
        • JAVA_HOME: 환경 변수 설정
        • BUCKET_NAME: Elastic Beanstalk 배포에 사용할 S3 버킷 이름 설정
        • MAVEN_VERSION: Maven을 사용하여 프로젝트 버전을 검색하고 설정
        • VERSION_LABEL: Elastic Beanstalk 버전 레이블을 정의하는 변수 설정
        • FILE_PATH: 애플리케이션 JAR 파일 경로 설정
    3. build-develop 섹션:
      • build-develop 섹션은 build 단계에서 실행되며, develop 브랜치에서만 실행됩니다.
      • 스크립트는 Maven을 사용하여 프로젝트를 빌드하고, 빌드된 JAR 파일을 S3 버킷에 업로드합니다.
    4. deploy-develop 섹션:
      • deploy-develop 섹션은 deploy 단계에서 실행되며, develop 브랜치에서만 실행됩니다.
      • Elastic Beanstalk 애플리케이션 버전을 생성하고 해당 버전을 환경에 배포하는 스크립트가 포함되어 있습니다.
    5. build-stage 섹션:
      • build-stage 섹션은 build 단계에서 실행되며, stage 브랜치에서만 실행됩니다.
      • build-develop 섹션과 유사하게 프로젝트를 빌드하고 JAR 파일을 S3 버킷에 업로드합니다.
    6. deploy-stage 섹션:
      • deploy-stage 섹션은 deploy 단계에서 실행되며, stage 브랜치에서만 실행됩니다.
      • Elastic Beanstalk 애플리케이션 버전을 생성하고 해당 버전을 환경에 배포하는 스크립트가 포함되어 있습니다.
    7.  tags의 tag는 gitlab-runner 를 CLI에서 등록할 때 설정 했던 Tag 값입니다. 해당 값은 어떤 runner를 사용할지
       선택하는 용도입니다.

     

    즉, CI/CD는 아래 단계를 수행하게 됩니다.


    1. .gitlab-ci.yml 파일에서 설정한 only fieldbranch에서 Gitlab 원격 저장소로 Push 이벤트 발생

    2. GitLab CI/CD 파이프라인이 자동으로 시작되며 .gitlab-ci.yml 파일에 정의된 설정을 기반으로 파이프라인 생성

    3. stages에 설정한 단계대로 실행

    4. before_script가 실행 되면서 환경 변수 설정

    5. build 단계에서는 프로젝트를 빌드 후, AWS S3에 빌드 파일 업로드

    6. deploy 단계에서는 S3에 업로드 한 빌드 파일ElasticbeanstalkApplication Version을 생성하고, 이를 환경배포

     

    실제로 git push를 한 뒤, Gitlab Project > CI/CD > Pipeline에서 확인해보면 정상적으로 동작하는 것을 확인할 수 있습니다.

     

     

    이번 포스팅에서는 AWS EC2에 Gitlab Runner를 설치하고, Spring Boot에서 CI/CD를 구축하여
    Elasticbeanstalk에 배포하는 방법까지 진행 했습니다.

    반응형

    댓글

Designed by Tistory.