티스토리 뷰

개요

gitlab ci를 이용해 빌드 후 linux머신에서 docker로 배포하는 스크립트입니다.

crontab은 1분에 1번씩 deploy.sh를 실행 시켜서 docker build후 push를 하고 최대 2분 후에는 배포가 되는 설정입니다.

 

관련 youtube video

https://youtu.be/sAGwCB541H4

 

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:
  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

 

GITLAB Variable설정

 

 

Docker배포 스크립트

docker pull을 해서 up to date가 있는지 여부를 확인해 없으면 배포하는 스크립트입니다.

 

사용방법

deploy.sh registry.gitlab.com/oceanfog1/likelion-project likelion-project > /home/ubuntu/deploy.log

위와 같이 파라메터를 2개 넘겨줍니다. 첫번째 파라메터는 Container Registry주소이고 두번째는 Project Name입니다.

#!/bin/bash
set -ex
CONTAINER_REGISTRY=$1
PROJECT_NAME=$2
echo $(date) CONTAINER_REGISTRY:$CONTAINER_REGISTRY-PROJECT_NAME:$PROJECT_NAME

docker pull $CONTAINER_REGISTRY: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 $PROJECT_NAME
        docker rm -f $PROJECT_NAME
        docker run -p 8081:8080 --name $PROJECT_NAME -e SPRING_DATASOURCE_URL=jdbc:mysql://ec2-3-38-111-117.ap-northeast-2.compute.amazonaws.com:3306/hospital-review3 -e SPRING_DATASOURCE_PASSWORD=password -d $CONTAINER_REGISTRY
        docker image prune -f
fi

 

crontab

* * * * * sh /home/ubuntu/deploy.sh registry.gitlab.com/oceanfog1/likelion-project likelion-project > /home/ubuntu/deploy.log

매분 위 deploy.sh를 실행하도록 설정 합니다.

 

 

syslog에서 크론탭 실행 로그 보기

tail -f /var/log/syslog | grep CRON

 

참고

https://stackoverflow.com/questions/51627803/how-to-check-if-docker-pull-actually-pulled-something

728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함