깃랩 & crontab을 이용한 ci/cd

KingTG·2024년 3월 12일

인프라

목록 보기
1/13

파일 세팅(Dockerfile, .gitlab-ci.yml)

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"              \
]

.gitlab-ci.yml

stages:
  - dockerbuild-push

package:
  only:
    - main
  image: docker:latest     #도커 위에서 빌드를 한다
  stage: dockerbuild-push
  services:
    - docker:dind          #도커 안에서 도커를 빌드할 때 주는 옵션
  variables:
    IMG_TAG: ${CI_REGISTRY_IMAGE}:latest #환경 변수 설정, CI_REGISTRY_IMAGE : 이미지에 사용하는 이름
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
    - docker build -t $IMG_TAG .
    - docker push $IMG_TAG
  after_script:
    - docker logout

V2


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

크론탭 : 예약실행

crontab -e // crontab 설정 입력 파일
crontab -l // crontab 내용 확인
crontab -r // crontab 내용 삭제

*    *    *   *   * 
분  시   일   월  요일
  1. sudo su -
  2. crontab -e
    • 크론탭 설정 처음이면 (vim 2번 선택)
    * * * * * sh /home/ubuntu/deploy.sh > /home/ubuntu/deploy.log
  1. cd /home/ubuntu (root권한)
  2. vim deploy.sh
deploy.sh
  #!/bin/bash
  set -ex
  
  docker pull registry.gitlab.com/seotg/pro | grep "Image is up to date" && pull_status="already_pulled" || pull_status="newly_pulled"
  
  echo $pull_status
  
  if [ "$pull_status" = "newly_pulled" ]; then
  docker stop pro
  docker rm -f pro
  docker run -d -p 8080:8080 --name pro -e SPRING_DATASOURCE_URL=jdbc:mysql://ec2-3-34-122-205.ap-northeast-2.compute.amazonaws.com:3306/pro -e SPRING_DATASOURCE_USERNAME=root -e SPRING_DATASOURCE_PASSWORD=12345678! registry.gitlab.com/seotg/pro
  docker image prune -f
  fi

deploy.sh 양식

    #!/bin/bash    
    set -ex
    
    docker pull registry.gitlab.com/<사용자ID>/<프로젝트이름>:latest | grep "Image is up to date" && pull_status="already_pulled" || pull_status="newly_pulled"
    
    echo $pull_status
    
    if [ "$pull_status" = "newly_pulled" ]; then
            docker stop <컨테이너이름>  ==> 아래 빨간색 동그라미
            docker rm -f <컨테이너이름> ==> 아래 빨간색 동그라미
            docker run -p 8080:8080 --name <컨테이너이름> ==> 아래 빨간색 동그라미 -e SPRING_DATASOURCE_URL=<url/DB명><password> \
     		-d registry.gitlab.com/<사용자ID>/<프로젝트이름>
    		docker image prune -f
    fi

안될경우

  • docker logs [컨테이너id OR NAMES] 를 사용하여 로그를 확인

docker ps 해보면 컨테이너가 내려가 있다

deploy.sh의 명령어 대로 순서대로 실행 해본다

  1. docker pull registry.gitlab.com/<사용자ID>/<프로젝트이름>

    denied: access forbidden 에러나면 밑에 참고

    =⇒ 실행 후 docker images 명령어를 쳐보면

[registry.gitlab.com/seotg/pro](http://registry.gitlab.com/seotg/pro) 이미지 생성
  1. docker stop <컨테이너이름> ==> 아래 캡처한 이미지 빨간색 동그라미 =⇒ 첫실행시에는 아직 실행을 안해서 생략
  2. docker rm -f <컨테이너이름> ==> 아래 캡처한 이미지 빨간색 동그라미 =⇒ 첫실행시에는 아직 실행을 안해서 생략
  3. docker run -p 8080:8080 --name <컨테이너이름만들기> ==> 아래 빨간색 동그라미 -e SPRING_DATASOURCE_URL=<url/DB명> -e SPRING_DATASOURCE_PASSWORD= -d registry.gitlab.com/<사용자ID>/<프로젝트이름>
  4. docker image prune -f =⇒ 실행안하고있는 이미지 삭제

문제 해결

denied: access forbidden

docker login 명령어를 쳐서 로그인을 한번 해야된다.

=⇒ docker login registry.gitlab.com/seotg/pro

username : seotg

비밀번호 : 깃랩비밀번호

The driver has not received any packets from the server.

.yml에서 드라이버 추가
driver-class-name: com.mysql.cj.jdbc.Driver

.yml

server:
  port: 8080
  servlet:
    encoding:
      force-response: true
      charset: UTF-8

spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher
  profiles:
    active: ec2
  datasource:
    username:
    password:
    driver-class-name: com.mysql.cj.jdbc.Driver  ////이거 추가함
    url:

  jpa:
    hibernate:
      ddl-auto: create
    show-sql: true

0개의 댓글