[AWS] Jenkins를 통한 Docker Compose + mysql+ Spring Boot 애플리케이션 빌드 및 자동 배포 - 임시
전체적인 흐름
이 글을 참고했다.
원래는 github 올림
→ Jenkins에서 github에 올라와있는 springboot 프로젝트를 가져와서 빌드
→ 메인 서버에 .jar 형태로 파일을 전송
→ 실행
을 하고 싶다면 다음과 같은 방법을 써야하지만,
나는 springboot 서버를 docker 컨테이너에서 실행할 것이므로 아래과 같은 플로우로 가려고 한다.
github 올림
→ Jenkins에서 github에 올라와있는 springboot 프로젝트를 가져와서 빌드
→ jenkins 컨테이너에서 자동 빌드 및 docker-compose 명령어로 배포
세팅
아래는 예전에 이미 진행했었기 때문에 빠르게 세팅하고 넘어가자.
이 글에서는 저번에 성공하지 못한 부분부터 진행한다.
1번은 이 글을 참고했다.
2~4번은 이 글을 참고했다.
- 우분투 인스턴스 생성 및 swapfile 할당
- 도커 엔진 설치
- 도커 컴포즈 설치
- 젠킨스 설치 (with. docker compose) 및 초기 설정 (Item 생성 및 Git 연동)
- 깃허브 설정 (deploy key, webhook, …)
젠킨스 Build Execute Shell
이 글을 참고했다.
#echo "docker hub에 push 하기위해 login"
#sudo docker login -u 도커허브아이디 -p 패스워드
#echo "이미지 빌드"
#sudo docker build --no-cache=true -t ln8847/jenkins-test:1.0 .
#echo "생성된 이미지 확인"
#sudo docker images | grep jenkins-test
#echo "도커허브에 push"
#sudo docker push ln8847/jenkins-test:1.0
echo "기존 컨테이너 삭제"
docker-compose stop
echo "도커 컨테이너 실행"
docker-compose up -d
sleep 5s
docker ps -a
Trouble Shooting
이 글을 참고했다.
시도1 - docker-compose에 옵션 추가
version: '3'
services:
jenkins:
container_name: 'jenkins'
image: 'jenkins/jenkins:lts'
restart: always
ports:
- 9090:8080
- 50000:50000
volumes:
- /home/ubuntu/docker/jenkins/home:/var/jenkins_home
- /var/run:/var/run:ro # docker 실행 폴더 공유
- /var/run/docker.sock:/var/run/docker.sock # docker 소켓 파일 마운트
environment:
TZ: "Asiz/Seoul"
컨테이너 자체를 삭제하지 않고 docker-compose stop
후 docker-compose up -d
만 해서 그런지는 몰라도 실패했다..
시도2 - jenkins container 접속하여 docker-ce-cli 설치
🚨 주의
아래를 따라 도커와 도커 컴포즈를 설치했는데,
docker-compose stop
후docker-compose up -d
를 하니 도커와 도커 컴포즈 설치했던게 다 날라간다…
다음부터는docker-compose start
를 해야겠다!!!
우분투에 접속해서 진행한다.
# jenkins container 접속
$ docker exec -u 0 -it jenkins bash # root 로 접속 (jenkins 는 젠킨스 컨테이너 이름)
# linux 버전 확인
$ cat /etc/issue
# --------------- OS --------------------------------
# root@DESKTOP-R4P59B3:/home/opendocs# cat /etc/issue
# Ubuntu 20.04.4 LTS \n \l
# --------------- jenkins Container OS --------------------------------
# root@DESKTOP-R4P59B3:/home/opendocs# docker exec -it jenkins /bin/bash
# root@8fc963af71bb:/# cat /etc/issue
# Debian GNU/Linux 11 \n \l
# Docker 설치
## - Old Version Remove
$ apt-get remove docker docker-engine docker.io containerd runc
## - Setup Repo
$ apt-get update
$ apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
$ mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
## - Install Docker Engine
$ apt-get update
$ apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# $ apt-get update
# $ apt-get install docker.io
# 버전 확인
$ docker -v
이제 도커 컴포즈를 설치하자
이 글을 참고했다.
버전 확인은 여기에서!
$ apt-get update
# sudo apt install docker-compose 는 구버전
$ curl -L "https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
$ ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 버전 확인
$ docker-compose -v
여기까지하고 빌드해보니 에러 메시지가 바뀌었다..!
우분투 인스턴스에서 젠킨스 컨테이너에 root
로 접속해서 진행한다. ($ docker exec -u 0 -it jenkins bash
)
이 글을 참고했다.
$ chmod 666 /var/run/docker.sock
다시 빌드해보니 이번엔 이렇게 잘 실행되는 듯 했으나…
마지막에 이런 에러를 뿜으며 실패했다…
이번에는 Dockerfile
에서 COPY
부분의 문제인 것 같다…
인텔리제이에서 Dockerfile
의 내용을 변경해보자.
이 글을 참고했다.
변경 전
FROM openjdk:17-ea-11-jdk-slim
VOLUME /tmp
ARG JAR_FILE=build/libs/jenkins-test-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} jenkins-test.jar
ENTRYPOINT ["java","-jar","/jenkins-test.jar"]
EXPOSE 8080
변경 후
FROM openjdk:11-jdk
#VOLUME /tmp
ARG JAR_FILE=./build/libs/jenkins-test-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
EXPOSE 8080
이대로 git push를 하니 webhook 설정을 해둔 덕분에 젠킨스가 자동으로 빌드했다.
하지만 에러는 그대로였다…
이 글을 보고
.gitignore
의 문제임을 알았다.
Dockerfile에서 build/libs/jenkins-test-0.0.1-SNAPSHOT.jar
을 app.jar
로 COPY 해야하는데 build
디렉토리가 .gitignore
에 등록되어있었다.
그래서 build/libs
를 .gitignore
에서 제외했다.
변경 전 gitignore
...
build/
...
변경 후 gitignore
...
build/classes
build/generated
build/resources
build/tmp
build/bootJarMainClassName
...
젠킨스를 이용한 자동 배포
💛 개인 공부 기록용 블로그입니다. 👻