안녕하세요. J4J입니다.
이번 포스팅은 GitLab Runner + Docker + Ubuntu를 이용하여 배포할 때 JOB이 수행되는 폴더 구분하는 방법에 대해 적어보는 시간을 가져보려고 합니다.
들어가기에 앞서 다음 글을 참고하시면 좋을 것 같습니다.
폴더 구분하는 이유
위의 링크를 참고해보시면 지금까지 동일 Repository에 SpringBoot와 Next를 함께 배포하는 것을 확인해볼 수 있습니다.
여기서 확인할 수 있는 한 가지 문제점은 어떤 파일이 변경되더라도 모든 Next, SpringBoot의 자동 배포 과정이 함께 이루어진 다는 것입니다.
build부터 시작해서 test, package, deploy까지 수행되는 모든 작업들은 프로젝트 규모가 커질수록 요구되는 시간이 점점 길어지는데 이런 상황 속에서 변경이 이루어지지 않은 것까지 새롭게 배포되는 것은 리소스 낭비라고 생각됩니다.
그렇기 때문에 Next의 파일이 변경되어 push되었을 때는 Next에 관련된 것만 자동 배포가 이루어지고 SpringBoot의 파일이 변경되어 push 되었을 때는 SpringBoot에 관련된 것만 자동 배포가 되도록 수정해보려고 합니다.
GitLab CI 수정
언급한것처럼 작업이 이루어질 수 있도록 .gitlab-ci.yml 파일을 수정해보고자 합니다.
현재까지 작성되어 있던 .gitlab-ci.yml 파일의 내용은 다음과 같습니다.
# 실행될 stage 지정 (위에서 아래로 차례대로 실행)
stages:
- build
- test
- package
- deploy
fe-build: # JOB 이름
# 사용될 이미지 설정
image: node:12.18.4
# stage 설정
stage: build
# 실행될 script 설정
script:
- cd fe
- npm install
- npm run build
# artifacts 설정 (bulld를 통해 생성된 파일을 job artifacts에 보관하여 다음에 수행되는 JOB에서 가져다 활용할 수 있게 도와줌)
artifacts:
# 보관이 이루어질 경로 설정
paths:
- fe/.next
- fe/node_modules
# 유효기간 설정
expire_in: 1 days
# JOB이 수행될 branch 설정 (설정된 branch에 push가 발생될 시 JOB 수행)
only:
- master
be-build: # JOB 이름
# 사용될 이미지 설정
image: maven:3.8.4-jdk-11
# stage 설정
stage: build
# 실행될 script 설정
script:
- cd be
- mvn clean package -DskipTests
# artifacts 설정 (bulld를 통해 생성된 파일을 job artifacts에 보관하여 다음에 수행되는 JOB에서 가져다 활용할 수 있게 도와줌)
artifacts:
# 보관이 이루어질 경로 설정
paths:
- be/target/*.jar
# 유효기간 설정
expire_in: 1 days
# JOB이 수행될 branch 설정 (설정된 branch에 push가 발생될 시 JOB 수행)
only:
- master
fe-test: # JOB 이름
# 사용될 이미지 설정
image: node:12.18.4
# stage 설정
stage: test
# 실행될 script 설정
script:
- cd fe
- npm run test
# JOB이 수행될 branch 설정 (설정된 branch에 push가 발생될 시 JOB 수행)
only:
- master
be-test: # JOB 이름
# 사용될 이미지 설정
image: maven:3.8.4-jdk-11
# stage 설정
stage: test
# 실행될 script 설정
script:
- cd be
- mvn test
# JOB이 수행될 branch 설정 (설정된 branch에 push가 발생될 시 JOB 수행)
only:
- master
# 전역 변수 설정
variables:
FE_IMAGE_NAME: $CI_REGISTRY_IMAGE/fe:latest # FE 이미지 이름
BE_IMAGE_NAME: $CI_REGISTRY_IMAGE/be:latest # BE 이미지 이름
fe-package: # JOB 이름
# 사용될 이미지 설정
image: docker:latest
# stage 설정
stage: package
# service 설정 (설정한 image가 작업이 이루어지는 동안 실행되는 docker 이미지)
services:
- docker:dind
# script가 실행 전 수행 될 script
before_script:
- docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD # GitLab Container Registry에 로그인
# 실행될 script 설정
script:
- docker build -t $FE_IMAGE_NAME fe/. # fe에 있는 Dockerfile로 build
- docker push $FE_IMAGE_NAME # Container Registry에 image push
# script가 실행된 후 수행 될 script
after_script:
- docker logout # GitLab Container Registry 로그아웃
# JOB이 수행될 branch 설정 (설정된 branch에 push가 발생될 시 JOB 수행)
only:
- master
be-package: # JOB 이름
# 사용될 이미지 설정
image: docker:latest
# stage 설정
stage: package
# service 설정 (설정한 image가 작업이 이루어지는 동안 실행되는 docker 이미지)
services:
- docker:dind
# script가 실행 전 수행 될 script
before_script:
- docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD # GitLab Container Registry에 로그인
# 실행될 script 설정
script:
- docker build -t $BE_IMAGE_NAME be/. # be에 있는 Dockerfile로 build
- docker push $BE_IMAGE_NAME # Container Registry에 image push
# script가 실행된 후 수행 될 script
after_script:
- docker logout # GitLab Container Registry 로그아웃
# JOB이 수행될 branch 설정 (설정된 branch에 push가 발생될 시 JOB 수행)
only:
- master
fe-deploy: # JOB 이름
# stage 설정
stage: deploy
# tag 설정 (수행이 이루어질 GitLab-Runner tag 등록)
tags:
- dev-all
# script가 실행 전 수행 될 script
before_script:
- docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD # GitLab Container Registry에 로그인
# 실행될 script 설정
script:
- docker rm -f fe-con || true # 기존에 존재하던 Container 삭제
- docker rmi $FE_IMAGE_NAME || true # 기존에 존재하던 이미지 삭제
- docker pull $FE_IMAGE_NAME # Container Registry에서 이미지 가져오기
- docker run --name fe-con -p 8088:8088 -d $FE_IMAGE_NAME # Container 생성 및 실행
# script가 실행된 후 수행 될 script
after_script:
- docker logout # GitLab Container Registry 로그아웃
# JOB이 수행될 branch 설정 (설정된 branch에 push가 발생될 시 JOB 수행)
only:
- master
be-deploy: # JOB 이름
# stage 설정
stage: deploy
# tag 설정 (수행이 이루어질 GitLab-Runner tag 등록)
tags:
- dev-all
# script가 실행 전 수행 될 script
before_script:
- docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD # GitLab Container Registry에 로그인
# 실행될 script 설정
script:
- docker rm -f be-con || true # 기존에 존재하던 Container 삭제
- docker rmi $BE_IMAGE_NAME || true # 기존에 존재하던 이미지 삭제
- docker pull $BE_IMAGE_NAME # Container Registry에서 이미지 가져오기
- docker run --name be-con -p 8080:8080 -d $BE_IMAGE_NAME # Container 생성 및 실행
# script가 실행된 후 수행 될 script
after_script:
- docker logout # GitLab Container Registry 로그아웃
# JOB이 수행될 branch 설정 (설정된 branch에 push가 발생될 시 JOB 수행)
only:
- master
여기서 수정해야되는 부분은 각 JOB들의 only입니다.
only부분을 다음과 같이 수정해주시면 되겠습니다.
fe-build: # JOB 이름
# JOB 수행 조건 설정
only:
# JOB이 수행 될 branch 설정
refs:
- master
# JOB이 수행될 폴더 경로 설정
changes:
- fe/**/*
be-build: # JOB 이름
# JOB 수행 조건 설정
only:
# JOB이 수행 될 branch 설정
refs:
- master
# JOB이 수행될 폴더 경로 설정
changes:
- be/**/*
fe-test: # JOB 이름
# JOB 수행 조건 설정
only:
# JOB이 수행 될 branch 설정
refs:
- master
# JOB이 수행될 폴더 경로 설정
changes:
- fe/**/*
be-test: # JOB 이름
only:
# JOB이 수행 될 branch 설정
refs:
- master
# JOB이 수행될 폴더 경로 설정
changes:
- be/**/*
fe-package: # JOB 이름
# JOB 수행 조건 설정
only:
# JOB이 수행 될 branch 설정
refs:
- master
# JOB이 수행될 폴더 경로 설정
changes:
- fe/**/*
be-package: # JOB 이름
# JOB 수행 조건 설정
only:
# JOB이 수행 될 branch 설정
refs:
- master
# JOB이 수행될 폴더 경로 설정
changes:
- be/**/*
fe-deploy: # JOB 이름
# JOB 수행 조건 설정
only:
# JOB이 수행 될 branch 설정
refs:
- master
# JOB이 수행될 폴더 경로 설정
changes:
- fe/**/*
be-deploy: # JOB 이름
# JOB 수행 조건 설정
only:
# JOB이 수행 될 branch 설정
refs:
- master
# JOB이 수행될 폴더 경로 설정
changes:
- be/**/*
테스트
위와 같이 .gitlab-ci.yml 파일을 수정하고 commit, push를 하면 trigger가 생성되지 않습니다.
왜냐하면 .gitlab-ci.yml 파일은 trigger가 발생되는 조건에 해당되지 않기 때문입니다.
trigger가 생성되기 위해 fe폴더에 들어있는 파일들을 수정해주고 commit, push를 하면 다음과 같이 fe와 관련된 JOB만 수행되는 것을 확인할 수 있습니다.
또한 be폴더에 들어있는 파일을 수정하고 commit, push를 하면 다음과 같이 be와 관련된 JOB만 수행되는 것을 확인할 수 있습니다.
이상으로 GitLab Runner + Docker + Ubuntu를 이용하여 배포할 때 JOB이 수행되는 폴더 구분하는 방법에 대해 간단하게 알아보는 시간이었습니다.
읽어주셔서 감사합니다.
댓글