본문 바로가기
카테고리 없음

[Gitlab] git push 한 내용을 자동으로 docker build + push 하기

by whereisco 2022. 12. 15.

전체 배포 pipeline architecture

  • CI/CD pipeline을 구축하면, 변경된 내용이 자동으로 배포된 서버에 반영하는 과정을 자동화할 수 있습니다.
  • 문제는 Build Server(ex. gitlab runner)와 실제 배포되는 서버 (ex.aws ec2)는 다를 수 있습니다. 따라서, 중간에 container Registry를 씁니다.
  • Containter Registry는 Docker Image가 저장되는 공간 입니다.
  • 개발자는 브랜치를 생성한 뒤 각자 작업을 수행하고, main 브렌치에 merge 해줍니다.
  • 이번 포스팅에선, 개발자가 main 브랜치에 merge 하여 생성된 새로운 변경사항을 Gitlab에 의해 자동적으로 docker build + push가 되도록 환경을 구축해보도록 하겠습니다.
👀 목표 : git에 변경사항을 push하면, gitlab에 의해 docker build + push의 과정을 자동화해보자.

.gitlab-ci.yml

# stage : 단계. 우리의 경우에는 build-push와 같은 형태의 하나의 단계만 존재
stages: 
  - dockerbuild-push

package:
  image: docker:latest
  stage: dockerbuild-push
  services:
    - docker:dind
  before_script:
            #docker 로그인
    - docker login registry.gitlab.com -u $GITLAB_USER -p $GITLAB_PASSWORD
  script:
    - docker build -t registry.gitlab.com/$GITLAB_USER/likelion-hospital-review .
    - docker push registry.gitlab.com/$GITLAB_USER/likelion-hospital-review
  after_script:
    - docker logout
  • script 부분을 대문자로 작성하는 것을 권장합니다.
  • 위와 같은 yml 파일을 작성함으로써, docker build 과정을 gitlab-runner(gitlab linux server)가 대신 해줍니다.

DockerFile

FROM gradle:7.4-jdk11-alpine as builder
WORKDIR /build

# 그래들 파일이 변경되었을 때만 새롭게 의존패키지 다운로드 받게함.
COPY build.gradle settings.gradle /build/
RUN gradle build -x test --parallel --continue > /dev/null 2>&1 || true

# 빌더 이미지에서 애플리케이션 빌드
COPY . /build
RUN gradle build -x test --parallel

# APP
FROM openjdk:11.0-slim
WORKDIR /app

# 빌더 이미지에서 jar 파일만 복사
COPY --from=builder /build/build/libs/*-SNAPSHOT.jar ./app.jar

EXPOSE 8080

# root 대신 nobody 권한으로 실행
USER nobody
ENTRYPOINT [                                                \
    "java",                                                 \
    "-jar",                                                 \
    "-Djava.security.egd=file:/dev/./urandom",              \
    "-

환경 변수 추가

  • settings → CI/CD로 이동해줍니다.
  • 이동한 뒤, 아래와 같이 Variable에서 GITLAB_USER, GITLAB_PASSWORD, PROJECT_NAME과 관련된 변수 값들을 추가해줍니다.
  • 이제, build 과정을 자동화 되었을 것 입니다. 우리가 변경 사항을 push 해주면, gitlab server가 자동적으로 docker build와 push를 해주는 것입니다.
  • 빌드가 성공적으로 수행되면, 깃랩에 등록한 이메일을 통해서도 성공 결과를 확인할 수 있습니다.

Container Registry에서 Docker Image 받아오기

  • 이제 배포 서버에서 container Registry에 접근해, gitlab을 통해 자동으로 push되어 올라간 image들을 받아올 수 있습니다.
  • docker pull <docker_image_url> : Container Registry에서 Docker image 받아오기
  • docker images : 받아온 이미지 확인
  • Container Registry에 저장된 도커 이미지를 배포 서버에 잘 받아온 것을 알 수 있습니다.