gitlab-ci.yml 작성

duckbill413·2023년 11월 10일
1

CICD

목록 보기
5/5
post-thumbnail

CICD 구성 하기

Spring boot project CI/CD를 docker, docker-compose, gitlab-runner을 이용해서 구성해 보겠습니다.

  • 프로젝트 구성

Gitlab Variable 설정

Gitlab yml 작성하기

spring project를 gitlab 환경에서 사용하기 위해서는 .gitlab-ci.yml파일을 작성해야 합니다.

Gitlab ignore variable 설정

  • 공개 되면 안되는 정보들을 Variables에 추가한다.

  • Key, Value를 설정하고 Type으로는 Variable을 설정

.gitlab-ci.yml 생성

프로젝트 가장 상위에 .gitlab-ci.yml파일을 생성합니다.

.gitlab-ci.yml 설정

buildpackagedeploy 단계로 파이프 라인을 구성해 보겠습니다.

1. Build Stage

  • 사용 중인 gradle 버전 확인

  • 사용 가능한 docker gradle 버전은 아래의 링크에서 확인 가능

gradle - Official Image | Docker Hub 링크

# 실행될 stage 지정 (위에서 아래로 차례대로 실행)
stages:
  - build
  - package
  - deploy

build: # JOB 이름
  # 사용될 이미지 설정
  image: gradle:8.4.0-jdk17 # gradle - java 이미지 지정
  # stage 설정
  stage: build
  # 실행될 script 설정
  script:
    - echo [INFO] YML Settings
    - cd ./src/main/resources
    - echo "$APPLICATION_YML" > "application.yml" # gitlab APPLICATION_YML을 이용하여 application.yml 파일 생성
    - echo [INFO] spring-boot project build
    - cd ../../.. # 프로젝트 폴더로 경로 이동
    - chmod +x gradlew # gradle 권한 부여
    - ./gradlew clean
    - ./gradlew bootjar
  # artifacts 설정 (bulld를 통해 생성된 파일을 job artifacts에 보관하여 다음에 수행되는 JOB에서 가져다 활용할 수 있게 도와줌)
  artifacts:
    # 보관이 이루어질 경로 설정
    paths:
      - build/libs/*.jar # Dockerfile에 지정한 경로로 지정
    # 유효기간 설정
    expire_in: 1 days
  # JOB이 수행될 branch 설정 (설정된 branch에 push가 발생될 시 JOB 수행)
  only:
    - master

2. Package Stage

# 실행될 stage 지정 (위에서 아래로 차례대로 실행)
stages:
  - build
  - package

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package:
  image: docker:latest
  stage: package
  # service 설정 (설정한 image가 작업이 이루어지는 동안 실행되는 docker 이미지)
  services:
    - docker:dind
    # script가 실행 전 수행 될 script
  before_script:
    - docker login -u $DOCKER_REGISTRY_USER -p $DOCKER_REGISTRY_PASSWORD   # GitLab Container Registry에 로그인
  # 실행될 script 설정
  script:
    - echo [INFO] Start package stage
    - echo [INFO] CI_REGISTRY_USER       $CI_REGISTRY_USER # docker hub id
    - echo [INFO] CI_REGISTRY_PASSWORD   $CI_REGISTRY_PASSWORD # docker hub password or token
    - echo [INFO] CI_REGISTRY_IMAGE      $CI_REGISTRY_IMAGE
    - echo [INFO] SPRING_IMAGE_NAME      $SPRING_IMAGE_NAME
    - echo [INFO] NGINX_IMAGE_NAME       $NGINX_IMAGE_NAME
    - echo [INFO] DOCKER_REGISTRY_USER   $DOCKER_REGISTRY_USER
    - echo [INFO] DOCKER_REGISTRY_PWD    $DOCKER_REGISTRY_PASSWORD
    - echo [INFO] Spring docker project build
    - docker build -t $DOCKER_REGISTRY_USER/$SPRING_IMAGE_NAME .   # Dockerfile로 build
    - docker push $DOCKER_REGISTRY_USER/$SPRING_IMAGE_NAME:latest   # Container Registry에 image push
    - echo [INFO] Nginx docker build
    - cd nginx # nginx .conf 위치로 이동
    - docker build -t $DOCKER_REGISTRY_USER/$NGINX_IMAGE_NAME .
    - docker push $DOCKER_REGISTRY_USER/$NGINX_IMAGE_NAME:latest
  # script가 실행된 후 수행 될 script
  after_script:
    - docker logout   # GitLab Container Registry 로그아웃
  # JOB이 수행될 branch 설정 (설정된 branch에 push가 발생될 시 JOB 수행)
  only:
    - master

3. Deploy Stage

# 실행될 stage 지정 (위에서 아래로 차례대로 실행)
stages:
  - build
  - package
	- deploy

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

deploy: # JOB 이름
  image: docker:latest
  # stage 설정
  stage: deploy
  services:
    - docker:dind
  # script가 실행 전 수행 될 script
  before_script:
    - echo [INFO] docker deploy start!
    - docker login $CI_REGISTRY -u $DOCKER_REGISTRY_USER -p $DOCKER_REGISTRY_PASSWORD   # GitLab Container Registry에 로그인
  # 실행될 script 설정
  script:
    - docker volume prune -f # 사용되지 않는 컨테이너, 이미지 삭제 및 볼륨 정리
    - docker-compose down # docker-compose 내리기
    - docker-compose pull # docker images pull
    - docker-compose build # docker-compose 빌드
    - docker-compose up -d # docker-compose 백그라운드 실행
  # script가 실행된 후 수행 될 script
  after_script:
    - docker logout   # GitLab Container Registry 로그아웃
    - echo [INFO] docker deploy end!
  # JOB이 수행될 branch 설정 (설정된 branch에 push가 발생될 시 JOB 수행)
  only:
    - master

CI/CD 작동

  • master branch에 push하게 되면 gitlab의 pipeline이 동작하게 된다.

모든 Stage가 완료되면 위와 같이 표시된다.

  • 8080 포트로 배포된 Spring Project가 Nginx를 통해 80번 포트로 정상적으로 배포된 것을 확인할 수 있다.
profile
같이 공부합시다~

0개의 댓글

관련 채용 정보