⚙️ Ops/CI & CD

[Jenkins] Dockerfile & Shell Script 작성

신건우 2023. 5. 30. 13:20

Script 작성

Jenkins의 Item 설정 마지막 부분의 Build Steps에서 Add Build Step 클릭

Execute Shell을 선택해서 스크립트 창을 열어서 아래 스크립트를 테스트 해보면서 작성한다.

#!/bin/bash

# Gradlew 권한 부여
chmod 500 ./gradlew

# 빌드
./gradlew build

# 가동중인 Spring Boot 컨테이너 중 이름이 cosmic 인 컨테이너 중지 & 삭제
if docker ps -a --filter "name=cosmic" | grep -q cosmic; then
    docker stop cosmic
    docker rm cosmic
fi

# 기존 Spring Boot Image 중 이미지가 기존과 똑같은게 있으면 이미지 삭제
if docker images | awk '{print $1":"$2}' | grep -q "{ip}:5000/cosmic:1.0"; then
    docker rmi -f {ip}:5000/cosmic:1.0
fi

# Docker Hub Login & 파라미터는 젠킨스에서 설정한 전역변수 사용
echo $PASSWORD | docker login -u $USERNAME --password-stdin

# 도커파일 빌드
docker build -t {ip}:5000/cosmic:1.0 -f ./deploy/cosmic .

# Container Registry에 이미지 Push
docker push {ip}:5000/cosmic:1.0

# Push한 이미지 삭제
docker rmi {ip}:5000/cosmic:1.0

# Container Registry에서 이미지 Pull
docker pull {ip}:5000/cosmic:1.0

# Docker Container 생성
docker run -d -v /root/logs:/logs --privileged --name cosmic -p 8080:8080 {ip}:5000/cosmic:1.0

# 사용하지 않는 불필요한 이미지 삭제 = 겹치는 이미지가 존재하면 이미지를 삭제한다 || true 
dangling_images=$(docker images -f "dangling=true" -q)
if [[ -n "$dangling_images" ]]; then
    docker rmi -f $dangling_images || true
fi

dangling Image란?

동일한 태그를 가진 Docker Image가 빌드될 경우, 기존에 있는 이미지는 삭제되지도 않고,

tag가 none으로 변경된 상태로 남게 된다.

즉, 재 빌드시 이전 이미지를 삭제하고 새로운 이미지로 대체하겠다는 뜻이다.


Dockerfile 작성

Spring Boot의 최상단에 deploy 디렉터리를 생성하고 도커 파일을 작성한다.

FROM openjdk:11  
VOLUME /logs  
EXPOSE 8080  
ARG JAR=Pipeline-CICD-0.0.1-SNAPSHOT.jar  
COPY ../build/libs/${JAR} /${JAR}
ENTRYPOINT ["nohup", "java","-Dspring.profiles.active=local","-jar","$JAR", "&"]

파이프라인 구축 완료

이제 프로젝트에서 코드 수정 후 커밋을 해보자.

그럼 Jenkins 빌드가 자동으로 돌아간다.


빌드 완료


컨테이너를 확인해보면 알아서 nohup + Background로 스프링 부트 서버가 실행중이다.


Docker Private Container Registry에도 이미지가 잘 교체되고 들어갔다.