본문 바로가기

WEB etc

[Jenkins] Github 프로젝트 연동, webhook, 자동배포 (3)

설정이 완료되었으면 마지막으로, github 프로젝트를 jenkins에서 관리하고, push가 발생하면 빌드와 배포까지 진행하는 작업을 합니다. 

환경

  • 개발 Windows 10  / 배포 Ubuntu 16.04 LTS
  • Maven 3.6.0
  • Git 2.20.1
  • JDK 8
  • Tomcat 7
  • Github
  • Jenkins 2.150.2

설정

저는 깃헙에 테스트용 프로젝트를 하나 올려두었습니다. 
각자 깃헙에 올라가있는 적당한 프로젝트를 하나 고르세요. 

젠킨스 메인화면에서, New Item 메뉴를 선택합니다.
Freestyle project 를 선택하시고 아이템명을 넣으세요. 


GitHub project에 체크하신 뒤, 프로젝트 url을 넣습니다. 

https://github.com/유저네임/프로젝트명 입니다. 


소스코드 관리 탭에서 Git 을 선택합니다.

Repository URL에는 clone에 쓰이는 url을 넣습니다. 깃헙 프로젝트에 가시면 clone or download 에서 주소를 복사할 수 있습니다.

https://github.com/유저네임/프로젝트명.git 입니다. 


그리고 Credentials에서 Add 버튼을 누릅니다. 

ID/PW 방식


여기서 아이디/패스워드로 접근하실 분은 kind를 아래와 같이 Username with password로 선택하시고

username에는 깃헙 아이디를, password에는 깃헙 패스워드를 입력하시면 됩니다. ID는 구분용이니 아무거나 쓰세요. 

로그인할 때 이메일을 사용한다구 아이디에 이메일 주소 통짜로 쓰시면 에러가 납니다. (제 이야기 맞구여)

깃헙 profile에 들어가면 프로필사진 아래 볼드처리된 것이 본인의 아이디입니다. 

ssh키 방식

보안상 ssh 키를 사용하실 분들은 아래 명령어로 키를 생성하세요. (윈도우 환경이시면 bash 등을 사용하시면 돼요)

ssh-keygen -t rsa -f 파일명


passphrase 를 입력하라고 하면 그냥 엔터 누르시면 됩니다. 


그럼 확장자없는 파일 하나, .pub 확장자를 가진 파일 하나가 생성됩니다. 

확장자없는 파일에는 개인키가 들어있고 .pub 파일에는 공개키가 들어있습니다. 


아까 Credentials Add 를 눌렀을 때로 돌아가, Kind를 SSH Username with private key 로 설정하시고 아래와 같이 개인키를 붙여넣으세요.


개인키가 등록되었으면 github 프로젝트로 들어가 프로젝트의 Settings - Deploy Keys 에서 Add deploy key 를 선택합니다.


제목을 적당히 입력하고, Key 부분에는 아까 생성한 공개키 (.pub 파일) 을 복붙합니다.

Allow write access 체크는 푸시고, Add key 하세요. 


제대로 생성이 되었습니다.


ID/PW 방식이든 SSH 키 방식이든간에 이제 jenkins로 github 프로젝트 코드를 가져오고 빌드를 진행할 수 있습니다. 

Webhook 설정

github에 push가 발생하면 jenkins에 알리기 위해서 webhook 설정을 하겠습니다. 

* webhook ?
웹훅은 ( web callback 혹은 HTTP push API 라고도 불림) 앱이 다른 앱에 실시간 정보를 제공하는 방법입니다. 웹훅은 실시간으로 데이터를 가져오기 위해 꽤 자주 polling 해야 하는 전형적인 API와 달리 다른 앱에 데이터를 즉시 전달하므로 데이터를 즉시 얻을 수 있습니다. 
...
웹훅의 유일한 단점은 처음에 웹훅을 설정하는 어려움입니다. 웹훅은 API 스펙에 해당하므로 "역방향 API" 라고도 하며 따라서 웹훅을 사용하기 위해선 API를 설계해야 합니다. 웹훅은 HTTP 요청을 당신의 어플리케이션에 보낼 것입니다. (일반적으로 POST 방식) 

새창을 여시고, 젠킨스 메인에서 Jenkins 관리 - 시스템 설정으로 가 Jenkins Location을 수정해주세요.
건드리지 않았다면 localhost 로 되어있을 텐데요. 외부에서 접근할 수 있는 도메인이나 ip를 입력하셔야 합니다. 


아까의 깃허브 프로젝트 설정에서, Webhook 메뉴로 가 add webhook 버튼을 누릅니다. 

Payload URL에는 Jenkins 주소/github-webhook/ 을 입력합니다.

* 마지막에 / 를 빼먹으시면 안됩니다. 


나머지는 기본값으로 두고 Add webhook 으로 완료합니다.


다시 젠킨스의 Item 생성 하던 곳으로 돌아갑시다. 

빌드 유발 탭에서 GitHub hook trigger for GITScm polling을 선택합니다. 

이것으로 github에 push 이벤트가 발생하면 자동으로 빌드가 이루어집니다. 

Build 탭으로 내려갑니다.

저는 Maven 프로젝트이기 때문에 Add build step 에서 Invoke top-level Maven targets 를 선택하겠습니다.

Maven Version은 이전 포스트에서 등록한 Global Tool Configuration - Maven 을 가져오게 됩니다. 

아래와 같이 채워 주세요.

자동배포

마지막으로 빌드 후 조치 탭으로 내려갑니다. 

아래와 같이 채워넣으시고, Add Container에서 자신의 환경에 맞는 것을 선택합니다.

저는 tomcat 7 을 선택했습니다. 


배포서버의 톰캣 경로/conf/tomcat-users.xml 에 아래 role과 user를 추가하세요.

그리고 위에서 Credentials Add를 하시고 추가한 user의 name과 password를 입력합니다.

<role rolename="manager-gui"/>

<role rolename="manager-script"/>

<role rolename="manager-status"/>

<user name="아이디" password="패스워드" roles="manager-gui,manager-script,manager-status" />


그리고 배포할 Tomcat URL을 입력합니다. 

* Context path 에서 /컨텍스트명 으로 입력하셨으면 URL의 마지막에 / 은 생략하세요. // 로 인식해 에러가 납니다. 


이제 저장합니다! 제대로 설정이 되었다면 아까 추가한 깃허브 Webhook으로 들어갔을 때 아래와 같이 뜹니다.

에러가 나면 무슨 에러인지도 알려주니 확인하세요. (403, 500 등)


저는 간단하게 텍스트만 수정하고 push 해보겠습니다. 


push가 완료되면 자동으로 빌드 대기 목록에 우리의 item이 들어가는 것을 확인할 수 있습니다.


조금만 기다리면 자동으로 빌드를 진행한다구요?


콘솔을 확인해보시면 Github의 push로 빌드가 유발되었음을 확인할 수 있습니다. 


자동배포까지 잘 되었네요! 고생하셨습니다.