ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring boot Gitlab CI/CD 구축 (1)
    Spring 2023. 9. 10. 19:14
    반응형

     

    개발 프로세스에서 CI/CD(Continuous Integration/Continuous Deployment)는 
    애플리케이션 개발과 배포의 효율성을 높이고 소프트웨어 개발 수명 주기를 단축하는
     중요한 구성 요소입니다. 이 포스팅에서는 
    AWS EC2 인스턴스에 GitLab Runner를 설치하여 GitLab CI/CD 파이프라인을 
    구축하고, Spring Boot에서 CI/CD 프로세스를 구현하는 방법을 알아보겠습니다.

     

    💡 CI/CD(Continuous Integration/Continuous Deployment)란?

    CI/CD는 개발자 및 개발 팀이 소프트웨어를 더 신속하게 개발하고 배포할 수 있도록 도와주는 소프트웨어 개발 및 배포 프로세스의 조합입니다. 이를 통해 코드 변경사항이 자동으로 통합되고 테스트되며, 변경사항이 안전하게 타겟 환경으로 배포될 수 있게 됩니다.


    💡 목차

    1.  AWS IAM 계정 설정

    2. EC2 Key-Pair 생성

    3. EC2 인스턴스 생성

    4. EC2에 GitLab Runner 설치

    5. GitLab Runner 등록

    6. CI/CD 파이프라인 설정

    7. 문제 해결과 고급 구성 옵션

     

    💡  AWS EC2 환경

    • OS : Amazon Linux 2023 AMI - 64 bit(x86)
    • Instance Type : t2.medium
    • Storage: 8GB 

     

    💡 개발 환경

    • Intellij Ultimate
    • JAVA 17
    • Spring Boot 2.7.3
    • Maven

    📌 시작하기

    1. CI/CD용 AWS IAM 계정 생성

    CI/CD 파이프라인을 위한 AWS IAM(Identity and Access Management) 계정을 생성하고 필요한 권한을 부여해야 합니다. 이 계정은 GitLab Runner EC2 인스턴스에서 AWS 서비스에 접근하기 위해 사용됩니다. 아래는 계정을 생성하고 권한을 할당하는 단계입니다.

     

    - 이름을 설정합니다.

    - 직접 콘솔을 접속할 일은 없기에 [AWS Management Console에 대한 사용자 액세스 권한 제공]은 체크하지 않았습니다.

     

     

     

    권한 설정 화면에서 '직접 정책 연결'을 통하여 위 4가지 권한을 부여 했습니다.

    해당 포스팅에서는 추후 배포 파일을 S3에 업로드하고 ElasticBeanstalk에 배포할 예정이기 때문에 EB AdministratorAccess, S3 권한을 추가했으며, Gitlab runner EC2 Server에 접근하기 위해 EC2 FullAccess 권한을 추가 했습니다.

    CloudFrontAccess는 선택에 따라 추가 해주시면 됩니다. (보통 FrontEnd Build 파일을 배포할 때 사용합니다.)

    해당 정책을 추가 한 뒤, [사용자 생성] 을 클릭하여 IAM 계정 생성을 완료합니다.

    + 사용자 생성을 완료한 후, accessKey, secretKey를 반드시 저장하셔야 합니다.

     

     

     

    2. EC2 Key-Pair 생성

    EC2 > 키 페어 메뉴에서, 키 페어를 미리 생성합니다. 해당 키 페어는 Gitlab Runner EC2 Server를 생성할 때 사용합니다.

     

     

     

    3. Gitlab Runner Server 용도의 AWS EC2 생성

     

    OS는 Amazon Linux 2023 AMI - 64 bit(x86) 를 선택합니다.

     

     

    인스턴스 유형은 t2.medium 으로 선택 했습니다. 프로젝트 환경에 맞춰서 인스턴스 유형을 선택해주시면 됩니다.

    해당 EC2를 SSH로 접속하기 위해서 위에서 생성한 키 페어를 선택해줍니다. 

     

     

    보안 그룹을 새로 생성하며 SSH 트래픽 허용을 체크해줍니다.

     

     

     

    💡스팟 인스턴스란 ?

    온디맨드 인스턴스는 고정된 가격을 가지고 있으며, 시간당 또는 초당 사용한 리소스에 대해 비용이 청구됩니다.

    하지만 스팟 인스턴스는 경매 형태의 가격 모델을 사용합니다. 사용자는 특정 가격을 지정하고, 해당 가격이 현재 스팟 시장 가격보다 낮으면 인스턴스가 시작됩니다. 시장 가격이 사용자가 설정한 가격을 초과하면 인스턴스가 종료됩니다.

    즉, 사용중일 때만 요금이 나가는 인스턴스라고 보시면 됩니다.


    * 주의 : 스팟 인스턴스는 위에서 설명한 기준을 초과하면 인스턴스가 종료될 수도 있으니,

    스냅샷을 찍어놓거나 하는 백업 방안이 필요합니다.

     

     

    스토리지는 기본 8GIB로 설정 합니다. 프로젝트 환경에 맞춰서 크기를 늘리시면 됩니다.

    해당 포스팅에선 CI/CD 를 사용할때만 서버를 사용하기 때문에 비용 절감을 위해서

    스팟 인스턴스로 생성 하기 위해 [스팟 인스턴스 요청]을 체크합니다.

    * 온디맨드 인스턴스를 사용하려면 해당 옵션을 체크 하지 않으셔도 됩니다.

     

    해당 설정까지 마무리 한 뒤, EC2 인스턴스 생성을 완료 합니다.


    4. EC2에 GitLab Runner 설치

     

    🎈 EC2 접속

    터미널에서 key-pair를 이용하여 생성한 EC2에 ssh로 접속 합니다.

    • ssh -i "ci-test-pem.pem" ec2-user@{Your ec2-address}.ap-northeast-2.compute.amazonaws.com

     

    🎈 Gitlab-runner 설치

    본 포스팅에선 Amazon Linux 2023 AMI EC2 환경에서 공식 문서에 나와 있는 아래 명령어로 gitlab-runner를 설치하려고 했으나,

    OS 버전이 맞지 않는 이슈가 발생 했습니다.

    curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash

     

     

    Amazon Linux 2023 AMI x86_64 HVM kernel-6.1 이슈

    그렇기 때문에 직접 rpm을 download 하여 gitlab runner를 설치 해보겠습니다.

     

     

    rpm file을 설치합니다.

    $sudo curl -LJO "https://gitlab-runner-downloads.s3.amazonaws.com/latest/rpm/gitlab-runner_amd64.rpm"

     

     

    git을 설치합니다.

    $sudo yum install git

     

     

    download 받은 gitlab-runner rpm 파일을 i 옵션을 사용하여 설치합니다.

    $sudo rpm -i gitlab-runner_amd64.rpm

     

     

    설치를 완료하고, gitlab-runner server를 기동합니다.

    $sudo systemctl start gitlab-runner

     

     

    재부팅시에도 runner 서버를 유지할 수 있게 enable 해줍니다.

    $sudo systemctl enable gitlab-runner

     

     

    🎈 Runner Register

     

    gitlab-runner를 등록하기 위해 register 명령어를 입력합니다.

    $sudo gitlab-runner register

     

     

    register 명령어를 입력하면 아래의 shell이 노출 됩니다. 각 옵션에 각각의 값을 입력합니다.

     

    Enter the GitLab instance URL (for example, [https://gitlab.com/](https://gitlab.com/)):
    // Gitlab CI/CD Page에 있는 Set up a specific Runner manually Url 입력
    Enter the registration token:
    // Gitlab CI/CD Page에 있는 Set up a specific Runner manually Token 입력
    Enter a description for the runner:
    // test-runner
    Enter tags for the runner (comma-separated):
    // test-runner
    Enter optional maintenance note for the runner:
    // test-runner
    WARNING: Support for registration tokens and runner parameters in the 'register' command has been deprecated in GitLab Runner 15.6 and will be replaced with support for authentication tokens. For more information, see [https://gitlab.com/gitlab-org/gitlab/-/issues/380872](https://gitlab.com/gitlab-org/gitlab/-/issues/380872)
    Registering runner... succeeded                     runner=2s74Ast-
    Enter an executor: docker, docker-windows, parallels, ssh, custom, shell, virtualbox, docker-autoscaler, docker+machine, docker-ssh+machine, instance, kubernetes, docker-ssh:
    // shell
    Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
    
    Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml"

     

    Instance URL : Gitlab CI/CD Page에 있는 Set up a specific Runner Manually Url을 입력합니다.

    Registration Token: Gitlab CI/CD Page에 있는 Set up a specific Runner Manually Token을 입력합니다.

    Tags For the Runner: ci/cd script에서 태그로 사용할 러너를 지정합니다. 구분이 용이한 유니크한 값을 입력합니다.

    Executor: Docker Executor를 사용하지 않고 Shell Executor을 사용했습니다. 두 가지 방법엔 각각의 장,단점이 존재합니다.

    해당 포스팅에선 간단한 작업을 위해 Shell Executor을 선택 했습니다.

     

    * Instance Url, Token 정보

    Project Repository > Settings > CI/CD > Runners 페이지

     

     

    🎈 권한 설정

    - 슈퍼유저로 전환한 뒤, /home/gitlab-runner 하위 디렉토리 및 파일을 포함한 경로에 대해

    [소유자는 읽기, 쓰기, 실행 가능, 그룹 및 기타 사용자는 읽기 및 실행 가능] 권한을 부여 합니다.

    $sudo su
    $chmod 755 -R /home/gitlab-runner/

     

     

    🎈 Java 설치 

    - 해당 포스팅은 java 17 corretto를 사용하기 때문에 같은 버전으로 Java를 설치합니다.

    $sudo yum install java-17-amazon-corretto

     

    - Java의 환경변수를 설정한 뒤, 적용합니다.

    $export JAVA_HOME=/usr/lib/jvm/java-17-amazon-corretto.x86_64
    $source ~/.bashrc

     

     

    🎈 Log 설정

    default Log Max Size는 4MB여서 간혹 로그 용량 초과 message가 출력될 수 있기 때문에 로그 Max size를 재설정 합니다.

    아래는 Max Size 초과시 발생하는 error message 입니다.

    Ex) Job's log exceeded limit of 4194304 bytes. Job execution will continue but no more output will be collected.

     

    config.toml의 편집기를 엽니다.

    $sudo vi /etc/gitlab-runner/config.toml

     

     

    concurrent = 1
    check_interval = 0
    shutdown_timeout = 0
    
    [session_server]
      session_timeout = 1800
    
    [[runners]]
      name = {Your Runner Name}
      url = "https://Your Url/"
      id = 70
      token = "Your token"
      token_obtained_at = 2023-05-02T01:10:32Z
      token_expires_at = 0001-01-01T00:00:00Z
      executor = "shell"
      output_limit = 10485760
      limit = 5
      [runners.cache]
        MaxUploadedArchiveSize = 0

    Log Max Size를 나타내는 output_limit을 10MB로 설정합니다.

    limit 옵션은 Runner가 다음 빌드를 실행할 때, 가장 오래된 로그 파일을 자동으로 삭제 하며 로그 파일을 일정한 크기로 유지하면서 용량 문제를 해결해줍니다. 해당 포스팅에선 최신 5개만 유지하기 위해서 [limit = 5] 옵션을 입력 했습니다.

     

     

     

    cofing 파일 편집을 마치고, 아래 명령어를 입력하여 runner를 재실행 합니다.

    $sudo systemctl restart gitlab-runner

     

     

     

     

    🎈 aws cli 설치

    - aws 명령어를 사용하기 위해 aws-cli package를 설치합니다.

    $sudo yum install awscli

     

     

    여기까지 설정이 끝나셨다면, 기본적인 러너 서버 설정은 마무리를 한 것입니다.
    다음 포스팅에서 Gitlab Repository에서 Runner 관련 설정, Package 설치 등,
    이어서 작성 해보겠습니다.

    https://developer-been.tistory.com/40

     

    Spring boot Gitlab CI/CD 구축 (2)

    저번 포스팅에서는 GItlab-Runner용 IAM 계정을 생성하고, EC2 서버에 Runner를 설치 했으며, 필요한 설정까지 완료 했습니다. 이번 포스팅에서는 Gitlab Repository 설정과 Package를 설치하고 파이프라인을

    developer-been.tistory.com

     

     

    반응형

    댓글

Designed by Tistory.