ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Docker 가상환경에서 스프링 maven프로젝트 jenkins/tomcat 자동배포 구성
    웹프로그래밍/Docker , CI&CD 2019. 1. 7. 22:32

    프롤로그

    윈도우에서 Docker를 이용하여 프로젝트를 자동으로 빌드하고 배포하는 가상환경을 구성하였습니다.

    Github에서 commit 이벤트 발생시 jenkins가 자동 빌드 및 tomcat에 프로젝트를 배포합니다. 

    진행 순서는 아래와 같습니다.


    목차

    1. STS(이클립스)에서 Spring Legacy Project 생성

    2. Docker ToolBox와 Docker 윈도우 버전 설치

    3. kitematic을 이용해서 젠킨스 컨테이너 생성 및 설정

    3-1. kitematic 실행화면

    3-2. 젠킨스 실행 후 필수 플러그인 설치

    4. GitHub에서 원격 저장소 생성하고 이클립스(STS)에서 프로젝트와 연동

    5. 젠킨스에 프로젝트 원격 저장소 등록 및 빌드 관련 설정

    5-1. Github 계정 정보 입력 및 빌드유발 설정

    6. ngrok으로 젠킨스 원격 접속 설정 및 Webhooks 설정

    6.1 ngrok으로 외부에서 접근 가능한 URL 생성

    6.2 Github에서 Webhooks 설정

    7. 자동 빌드 및 배포 확인




    1. STS(이클립스)에서 Spring Legacy Project 생성

    테스트 목적으로 임시 프로젝트를 만든다.








    2. Docker ToolBox와 Docker 윈도우 버전 설치

    현재 윈도우용 버전은 윈도우10 pro에서 그나마 안정적으로 동작하고 그 이하 버전에서는 호환성 문제로 

    Docker ToolBox + 오라클 VirtualBox 조합을 사용해야 한다.  >>윈도우 도커 관련이슈 링크

    필자는 Docker ToolBox + Docker 윈도우 버전을 설치하였다. (윈도우와 바이오스에서 Hyper-v 가상화 관련 설정을 해주어야 한다.)






    3. kitematic을 이용해서 젠킨스 컨테이너 생성 및 설정

    윈도우용 Docker를 먼저 실행하지 않고 kitematic을 실행하면 아래 사진처럼 VirtualBox 를 사용할 것을 권한다. 그러므로 전 단계에서 설명한데로 꼭 설치가 되어야 한다.





    3-1. kitematic 실행화면↓

    오른쪽에서 원하는 이미지를 CREATE하면 자동으로 IMAGE를 다운로드하고 컨테이너 생성 및 IMAGE설치가 진행된다. 왼쪽이 생성된 컨테이너 목록이다. 톰캣과 젠킨스를 설치해준다.








    3-2. 젠킨스 실행 후 필수 플러그인 설치

    kitematic 실행화면에서 왼쪽 구석 'DOCKER CLI'를 클릭하면 윈도우 파워셀 창이 뜬다.

    아래 명령어를 입력해서 Port 번호를 확인한다. 


    docker container ls


    jenkins의 포트번호는 '32769'이다.



    웹 브라우저에서 실행하며 아래처럼 포트번호를 포함한 주소를 입력한다.


    http://localhost:32769


    비밀번호를 요구한다. 비밀번호는 젠킨스 설치시 컨테이너 안에 생성된다.




    비밀번호를 알아내려면 우선 도커 CLI에서 아래 명령어를 입력한다. 그러면 젠킨스 컨테이너에서 유닉스셀(bash)을 실행한다.


    docker exec -u 0 -it jenkins bash


    아래 명령어로 컨테이너 내부에 있는 젠킨스 관리자 비밀번호를 확인하고 복사 붙여넣기한 뒤 'continue' 버튼을 누른다.


    cat /var/jenkins_home/secrets/initialAdminPassword


    'exit' 명령어로 bash셀을 종료한다. 그리고 추천 플러그인을 설치한다.(왼쪽) 

    필자는 pipeline 관련 플러그인은 설치되지 않았는데 이후 진행하는데 아무런 지장이 없었다.

    나중에 젠킨스 관리 페이지에서 필요한 플러그인은 얼마든지 설치가 가능하니 일단 넘어가자.




    플러그인 설치 후 관리자 페이지에서 로그인할 계정 생성. 그냥 넘어가면 나중에 귀찮아지니 지금 만들자.






    플러그인 관리자에서 'Deploy to container' 플러그인을 검색 후 설치한다. 이후 젠킨스로 프로젝트 빌드 후에 톰캣 서버에 배포할때 필요하다.










    4. GitHub에서 원격 저장소 생성하고 이클립스(STS)에서 프로젝트와 연동

    내용이 너무 길어지는 관계로 이 과정에 대한 설명은 생략한다. 





    5. 젠킨스에 프로젝트 원격 저장소 등록 및 빌드 관련 설정

    젠킨스 관리자 메인 페이지에서 'new item'을 클릭한다.

    아래 화면으로 넘어간다. 아이템 이름은 프로젝트 이름을 입력하고 'Freestyle project' 선택 후 'OK'를 누른다.




    5-1. Github 계정 정보 입력 및 빌드유발 설정

    credentials에 github 계정과 비밀번호를 add해준다. 브랜치는 마스터로 지정했다.

    빌드유발에서 'GitHub hook trigger for GITScm polling' 체크









    빌드에서 'Invoke top-level Maven targets' 체크


    빌드 후 조치에서 톰캣 경로와 컨텍스트 경로를 잡아준다.


    **/*.war


    /






    톰캣 버전을 선택한다. 


    그 다음 credentials에서는 톰캣 관리자 계정과 비밀번호를 add한다. (위에서 추가한 것과 혼동하지 않도록 주의)


    톰캣 서버 컨테이너를 생성하고 기본적인 설정을 해줘야 한다. 그리고 localhost:port번호로 톰캣 기본화면을 띄울 수 있다. 거기서 관리자 화면으로 로그인할 계정과 비번을 등록해주는 것이다.


    참고:

    AWS EC2 우분투에서 Docker 톰캣8.5 설치 및 세팅



    Tomcat URL은 호스트 OS의 ip를 직접 입력해야 한다. (톰캣 관리자 페이지는 호스트 OS에서 웹브라우저로 접근한다.)

    localhost를 그대로 쓰면 컨테이너 내부 ip를 사용하게 되므로 배포가 진행되지 않는다. 








    6. ngrok으로 젠킨스 원격 접속 설정 및 Webhooks 설정

    ngrok은 로컬호스트 서버를 외부에서 URL로 접근 가능하게 바꿔준다. 자세한 내용을 홈페이지 참고

    Webhooks는 Github에서 이용 가능한 API로 특정한 원격 저장소에서 커밋과 같은 이벤트가 발생하면 HTTP POST payload를 지정한 URL로 전송한다. 두 개의 프로그램을 이용해서 자동 빌드 환경을 구성할 수 있다. 


    좀 더 자세히 설명하면, 이클립스에서 작성한 코드를 원격 저장소로 commit 및 push하면 Webhooks가 작동하고 commit 내용은 젠킨스로 전송된다. 


    6.1 ngrok으로 외부에서 접근 가능한 URL 생성

    아래 코드에서 32769는 필자의 jenkins 컨테이너 포트번호이다. 자신의 포트번호를 입력해야 한다.


    ngrok http 32769




    젠킨스로 연결되는 외부 URL이 생성된다. 이 URL을 Webhooks에서 입력한다.





    6.2 Github에서 Webhooks 설정

    github에서 프로젝트 저장소로 이동한다. 오른쪽 상단에 'setting'을 클릭한다.

    Webhooks에서 Payload URL 칸에 위에서 ngrok으로 생성한 URL을 입력하고 끝부분에 /github-webhook/을 붙여준다.


    http://c0c38b23.ngrok.io/github-webhook/github-webhook/





    7. 자동 빌드 및 배포 확인

    여기까지 설정이 완료되면 이클립스에서 프로젝트 코딩 후 커밋 및 푸쉬 진행할 경우 젠킨스가 자동으로 변경사항을 포함해서 프로젝트를 빌드하고 톰캣에 배포한다.