Gitlab 파이프라인 설정하기

배지원·2022년 12월 21일
0

CI/CD

목록 보기
2/2

1. 정의

Docker처럼 Code를 수정하거나 추가할때마다 해당 Git Repository를 pull받아 새로운 image를 생성하고 image를 실행하는 방식과 같이 필수지만 반복되는 작업들을 CI/CD 파이프라인을 만들어 자동화 할 수 있다.

원래 리눅스에서 작업할때 Docker 과정

(1) sudo su -
(2) ll
(3) cd FinalProject_BaeJiWon
(4) git pull
(5) docker build -t springboot-finalproject
(6) docker images
(7) docker stop <기존 container_id>
(8) docker run -p 8080:8080 -e SPRING_DATASOURCE_URL=jdbc:mysql://<클라우드 인스턴스 주소>:3306/<db스키마> -e SPRING_DATASOURCE_PASSWORD=<db비밀번호> springboot-finalproject


(1) 관리자 권한 변경
(2) 현재 파일 리스트 출력
(3) 코드 Repository가 저장된 파일로 이동
(4) 새로 바뀐 코드를 받아 최신화
(5) 도커 이미지 생성
(6) 도커 이미지 생성되었는지 이미지 리스트 출력
(7) 기존에 사용하던 도커 컨테이너 중지
(8) 5번에서 생성한 이미지를 컨테이너로 동작시킴

  • 위의 과정은 코드에 이벤트가 발생할때마다 실행해야하는 과정으로 매번하기에 번거러움이 있어서 CI/CD로 파이프라인을 구축하여 gitlab-runner를 통해 자동화 할 수 있다.

  • 하지만 Build Server(ex. gitlab runner)와 실제 배포되는 서버(ex. aws ec2)는 다를 수가 있다. 따라서 중간에 Container Registry를 사용하여 gitlab-runner는 Docker Image를 만들어 Container Registry에 저장하고 리눅스 EC2환경에서 해당 Docker Image를 호출하여 사용할 수 있다.


2. 실습

(1) Docker File 추가

  • 자동화를 하는 것이 Docker의 과정이므로 현재 프로젝트 Repository에는 Dockerfile이 존재해야 한다

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",              \
    "-Dsun.net.inetaddr.ttl=0",                             \
    "app.jar"              \
]

(2) .gitlab-ci.yml 파일 생성

  • CI/CD 메뉴에서 Editor를 눌러 .gitlab-ci.yml 파일을 생성할 수 있다.
  • .gitlab-ci.yml 파일 안에는 코드에 이벤트가 발생했을때 자동으로 동작하는 기능들을 넣어 놓는 곳이다.

.gitlab-ci.yml : Docker build에서 gradle build을 안하는 경우

stages:
  - build
  - dockerbuild-push

build:
  image: openjdk:11.0-slim
  stage: build
  script:
    - ./gradlew clean
    - ./gradlew build -x test
  before_script:
    - chmod +x gradlew
  artifacts:
    paths:
      - build/libs/*.jar
    expire_in: 8 min

package:
  image: docker:latest
  stage: dockerbuild-push
  services:
    - docker:dind
  before_script:
    - docker login registry.gitlab.com -u $GITLAB_USER -p $GITLAB_PW
  script:
    - docker build -t registry.gitlab.com/$GITLAB_USER/<project-name> .
    - docker push registry.gitlab.com/$GITLAB_USER/<project-name>
  after_script:
    - docker logout

.gitlab-ci.yml : Docker build를 gitlab-runner가 하는 경우

stages:
  - dockerbuild-push

package:
  image: docker:latest
  stage: dockerbuild-push
  services:
    - docker:dind
  before_script:
    - docker login registry.gitlab.com -u $GITLAB_USER -p $GITLAB_PASSWORD
  script:
    - docker build -t registry.gitlab.com/$GITLAB_USER/$PROJECT_NAME . 
    - docker push registry.gitlab.com/$GITLAB_USER/$PROJECT_NAME
  after_script:
    - docker logout

(3) 환경변수 설정

  • .gitlab-ci.yml파일에 들어있는 변수들($GITLAB_USER, $GITLAB_PASSWORD, $PROJECT_NAME)의 값을 정의해야한다.

  • Settings -> CI/CD으로 이동하고

  • Variables에 Collapse버튼을 누르고 Add Variable을 통해 해당 변수들의 값을 넣어준다.
    (1) $GITLAB_USER : Gitlab의 유저 아이디(@로 시작하는)
    (2) $GITLAB_PASSWORD : Gitlab의 비밀번호
    (3) $PROJECT_NAME : 현재 작업하고 있는 프로젝트 이름

    - $PROJECT_NAME의 값은 위의 사진처럼 프로젝트의 이름과 Path의 이름이 모두 같아야함 만약 두개중 한개라도 다르면 오류가 발생함

    프로젝트 이름, Path이름 변경하기


    (1) Settings -> General로 이동
    (2) Project name 변경
    (3) Advanced -> Change path에서 path주소 변경


(4) 파이프라인 실행

  • GitLab > CI/CD > Pipeline 에서 Run pipeline 클릭
    아래와 같이 성공 유무 확인 가능

(5) Container Registry 확인

  • 파이프라인을 통해 생성된 Docker Image가 저장되어 있는 Container Registry를 확인한다.
  • Packages and registries -> Container Registry로 이동하면 아래와 같이 이미지가 저장되어있는 것을 확인할 수 있다.
  • 해당 이미지를 도커 EC2서버로 옮길려면 EC2서버에 접속중인 리눅스에서 아래의 명령어를 작성하면 된다.
    docker pull <docker_image_url>
  • docker_image_url은 파이프라인의 동작로그에서 확인이 가능하고 또는

    위의 그림에서 Push an image의 명령어를 복사하고 push부분만 pull로 바꾸면 된다.
    docker pull registry.gitlab.com/<$GITLAB_USER 부분>/<$PROJECT_NAME 부분>
profile
Web Developer

0개의 댓글