DevOps

jenkins + Ansible playbook + docker hub를 통한 빌드 및 배포

lsh2613 2023. 8. 4. 01:11

이번 포스팅은 젠킨스에서 깃헙 코드를 가져와 빌드한 war파일을 Ansible을 통해 docker hub에 업로드하고

외부 서버인 Docker-server를 통해 업로드한 이미지를 가져와 배포하는 작업까지 다뤄보겠습니다.

 

1. Ansible서버에서는 docker hub로 업로드 위한 playbook을 실행

2. docker server에서는 웹을 띄위기 위한 배포 작업 playbook을 실행

총 2개의 yml 파일이 필요

 

먼저 소스 코드 관리에서 깃허브를 연동해주었습니다.

 

ssh가 설치된 ansible 서버에서 play book을 실행하기 위해 명령어까지 입력해줍니다.

빌드 후 조치

Send build artifacts over SSH

Ansible 서버에서 war파일을 가지고 이미지를 생성하여 도커 허브에 업로드 해야 하기 때문에

war파일을 ansible-server에 전송해주는 작업을 실시합니다.

기본적으로 jenkins를 통해 코드를 가져와 빌드하면 /var/jenkins_home/프로젝트명/target/*.war 경로에 생성된다.

여기서 전송할 파일을 Source files에, 사전에 삭제할 경로를 Remove prefix에, 루트 경로를 Remote directory에 지정해준다.

전송할 파일이 하나여서 *.war로 지정해줬지만 정확한 파일 명을 입력해주면 좋다.

경로를 타고 들어가 war파일을 지정해주기 위해 target/*.war로 선언하고 그대로 복사가 되지만 외부서버에는 *.war만 전송하고 싶다면 Remove prefix에 target을 넣어 *.war만 전송하게 해준다. 그리고 해당 파일은 Remote directory에 저장하게 되는데 . 을 통해 루트 디렉토리에 저장하였다.

 

위에서 언급한 대로 Ansible서버에서는 docker hub로 배포하기 위한 create-cicd-project-image.yml만 실행시키기 위해서 limit을 주었다. 현재 Ansible server의 ip가 172.17.0.2이다. 해당 yml을 통해 도커 이미지를 생성하고 도커 허브에 업로드하게 된다.

4번 서버 (Docker-server, 외부 서버)에서는 배포를 위한 create-cicd-devops-container.yml

해당 yml을 통해 도커 허브에서 이미지를 가져와 컨테이너를 실행하게 된다.

이미 빌드된 이미지, 컨테이너가 있다면 중지하고 삭제시킨 후에 다시 빌드합니다.

없는데 삭제할 경우 에러가 발생하므로 에러를 무시해주는 옵션도 추가로 넣어줍니다.

 

빌드

빌드를 해주면 docker 서버에 이미지와 컨테이너가 생성된 것을 확인할 수 있다.

docker 서버를 8081로 포트포워딩 해놨기 때문에 8081로 접속해서 웹을 확인해보자.

docker hub에도 정상적으로 배포가 완료되었다.

 

정리

순서 흐름도를 간단하게 정리해봤다.

  1. Jenkins에서 git 코드를 가져와 빌드하여 war파일 생성
  2. 빌드 후 조치 Send build artifacts over SSH를 통해 ansible 서버로 전송
  3. ansible서버에서는 playbook을 통해 이미지를 생성하고 도커 허브에 업로드
  4. ansible서버의 playbook을 통해 docker(외부)서버가 도커 허브에서 이미지를 가져와 컨테이너를 실행.