Enterprise Java web Deployment Strategy
-
Upload
sukjin-yun -
Category
Engineering
-
view
211 -
download
7
Transcript of Enterprise Java web Deployment Strategy
엔터프라이즈빌드자동화를위한 Gradle
https://www.facebook.com/thecodinglive
Who am i
BUILD
compile
assembling
Test
Delivery
소프트웨어대안모델들
• 적응형모델
• 결정테이블
• 의존성네트워크
• 생성규칙시스템
• 상태머신
모든자동화빌드도구의근간이되는모델
의존성네트워크
자동화
예약자동화 유발자동화
지시자동화
지시자동화가받쳐주면나머지적용은따라온다.
지시자동화
Gradle Task, Ant Task , Maven Phase
패키징누구나같은결과를얻는다
DEPLOYMENT PIPELINE FOR CI
Gradle Spock GEB
빌드자동화도구 BDD 테스트도구 UI 통합자동화테스트도구
DEPLOYMENT PIPELINE FOR CI
Gradle Spock GEB
빌드자동화도구 BDD 테스트도구 UI 통합자동화테스트도구
GRADLE
• GROOVY로만든자동화빌드도구
• 손쉬운멀티프로젝트구성
• 데몬으로사용가능
• 다양한플러그인지원및추가가능
• 레퍼제공
• 프로그래밍친화적설정방식
GRADLE 실행원리
Project 인터페이스
Task 인터페이스
Build.gradle
Task 이름,
클로저
Task 인터페이스
의존관계설정가능
Task 실행
@TaskAction
GRADLE LIFE CYCLE
초기화 설정 실행
GRADLE 초기화Settings.gradle 파일정보를보고프로젝트가서로의존관계를갖는멀티프로젝트인지싱글프로젝트인지판별
build.gradle
파일로드커플
싱글
GRADLE 설정
• 프로젝트인스턴스생성
• 각프로젝트에설정적용
GRADLE 실행BUILD.GRADLE
TaskName
TaskName
TaskName
RUN
GRADLE BULID파일예시 PLUGIN
GRADLE BULID파일예시 REPOSITORY
GRADLE BULID파일예시 TASK
GRADLE MULTI PROJECT
rootProject.name = 'springtobemulti'
include 'HibernateSub','WebAppSub'
springtobemulti
HibernateSub
WebAppSub
공통설정적용가능
BDD를위한테스트도구SPOCK
단위테스트시고민
특히내가만든소스가아닐때
어디서부터테스트를시작해야되나?
테스트를할까말까?
한번에얼만큼테스트해야되나?
테스트이름을어떻게정하지?
테스트가실패하는이유는?
BDD
HTTPS://TWITTER.COM/TASTAPOD
HTTP://DANNORTH.NET/INTRODUCING-BDD/
요구사항에대한정의, 명세 (SPECIFICATION)
GIVEN ( 어떤값이할당되었을때)
WHEN( 이벤트가발생했을때)
THEN ( 결과는 ~ 여야한다.)
의도를표현하기위해서 TEST대신 BEHAVIOUR
SPOCK
• PETER NIEDERWIESER가GROOVY로만든 BDD 프레임워크
SPOCK 설정
• COMPILE "ORG.CODEHAUS.GROOVY:GROOVY-ALL:2.4.1"
• TESTCOMPILE "ORG.SPOCKFRAMEWORK:SPOCK-CORE:1.0-GROOVY-2.4"
SPOCK작성예제형식CLASS ABC EXTENDS SPECIFICATION
테스트이름{
GIVEN:
WHEN:
THEN:
}
SPOCK 사용예시
SPOCK 스타일로SPRING CONTROLLER TEST
GEBhttp://www.gebish.org/
Selenium + groovy Script
웹페이지자동화테스트도구
웹드라이버를 사용해서브라우저를로드후에셀레니움처럼레코딩하지않고스크립트를사용해서 Jquery문법으로페이지요소들을참조해서테스트할수있다.
GEB 의존성설정
GEB 기본스크립트예시
import geb.Browser
Browser.drive(){
go("http://www.hanbit.co.kr/")
$("input", name:'keyword').value('java')
$("input", class:'bInp').click()
}
GEB SPOCK스타일import geb.spock.GebReportingSpec
import spock.lang.Stepwise
@Stepwise
class TeamAddSpecReport extends GebReportingSpec{
def "[Report]Team 추가"(){
given : "team add page"
to TeamAddPage
when: "팀 추가 버튼 클릭"
inputName ="arizona"
inputRating = "3"
submitButton.click()
then:"team list page"
to TeamlistPage
title == "List of teams"
}
}
JENKINS
• JOB 단위로관리할수있는 CI도구
• 빌드자체를직접수행하지않고잡을통해서관리할수있습니다.
• 웹 UI 대시보드화면을가지고있어서사용이편리합니다.
JENKINS + 지시자동화
• 서두에언급했던지시자동화개념을적용해서
젠킨스 UI 가아닌 GRADLE TASK를활용한 JOB제어
GRADLE JENKINS PLUGIN
https://plugins.gradle.org/
buildscript{
repositories{ jcenter() }
dependencies{
classpath 'com.terrafolio:gradle-jenkins-plugin:1.+'
}
}
apply plugin: "com.terrafolio.jenkins"
GRADLE JENKINS PLUGIN 사용예시
젠킨스서버연동설정
젠킨스 JOB 설정
GRADLE JENKINS JOB TASK 실행
GRADLE JENKINS JOB 실행결과
실행주체는누구인가?
• 생성되는것들 JAR, WAR
• 실행되는것들 JVM, WEB APPLICATION CONTAINER
JAR를실행하려면 CLASSPATH에추가되어야하고,
WAR를실행하려면WEB APPLICATION CONTAINER안에배포되어서
CONTEXT가생성되어야함 배포도체계적으로빌드도구를사용해서처리하자
CARGO
Web Application Container
AppApp
App App
원격서버에배포를위한도구
SCP또는 FTP를사용하지않고 Gradle Cargo플러그인을사용해서일관성확보
GRADLE CARGO 설정BUILDSCRIPT{
REPOSITORIES{
JCENTER()
}
DEPENDENCIES{
CLASSPATH 'COM.BMUSCHKO:GRADLE-CARGO-PLUGIN:2.1'
}
}
APPLY PLUGIN: 'COM.BMUSCHKO.CARGO'
GRADLE CARGO 배포
cargo{
containerId ="tomcat8x"
port = 8080
deployable{
context = "teammgmt"
}
remote{
port=8080
username='grayjin'
password='pwd'
hostname='192.168.59.103'
}
}
필요한건오직톰캣뿐
FROM tomcat:8.0.21-jre8
MAINTAINER "grayjin <[email protected]>"
ADD settings.xml /usr/local/tomcat/conf/
ADD tomcat-users.xml /usr/local/tomcat/conf/
테스트용원격톰캣서버인스턴스생성을위한Docker 사용
운영체제이미지전체를사용할필요없고톰캣만별도로사용할수있어서VM보다빠르게환경을구축할수있고운영체제이미지파일을복사할필요가없음
DOCKER
http://slides.com/vincentlee/docker#/6
DOCKER 구성요소Images
Registry
Container
http://slides.com/vincentlee/docker#/14
DOCKER 실행
• DOCKER BUILD –T GRAYJIN/TOMCAT
• DOCKER RUN –P 8080:8080 GRAYJIN/TOMCAT
DOCKER 파일 build
• TO OTHER TIME
• TO OTHER PLACE
• TO OTHER US