[CI/CD] GitLab을 이용한 CI/CD PipeLine 구축_활용(2 of 2)

Kyunghwan Ko·2022년 12월 21일
0

CI/CD

목록 보기
2/2
post-thumbnail

CI/CD Pipeline 구축 10 단계

0. 에러를 피하기 위한 설정

사용자이름과 프로젝트명을 영어 소문자로 시작하도록 설정해야 추후 진행하는 단계에서 에러가 발생하지 않을 것입니다.

1. GitHub에 Dockerfile 추가 (DockerFile 아닙니다!!, f 소문자 지켜주세요!)

본인이 프로젝트에 사용한 jdk 버전에 맞게 부분 수정해주시면 됩니다.
저는 17버전을 사용했기에 아래와 같이 작성했습니다.(다른 버전이신 분들은 아래 사이트 참고해서 gradle 버전 설정해주시기 바랍니다!)
jdk버전에 따른 gradle 버전 정보

# Dockerfile

FROM gradle:7.3.1-jdk17-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:17.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에서 GitHub 프로젝트 import

우측 상단에 New Project/repository 버튼 누르시고 Project import 하시면 됩니다

이후 Import Project를 클릭해서 GitHub에서 연동할 프로젝트를 선택 후 import 합니다

3. CI 스크립트 작성

GitLab -> 좌측 탭(CI/CD -> Editor) -> .gitlab-ci.yml 파일 작성

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

$ 로 표현된 환경변수 설정이 필요합니다

4. 환경변수 설정

GitLab -> 좌측 탭(Settings -> CI/CD -> Variables)
$ 앞서 .gitlab-ci.yml 파일에 있는 변수명과 동일하게 값을 할당해주면 됩니다!(File형식 말고 그냥 값 입력하면 됩니다~)

5. CI 스크립트 실행

GitLab -> 좌측 탭(CI/CD -> Editor)

버튼을 클릭해서 작성한 CI스크립트를 실행합니다.
만약, 위 사진과 같이 하단에 Commit changes 버튼이 활성화되지 않는다면 아무 공간에 엔터를 입력해서 변경사항을 만든 후 버튼이 활성화되는 것을 볼 수 있습니다.

5-1. 신용카드 등록

만약, 신용카드 등록을 하지 않았다면 failed가 되면서 Credit Card등록하라는 문구가 나오는대 이에 맞춰서 등록을 진행해주시면 됩니다. 1달러가 들어왔다가 다시 출금될 것입니다.

5-2. CI 스크립트 재실행

Step 5를 다시 진행합니다.

6. 실행완료

아래와 같이 성공적으로 진행된다면 Login Success / Job succeded 등의 문구가 나오면서 실행이 완료되어 이미지가 생성됩니다.

7. 이미지 확인

GitLab -> 좌측 탭(Packages and registries -> Container Registry)
이후 CI진행했던 프로젝트를 클릭하면 생성된 이미지를 확인할 수 있습니다

빨간 네모를 클릭해서 latest 버전의 이미지 경로를 복사할 수 있습니다.

8. sudo docker pull {이미지 경로}

EC2에서 docker 명령어를 통해 생성된 이미지를 pull 받아서 실행해보겠습니다.

ubuntu@ip:~$ sudo docker images
REPOSITORY                                             TAG       IMAGE ID       CREATED          SIZE

ubuntu@ip:~$ sudo docker pull {이미지 경로}
latest: Pulling from kyunghwan1207/hospital-community
xxx: Pull complete
xxx: Pull complete
xxx: Pull complete
xxx: Pull complete
xxx: Pull complete
Digest: xxx
Status: Downloaded newer image for {이미지 경로}

ubuntu@ip:~$ sudo docker images
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
{Repository 경로}  latest      xxxx       25 minutes ago   452MB

9. sudo docker run

이제 pull 받은 이미지를 통해 container를 띄우겠습니다.
(아래 명령어들은 가독성을 위해 엔터로 분리했으니 실제로 입력하실 때엔 엔터 대신 스페이스바로 한칸만 띄우면서 명령어 작성해주시기 바랍니다!)

ubuntu@ip:~$ sudo docker run -p 8080:8080 --name hospital-community 
-e SPRING_DATASOURCE_URL=jdbc:mysql//{RDS 엔트포인트}:3306/{Database 이름}
-e SPRING_DATASOURCE_USERNAME=root
-e SPRING_DATASOURCE_PASSWORD={비밀번호}
-d {Repository 경로}
  • -e 옵션은 application-aws.yml 파일에서 입력했던 DB 접속 정보
    즉, yml 형식으로: 으로 구분되었던 spring / datasource / url, username, password 정보들을 차례로 입력해주면 됩니다.
  • --name 옵션에는 아무거나 입력해주셔도 괜찮습니다(추후 docker ps로 확인할 때 사용할 이름)
  • .gitignore에서 DB정보는 제외한 채로 github에 올렸기 때문에 -e 옵션으로 환경변수 설정해주어야합니다.
  • 이때 = 사이에 공백이 있으면 안되고 포트번호 8080이 이미 물려있다면 8082:8080 등으로 다른 포트번호 물리시기 바랍니다!
  • -d 옵션으로 백그라운드에서 실행할 이미지 입력할 때 docker images 명령어로 확인한 {Repository 주소}를 입력해주시기 바랍니다!

9-1. sudo docker ps 후 아무것도 안나올 때

앞서 docker run 명령어를 실행한 후 return 된 containerID를 가진
Container 정보가 나오지 않는다면 정보를 잘 못입력해서 제대로 실행되지 못한 것이기에

$ sudo docker ps -a
$ sudo docker rm {ContainerID}

한 이후에 -e 옵션에서 적용한 환경변수 값(USERNAME=root인데 admin으로 했거나, 비밀번호를 잘못입력하거나), DB이름을 잘못 입력했거나 등을 다시 한 번 확인한 후 9번 과정을 진행합니다.

만약 sudo docker rm {ContainerID} 를 하지 않고 다시 9번 과정을 한다면 docker이름이 이미 존재한다는 에러가 발생하기에 사용하지 않는 container들은 바로바로 stop 해주는 것이 좋습니다!

9-2. sudo docker ps 후 container 바로 Exited 될 때

만약 잘 동작해서 Container 정보를 확인할 수 있었는대 어떤 작업도 안했는대 몇 초 있다가 container가 내려간다면..(docker ps -a 명령어로 확인가능) EC2 용량문제이기 때문에 t2.micro로 사용했던 분들은 t3.small로 바꿔서 진행하시는 걸 추천드립니다!

profile
부족한 부분을 인지하는 것부터가 배움의 시작이다.

0개의 댓글