네이버 클라우드 캠프/Spring Boot & React

[Spring boot & React] 게시판 앱 배포하기(2)

graph-dev 2023. 8. 12. 19:36
728x90

도커 허브 레포지토리 생성 및 업데이트

도커 허브 사이트로 가서, 로그인 후, 레포지토리를 생성해주겠습니다. 

 

도커 허브 레포지토리 생성

 

이렇게 myapp이라는 이름으로 도커 허브에 레포지토리를 만들고, 젠킨스로 가서 Build Steps > Execute shell를 추가해줍니다. 거기서 Command에 다음과 같이 입력합니다. Apply & Save를 통해 저장해줍니다.

docker build -t statsdev/reactboard:2.0 .
docker login -u '도커허브 이메일' -p '도커허브 비밀번호' docker.io
docker push statsdev/reactboard:2.0

Add build steps > execute shell > Command 입력

권한 오류를 방지하고자 jenkins서버에 접속해서, docker.sock 파일의 권한을 조정해줍니다.

chmod 666 /var/run/docker.sock

 

이제 Jenkins 사이트에서 myApp > 지금 빌드를 누릅니다. 빌드 성공이 뜰 때까지 기다려줍니다.

지금 빌드 수행

 

빌드가 성공하면 도커 허브로 가서 myapp의 상태를 확인합니다. 2.0으로 나타나면 성공한 것입니다.

빌드 성공후 도커 허브 레포지토리 버전 2.0 확인

 

Jenkins 서버에서 Spring Boot 서버로 접근하기

접근을 위해서는 키(Key)를 만들어줘야 합니다.

jenkins 서버의 홈 디렉토리에서 springboot 폴더를 만들고 해당 경로로 이동한 다음, 컨테이너로 접속합니다.

mkdir springboot
cd springboot/
docker container exec -itu 0 docker-jenkins /bin/bash

 

컨테이너에서 명령어를 작성하여 키 이름, 비밀번호 공백으로 입력하고 저장할 위치를 지정합니다.

ssh-keygen -t rsa -C "docker-jenkins-key" -m PEM -P "" -f /root/.ssh/docker-jenkins-key

Key 생성 후 화면

 이제 .ssh 폴더 내부를 살펴보면 공개키(.pub)하나와 개인키 하나씩 생성된 것을 알 수 있습니다.

.ssh 내부 한쌍의 키를 확인

다음 명령어를 통해 개인키와 공개키의 각각 내부를 확인합니다.

#개인키 확인
cat ~/.ssh/docker-jenkins-key

#공개키 확인
cat ~/.ssh/docker-jenkins-key.pub

 

확인했다면 이 개인키 파일을 복사해서 jenkins_home 디렉토리로 붙여넣습니다. 또한, 해당 경로에서 개인키 파일에 대한 읽기 권한을 아래 명령어를 통해 추가해주겠습니다.

# 키 파일을 복사해서 jenkins_home 넣기
cp ~/.ssh/docker-jenkins-key /var/jenkins_home/

#읽기 권한 추가
chmod +r /var/jenkins_home/docker-jenkins-key

 

그리고 실제로 잘 들어갔는지 확인합니다.

개인키가 잘 복사되었는지 확인

확인했다면 exit 명령어로 컨테이너를 빠져나오겠습니다.

 

이제 docker-jenkins 컨테이너에 있는 공개키(.pub)를 현재 경로에 있는 폴더로 복사해서 가져옵니다. 아래 명령어를 사용합니다.

docker cp docker-jenkins:/root/.ssh/docker-jenkins-key.pub ./docker-jenkins-key.pub

공개키 복사여부 확인

Spring boot 서버에서 공개키 붙여넣기

복사가 잘 이루어졌습니다. 이제 터미널 혹은 명령 프롬프트를 하나 더 열어주고, "Spring boot" 서버로 접속합니다. 접속해서 .ssh 폴더를 만들고, 이동해서 authorized_keys에 jenkins 서버의 공개키를 모두 복사해서 붙여넣어줍니다.

mkdir .ssh
cd .ssh
vi authorized_keys

 

springboot 서버

붙여넣을 때는 ssh-rsa부터 docker-jenkins-key까지 모든 부분을 다 복사해서 붙여넣어야 하는 점을 주의합니다. 그리고 :wq로 저장 후 빠져나오겠습니다. 이제 이 공개키를 통해 springboot에서 jenkins 서버로 갈 수 있습니다.

 

젠킨스 사이트로 돌아와서, Dashboard > 관리 > Plugins > Available plugins 메뉴로 갑니다. 가서 publish로 검색해서 Publish Over SSH를 찾아 Install 체크해줍니다. 

 

Plugins 에서 설치후 확인

 

그리고 Plugins에서 해당 플러그인이 잘 설치되었는지 확인해주고 메인 페이지로 이동합니다. Jenkins 관리 > System > Publish over SSH 섹션이 만들어졌습니다. 여길 아래와 같이 편집해줍니다.

 

저장해주고, 아래 SSH Server 섹션에는 springboot 서버 이름을 Name에 표기하고, Hostname에는 해당 springboot 서버의 공인아이피를 입력합니다.

SSH 키값 입력 및 SSH Server 설정 후 Test 화면

 중요한 점은 SSH Server 설정 후에는 Test를 해서 우측 하단 처럼 "Success"가 나타나야 한다는 것입니다. 완료 후에는 Apply & 저장을 눌러서 적용해주시구요.

 

이제 Springboot 서버에서 접속을 시도하겠습니다. 아래 명령어를 통해 접속하고 myapp 2.0 이미지를 불러와서 실행시키겠습니다.

docker login -u '[도커허브 이메일]' -p '[도커허브 비밀번호]' docker.io
docker pull statsdev/myapp:2.0
docker ps -q --filter name=myapp | grep -q . && docker rm -f $(docker ps -aq --filter name=myapp)
docker run -d --name myapp -p 9090:9090 statsdev/myapp:2.0

 추가로 myapp과 도커허브 계정이름은 각자의 것으로 편집해서 넣어주세요.

 

이 작업이 끝나면 젠킨스에서도 SSH Key, 서버 설정 부분 하단에서 Apply & 저장을 눌러줍니다. 그리고 지금 빌드를 누르겠습니다. 빌드가 완료되면, 해당 파일 하나를 간단히 편집해보고, git push까지 진행해보겠습니다.

 

 

빌드 완료

 

빌드가 잘 성공했습니다. 먼저 springboot 공인아이피:9090 으로 웹 사이트에 입력합니다. 게시판 앱에 잘 접속되는 것을 알 수 있습니다.

 

springboot에서도 게시판 앱 접속 가능

 

이때, 파일 하나만 편집해보겠습니다. springboard > reactjs 폴더에 있는 README.md 파일을 하나만 바꿔보고 저장합니다.

 

git에 등록된 파일 하나만 수정 후 저장

그러면 github에 이 수정사항을 push 해줍니다. 젠킨스에서도 git 소스코드 변경사항을 push하면 도커 컨테이너 이미지를 내려받아서 자동으로 빌드하고 배포 후 컨테이너 접속을 합니다.

 

github push 후 젠킨스 빌드 수행

 

가 되어야 하는데 에러가 발생합니다. 빌드를 눌러야만 반응하는..것이니 자동이 아니라 수동으로 업데이트가 되는 문제가 발생합니다.

github webhook에서 에러 발생

 

한번 고쳐보고 다시 수정해서 올리겠습니다!!