까먹지말자. 메모!
CI/CD?
- 애플리케이션 개발 단계를 자동화하여 새로운 코드 통합으로 인한 문제를 해결할 수 있다.
- 빌드, 테스트, 배포 프로세스에 대해 자동화와 모니터링이 가능하다.
CI란? (Continuous Integration)
- 지속적 통합
- 개발한 소스를 특정 시점에 통합(빌드, 테스트 등)하는 것이 아닌, 지속적으로 통합을 진행한다. (자동화 프로세스!)
- 어플리케이션을 변경할 때 자동으로 빌드 및 테스트 가능
- 유명한 CI 툴은 Jenkins 가 있다.
CD란? (Continuous Deploy or Delivery)
- 지속적 배포
- 변경사항을 저장소에서 테스트서버나 운영서버에 자동으로 반영한다.
Travis VS Jenkins
Travis
장점
- 전용 서버가 필요하지 않다. (자체 호스팅)
- github과 연동이 편하다.
단점
- 제한된 옵션 제공
- 느린 속도
- private 유료
Jenkins
장점
- 많은 플러그인 제공
단점
- 별도의 서버가 필요함
- 젠킨스에 대한 관리 필요
간단히 혼자 해보기는 travis가 재미있을 것 같지만, 학습과 실습이 목적이니 Jenkins를 선택한다!
일단 로컬로 도커를 이용해서 연습해보자.
학습목적이니 일단 내장서버를 이용해서 실행해보자
gradlew buildJar 을 사용하려했지만 부트 2.0 이상부터 사용할 수 있는듯하다.
- 실행가능한 jar는 JSP를 지원하지 않는듯하다. war로 변경함.
gradlew bootRepackage 를 이용해서 war를 만들어보자.
Once the spring-boot plugin has been applied to your project it will automatically attempt to rewrite archives to make them executable using the bootRepackage task. You should configure your project to build a jar or war (as appropriate) in the usual way.
// build.gradle 에 다음 내용을 추가해준다. // plugin, 생성할 war명 과 실행할 메인 클래스 명을 넣는다. apply plugin: 'war' ... war { baseName = 'NoN' version = '0.0.1-SNAPSHOT' manifest{ attributes( 'Main-Class': 'com.edu.EduApplication' ) } }
설치과정 메모
도커 설치 중..
설치 후 다음 명령어로 어떤 포트로 실행되고있는 지 볼 수 있다.
물론 Kitematic에서도 확인 가능
중간에 패스워드 입력화면은 Kitematic 로그 자세히 보면 패스워드가 있다. 그걸 입력하자.
못봤다면... 도커에서 비밀번호에서 확인해보자
docker exec -it jenkins /bin/bash cat /var/jenkins_home/secrets/initialAdminPassword
localhost:32819 로 접속 (잘 모를때는 추천 플러그인을 설치해보자)
플러그인들이 모두 설치실패한다?
젠킨스 버전 문제라고한다. 높은 버전으로 변경하자.
docker exec -it -u 0 jenkins bash wget http://updates.jenkins-ci.org/download/war/2.235.1/jenkins.war mv ./jenkins.war /usr/share/jenkins/ chown jenkins:jenkins /usr/share/jenkins/jenkins.war 도커 젠킨스 재시작
새로운 Item 클릭
소스관리 탭에서 자신의 프로젝트 git 주소와 Credentials - Add 자신의 git 정보를 입력한다.
build 유발 - GitHub hook trigger for GITScm polling 체크
빌드 후 배포를 하기위해 다음 작업을 추가한다. Build - Add build step - Execute Shell - 다음 쉘 추가
현재 젠킨스를 도커에 띄웠으므로 접속주소가 localhost 이다. github에서 요청을 보내야한다. 외부에서 로컬에 접속가능하게 하기 위해 ngrok 을 사용한다.
설치 후 다음 명령어로 사용 가능
ngrok http 32819 // 세션만료 없애기 (기본 8시간), AuthToken 은 ngrok 홈페이지에서 로그인 후 받을 수있다. ngrok http 32819 --authtoken={AuthToken}
생성된 주소를 사용하면 된다!!
Github에 이벤트가 있을 때 젠킨스로 요청을 보내야하므로 Webhooks를 설정해준다.
- Gibhub - Settings - Webhooks - Add Webhook
- 젠킨스 주소 뒤에 /github-webhook/ 를 붙여준다. (ngrok에서 생성된 주소 사용하면 됨)
README.md 파일에 build 상태 보여주기
- 젠킨스 플러그인에서 Embeddable Build Status Plugin 다운로드
- Item - Embeddable Build Status - MarkDown 부분 복사 - github README.md 파일에 입력
이제 저장소에 푸시가 있을 때 젠킨스가 자동으로 빌드하는 것을 볼 수 있다. 이를 활용해서 서버에 설치하고 배포작업을 상세화, 단계화하여 적용하면 될 것 같다. (실무에선 어떤 프로세스로 사용할까? ㅠ)
참고
젠킨스, 네이버클라우드 플랫폼
컴투스 ci 구축 사례
젠킨스 연동 글