본문 바로가기
Devops/GitLab

[GitLab] GitLab Runner + Docker + Ubuntu 환경 구축 (5) - JOB이 수행될 폴더 구분하기

by J4J 2022. 2. 13.
300x250
반응형

안녕하세요. 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

 

 

728x90

 

 

여기서 수정해야되는 부분은 각 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만 수행되는 것을 확인할 수 있습니다.

 

fe trigger 생성

 

 

 

 

또한 be폴더에 들어있는 파일을 수정하고 commit, push를 하면 다음과 같이 be와 관련된 JOB만 수행되는 것을 확인할 수 있습니다.

 

be trigger 생성

 

 

 

 
 

 

 

 

이상으로 GitLab Runner + Docker + Ubuntu를 이용하여 배포할 때 JOB이 수행되는 폴더 구분하는 방법에 대해 간단하게 알아보는 시간이었습니다.

 

읽어주셔서 감사합니다.

 

 

 

728x90
반응형

댓글