DevOps

[Jenkins] Jenkins로 Springboot 빌드 및 배포하기

땅지원 2023. 1. 26. 16:49

Jenkins 설치

sudo docker run -itd --name jenkins -p 8080:8080 -v /docker/jenkins:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -e TZ=Asia/Seoul -u root jenkins/jenkins:lts

바로 명령어 실행하면 알아서 jenkins/jenkins:lts 버전 받아짐


# 이걸로 하는게 맞는듯?
sudo docker exec -it jenkins bash

sudo docker exec -it jenkins /bin/bash

cat /var/jenkins_home/secrets/initialAdminPassword

 

** 다른 방법으로 젠킨스 설치하고 싶을 떄 

 

Jenkins 설치

# Jenkins을 설치하는 과정에 대해서 알아보자. Jenkins 이란 Jenkins는 Java로 빌드 된 오픈 소스 CI (Continuous Integration) 및 CD (Continuous Delivery) 도구이며, Jenkins는 기본적으로 소프트웨어 프로젝트를 빌드,

may9noy.tistory.com

 

Error : 플러그인 설치 안됨(설치 버전이 낮아서 그럼)

1. 버전 낮아서 그런거니까 lts버전으로 설치해주면 된다

2. 혹은 이미 설치가 되어있어서 그런걸수도 있음

3. 로그보니까 java.net.SocketTimeoutException: connect timed out 라고 되어있는데 구글링해보니까 프록시 설정 문제라고 해서 안되는거 같은데 

4. 진짜 집념으로 Retry 계속함(4시간 걸렸나?) -> 이걸로 해결함

서버 초기화하니까 짱 잘됨 너무 행복하다

 

** Java 삭제(ubuntu)

sudo apt-get remove openjdk*
sudo apt-get autoremove --purge
sudo apt-get audoclean

 

새로운 아이템 - Freestyle project - Git 레포지주소넣기 - 빌드브랜치설정

 

여기까지하면 128 에러뜰텐데 계정설정을 안해서 에러남 => Add 해서 git저장소 계정정보 넣어주면됨(Username, password 2개만)

플러그인에 gitlab이 확실하게 있는지 확인 필요

 

Comment (regex) for triggering a build 아래에 [고급] 클릭

[Gitlab - Settings - Webhooks]에서 방금 새로 만들었던 Secret token이랑 Jenkins URL을 넣어준다

 

Webhooks URL에 아래에 있는 저 주소로 넣어야함, 안하면 403 에러뜸

 

* 혹시 빌드 시간이 한국시간이 아니라면?

사용자 - 계정선택 - 설정 - Timezone 설정

 

근데 push해서 빌드 자동화는 설정했는데 어떤걸 빌드할진 설정을 안해줬잖아?

어떤 jdk나 nodejs를 가지고 프론트나 백을 빌드할껀지 설정을 안했기 때문에 jenkins한테 알려줘야함

 

 

[Jenkins 관리  - Global Tool Configuration]에서 설정함

JAVA_HOME은 Jenkins 서버 내부의 JAVA를 알아야하니까

docker exec -it jenkins bash

로 들어가서

echo $JAVA_HOME

 

git은 이미 플러그인으로 다운을 했을텐데 /usr/bin/git이 고정임

 

 

이 상태로 Build Test를 해보면

FAILURE: Build failed with an exception.

* What went wrong:
Directory '/var/jenkins_home/workspace/auctopus' does not contain a Gradle build.

....

이런 에러가 뜰텐데 '/var/jenkins_home/workspace/auctopus' 로 가보면 그 원인을 알 수 있다.

 

내 레포지터리의 문제는 프론트와 백을 같이 담고 있는데 backend폴더로 들어가야 gradle 관련 빌드를 할 수 있는데 거기로 못들어가서 그렇다

 

그렇다는건 FE(react)는 npm, BE(SpringBoot)는 gradle로 각각 따로 빌드해야되는데 이 설정을 어떻게 할까?

ITEM을 2개 만들고 각각 item 마다 빌드해야하는 폴더를 지정해야함

 

왼쪽과 같은 디렉터리 구조에 대해서 backend 폴더만 build를 해야하니까 경로를 지정함

add build step에서 Invoke Gradle script를 열고

[Invoke Gradle script - advanced - Root Build script]에서 'backend/' 라고 적어줬음

 

 

여기까지가 CI였음================

 

SSH 통신을 이용한 방법

더보기

그럼 CD를 해보자.

 

CD의 원리는 CI를 통해 build 후 .jar(springboot 배포파일)이 jenkins 서버 안에 존재하게 되는데 이 파일을 ssh 통신을 이용해서 우리가 받은 ec2 서버에 보내야한다.

 

그러면 먼저 ec2 서버 접속을 위한 ssh 환경설정을 해야하는데 Publish Over SSH 플러그인이 필수적으로 필요하다

 

플러그인을 정상적으로 설치했다면 [Manage Jenkins - Configure System] 에 들어가 아래로 내리다보면 Publish Over SSH 탭이 있을텐데 여기서 우리가 받은 서버의 설정을 해주면 된다

 

여기서 제일 중요한건 remote directory인데 서버에 들어가자마자 pwd를 하면 /home/ubuntu로 나오니까 이걸로 해주면되고 아래에 key는 우리가 받은 pem파일을 메모장으로 열어서 붙여주고 

 

오른쪽 아래에 Test Configuration을 눌러 Success가 뜨면 성공적으로 연결 됨!

 

Error : 계속 docker: command not found가 뜬다면

sudo docker exec -it jenkins bash

apt-get update && apt-get install -y docker.io

 

 

도커 인 도커 방식을 이용해서 바로 배포 예정, 레포지터리에 DockerFile을 하나 만들어서 인식하게함

FROM openjdk:11-jdk
VOLUME /tmp
EXPOSE 8080
ARG JAR_FILE=build/libs/project-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Seoul
RUN apt-get install -y tzdata

 

Error : pull access denied for auctopus/be, repository does not exist or may require 'docker login': denied: requested access to the resource is denied

exec로 내부 들어가서 docker login 명령어를 입력하고 dockerhub 로그인을 해준다 

아니면 image 명령어를 잘못해서 나오는거일수도

 

Execute shell

cd /var/jenkins_home/workspace/auctopus-be/backend

docker images
docker ps -a

docker stop backend
docker rm backend
docker rmi auctopus/be

docker images
docker ps -a

cat Dockerfile

docker build -t auctopus/be .
docker run -p 8081:8081 --name backend auctopus/be