Enviar búsqueda
Cargar
제 5회 Lisp 세미나 - 클로저 개발팀을 위한 지속적인 통합
•
0 recomendaciones
•
3,848 vistas
NAVER D2
Seguir
클로저 개발팀을 대상으로 하여 데이터베이스, 테스트, 배포 등의 지속적인 통합 설정 및 경험을 공유합니다.
Leer menos
Leer más
Software
Denunciar
Compartir
Denunciar
Compartir
1 de 37
Descargar ahora
Descargar para leer sin conexión
Recomendados
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010
devCAT Studio, NEXON
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
정석 양
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
기동 이
Airflow를 이용한 데이터 Workflow 관리
Airflow를 이용한 데이터 Workflow 관리
YoungHeon (Roy) Kim
Node.js 시작하기
Node.js 시작하기
Huey Park
[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트
[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트
Ji-Woong Choi
Python server-101
Python server-101
Huey Park
Node.js 현재와 미래
Node.js 현재와 미래
JeongHun Byeon
Recomendados
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010
devCAT Studio, NEXON
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
정석 양
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
기동 이
Airflow를 이용한 데이터 Workflow 관리
Airflow를 이용한 데이터 Workflow 관리
YoungHeon (Roy) Kim
Node.js 시작하기
Node.js 시작하기
Huey Park
[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트
[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트
Ji-Woong Choi
Python server-101
Python server-101
Huey Park
Node.js 현재와 미래
Node.js 현재와 미래
JeongHun Byeon
[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍
NAVER D2
Leadweb Nodejs
Leadweb Nodejs
근호 최
[1A4]자바스크립트 라이브러리 개발 운영 경험기
[1A4]자바스크립트 라이브러리 개발 운영 경험기
NAVER D2
[243]kaleido 노현걸
[243]kaleido 노현걸
NAVER D2
GraphQL overview
GraphQL overview
기동 이
GraphQL overview #2
GraphQL overview #2
기동 이
What is the meteor?
What is the meteor?
Peter YoungSik Yun
도커(Docker) 메트릭스 & 로그 수집
도커(Docker) 메트릭스 & 로그 수집
Daegwon Kim
[H3 2012] 내컴에선 잘되던데? - vagrant로 서버와 동일한 개발환경 꾸미기
[H3 2012] 내컴에선 잘되던데? - vagrant로 서버와 동일한 개발환경 꾸미기
KTH, 케이티하이텔
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
Sumin Byeon
[244] 분산 환경에서 스트림과 배치 처리 통합 모델
[244] 분산 환경에서 스트림과 배치 처리 통합 모델
NAVER D2
이기종 멀티코어 기반의 Open cv 응용 사례 및 효율적인 어플리케이션 디자인
이기종 멀티코어 기반의 Open cv 응용 사례 및 효율적인 어플리케이션 디자인
Seunghwa Song
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
beom kyun choi
Big query at GDG Korea Cloud meetup
Big query at GDG Korea Cloud meetup
Jude Kim
닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기
흥배 최
Docker (Compose) 활용 - 개발 환경 구성하기
Docker (Compose) 활용 - 개발 환경 구성하기
raccoony
Docker 기본 및 Docker Swarm을 활용한 분산 서버 관리 A부터 Z까지 [전체모드에서 봐주세요]
Docker 기본 및 Docker Swarm을 활용한 분산 서버 관리 A부터 Z까지 [전체모드에서 봐주세요]
David Lee
[121]네이버 효과툰 구현 이야기
[121]네이버 효과툰 구현 이야기
NAVER D2
20141229 dklee docker
20141229 dklee docker
DK Lee
Puppet과 자동화된 시스템 관리
Puppet과 자동화된 시스템 관리
Keon Ahn
제 5회 Lisp 세미나 - Graphics Programming in Clojure
제 5회 Lisp 세미나 - Graphics Programming in Clojure
NAVER D2
core.logic (Clojure)
core.logic (Clojure)
Seonho Kim
Más contenido relacionado
La actualidad más candente
[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍
NAVER D2
Leadweb Nodejs
Leadweb Nodejs
근호 최
[1A4]자바스크립트 라이브러리 개발 운영 경험기
[1A4]자바스크립트 라이브러리 개발 운영 경험기
NAVER D2
[243]kaleido 노현걸
[243]kaleido 노현걸
NAVER D2
GraphQL overview
GraphQL overview
기동 이
GraphQL overview #2
GraphQL overview #2
기동 이
What is the meteor?
What is the meteor?
Peter YoungSik Yun
도커(Docker) 메트릭스 & 로그 수집
도커(Docker) 메트릭스 & 로그 수집
Daegwon Kim
[H3 2012] 내컴에선 잘되던데? - vagrant로 서버와 동일한 개발환경 꾸미기
[H3 2012] 내컴에선 잘되던데? - vagrant로 서버와 동일한 개발환경 꾸미기
KTH, 케이티하이텔
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
Sumin Byeon
[244] 분산 환경에서 스트림과 배치 처리 통합 모델
[244] 분산 환경에서 스트림과 배치 처리 통합 모델
NAVER D2
이기종 멀티코어 기반의 Open cv 응용 사례 및 효율적인 어플리케이션 디자인
이기종 멀티코어 기반의 Open cv 응용 사례 및 효율적인 어플리케이션 디자인
Seunghwa Song
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
beom kyun choi
Big query at GDG Korea Cloud meetup
Big query at GDG Korea Cloud meetup
Jude Kim
닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기
흥배 최
Docker (Compose) 활용 - 개발 환경 구성하기
Docker (Compose) 활용 - 개발 환경 구성하기
raccoony
Docker 기본 및 Docker Swarm을 활용한 분산 서버 관리 A부터 Z까지 [전체모드에서 봐주세요]
Docker 기본 및 Docker Swarm을 활용한 분산 서버 관리 A부터 Z까지 [전체모드에서 봐주세요]
David Lee
[121]네이버 효과툰 구현 이야기
[121]네이버 효과툰 구현 이야기
NAVER D2
20141229 dklee docker
20141229 dklee docker
DK Lee
Puppet과 자동화된 시스템 관리
Puppet과 자동화된 시스템 관리
Keon Ahn
La actualidad más candente
(20)
[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍
Leadweb Nodejs
Leadweb Nodejs
[1A4]자바스크립트 라이브러리 개발 운영 경험기
[1A4]자바스크립트 라이브러리 개발 운영 경험기
[243]kaleido 노현걸
[243]kaleido 노현걸
GraphQL overview
GraphQL overview
GraphQL overview #2
GraphQL overview #2
What is the meteor?
What is the meteor?
도커(Docker) 메트릭스 & 로그 수집
도커(Docker) 메트릭스 & 로그 수집
[H3 2012] 내컴에선 잘되던데? - vagrant로 서버와 동일한 개발환경 꾸미기
[H3 2012] 내컴에선 잘되던데? - vagrant로 서버와 동일한 개발환경 꾸미기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[244] 분산 환경에서 스트림과 배치 처리 통합 모델
[244] 분산 환경에서 스트림과 배치 처리 통합 모델
이기종 멀티코어 기반의 Open cv 응용 사례 및 효율적인 어플리케이션 디자인
이기종 멀티코어 기반의 Open cv 응용 사례 및 효율적인 어플리케이션 디자인
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
Big query at GDG Korea Cloud meetup
Big query at GDG Korea Cloud meetup
닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기
Docker (Compose) 활용 - 개발 환경 구성하기
Docker (Compose) 활용 - 개발 환경 구성하기
Docker 기본 및 Docker Swarm을 활용한 분산 서버 관리 A부터 Z까지 [전체모드에서 봐주세요]
Docker 기본 및 Docker Swarm을 활용한 분산 서버 관리 A부터 Z까지 [전체모드에서 봐주세요]
[121]네이버 효과툰 구현 이야기
[121]네이버 효과툰 구현 이야기
20141229 dklee docker
20141229 dklee docker
Puppet과 자동화된 시스템 관리
Puppet과 자동화된 시스템 관리
Destacado
제 5회 Lisp 세미나 - Graphics Programming in Clojure
제 5회 Lisp 세미나 - Graphics Programming in Clojure
NAVER D2
core.logic (Clojure)
core.logic (Clojure)
Seonho Kim
동시성 프로그래밍 하기 좋은 Clojure
동시성 프로그래밍 하기 좋은 Clojure
Eunmin Kim
Re frame
Re frame
Sang-Kyu Park
Dragon: A Distributed Object Storage at Yahoo! JAPAN (WebDB Forum 2017)
Dragon: A Distributed Object Storage at Yahoo! JAPAN (WebDB Forum 2017)
Yahoo!デベロッパーネットワーク
Dragon: A Distributed Object Storage at Yahoo! JAPAN (WebDB Forum 2017 / E...
Dragon: A Distributed Object Storage at Yahoo! JAPAN (WebDB Forum 2017 / E...
Yahoo!デベロッパーネットワーク
Clojure Monad
Clojure Monad
Eunmin Kim
Destacado
(7)
제 5회 Lisp 세미나 - Graphics Programming in Clojure
제 5회 Lisp 세미나 - Graphics Programming in Clojure
core.logic (Clojure)
core.logic (Clojure)
동시성 프로그래밍 하기 좋은 Clojure
동시성 프로그래밍 하기 좋은 Clojure
Re frame
Re frame
Dragon: A Distributed Object Storage at Yahoo! JAPAN (WebDB Forum 2017)
Dragon: A Distributed Object Storage at Yahoo! JAPAN (WebDB Forum 2017)
Dragon: A Distributed Object Storage at Yahoo! JAPAN (WebDB Forum 2017 / E...
Dragon: A Distributed Object Storage at Yahoo! JAPAN (WebDB Forum 2017 / E...
Clojure Monad
Clojure Monad
Similar a 제 5회 Lisp 세미나 - 클로저 개발팀을 위한 지속적인 통합
Scala for play
Scala for play
Brandon Choi
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14
명신 김
공간정보아카데미 - Day1 오픈소스개발 일반
공간정보아카데미 - Day1 오픈소스개발 일반
BJ Jang
Web Analytics at Scale with Elasticsearch @ naver.com - Part 2 - Lessons Learned
Web Analytics at Scale with Elasticsearch @ naver.com - Part 2 - Lessons Learned
Jungsu Heo
Basic git-commands
Basic git-commands
insanehong Kim
TOAST Meetup2015 - 구름 Cloud IDE (류성태)
TOAST Meetup2015 - 구름 Cloud IDE (류성태)
TOAST_NHNent
[오픈소스컨설팅]Java Performance Tuning
[오픈소스컨설팅]Java Performance Tuning
Ji-Woong Choi
Kubernetes on GCP
Kubernetes on GCP
Daegeun Kim
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기
Heo Seungwook
[232] 성능어디까지쥐어짜봤니 송태웅
[232] 성능어디까지쥐어짜봤니 송태웅
NAVER D2
Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나
JeongHun Byeon
[FOSS4G Korea 2016] Workshop - Advanced GeoServer
[FOSS4G Korea 2016] Workshop - Advanced GeoServer
MinPa Lee
[T아카데미] 비개발자를 위한 Git과 Github Page 블로그 만들기
[T아카데미] 비개발자를 위한 Git과 Github Page 블로그 만들기
Subin An
Cygnus unit test
Cygnus unit test
Sung Jae Park
[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?
NAVER D2
The Future of .NET and C#
The Future of .NET and C#
명신 김
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
현철 조
[OpenInfra Days Korea 2018] (Track 4) - Grafana를 이용한 OpenStack 클라우드 성능 모니터링
[OpenInfra Days Korea 2018] (Track 4) - Grafana를 이용한 OpenStack 클라우드 성능 모니터링
OpenStack Korea Community
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
beom kyun choi
Fluentd with MySQL
Fluentd with MySQL
I Goo Lee
Similar a 제 5회 Lisp 세미나 - 클로저 개발팀을 위한 지속적인 통합
(20)
Scala for play
Scala for play
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14
공간정보아카데미 - Day1 오픈소스개발 일반
공간정보아카데미 - Day1 오픈소스개발 일반
Web Analytics at Scale with Elasticsearch @ naver.com - Part 2 - Lessons Learned
Web Analytics at Scale with Elasticsearch @ naver.com - Part 2 - Lessons Learned
Basic git-commands
Basic git-commands
TOAST Meetup2015 - 구름 Cloud IDE (류성태)
TOAST Meetup2015 - 구름 Cloud IDE (류성태)
[오픈소스컨설팅]Java Performance Tuning
[오픈소스컨설팅]Java Performance Tuning
Kubernetes on GCP
Kubernetes on GCP
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기
[232] 성능어디까지쥐어짜봤니 송태웅
[232] 성능어디까지쥐어짜봤니 송태웅
Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나
[FOSS4G Korea 2016] Workshop - Advanced GeoServer
[FOSS4G Korea 2016] Workshop - Advanced GeoServer
[T아카데미] 비개발자를 위한 Git과 Github Page 블로그 만들기
[T아카데미] 비개발자를 위한 Git과 Github Page 블로그 만들기
Cygnus unit test
Cygnus unit test
[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?
The Future of .NET and C#
The Future of .NET and C#
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[OpenInfra Days Korea 2018] (Track 4) - Grafana를 이용한 OpenStack 클라우드 성능 모니터링
[OpenInfra Days Korea 2018] (Track 4) - Grafana를 이용한 OpenStack 클라우드 성능 모니터링
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
Fluentd with MySQL
Fluentd with MySQL
Más de NAVER D2
[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다
NAVER D2
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
NAVER D2
[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기
NAVER D2
[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발
NAVER D2
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
NAVER D2
[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A
NAVER D2
[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기
NAVER D2
[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning
NAVER D2
[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications
NAVER D2
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
NAVER D2
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
NAVER D2
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
NAVER D2
[224]네이버 검색과 개인화
[224]네이버 검색과 개인화
NAVER D2
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
NAVER D2
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
NAVER D2
[213] Fashion Visual Search
[213] Fashion Visual Search
NAVER D2
[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화
NAVER D2
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
NAVER D2
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
NAVER D2
[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?
NAVER D2
Más de NAVER D2
(20)
[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기
[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A
[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기
[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning
[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[224]네이버 검색과 개인화
[224]네이버 검색과 개인화
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[213] Fashion Visual Search
[213] Fashion Visual Search
[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?
제 5회 Lisp 세미나 - 클로저 개발팀을 위한 지속적인 통합
1.
클로저 개발팀을 위한 지속적인 통합 김만명 1 / 37
2.
소개 https://youtu.be/wiRmVsTarAI?t=3m22s https://github.com/infokraft 2 / 37
3.
무엇을 발표할까? CI(Continuous Integration; 지속적인 통합) 서비스 도입 과정과 결과 클로저 프로젝트 경험 3 / 37
4.
최근 프로젝트 https://github.com/infokraft/toxfree/graphs/commit-activity 서버: Ring, Jetty, Compojure, MySQL 클라이언트: Reagent, re-frame, Datatables 플랫폼: Github, AWS 4 / 37
5.
CI 도입 이유 배포가 복잡 한 사람이 배포를 도맡는 현상 버그 때문에 개발이 지연되는 경험 5 / 37
6.
CI 선택 Github에서 많이 사용하는 CI 서비스 Travis CI : https://travis-ci.com/plans Circle CI : https://circleci.com/pricing/ 6 / 37
7.
7 / 37
8.
8 / 37
9.
9 / 37
10.
10 / 37
11.
11 / 37
12.
12 / 37
13.
13 / 37
14.
알림 1. 이메일 2. 채팅 지원 서비스 사용예 3. 상태 배지 사용예 4. 웹훅(Webhook) 14 / 37
15.
CircleCI 설정 수정 circle.yml https://circleci.com/docs/manually/ 15 / 37
16.
데이터베이스 circle.yml database: override: - mysql -u
root -vvf < create-test-db.sql create-test-db.sql CREATE DATABASE `toxfree_test` character set utf8; 16 / 37
17.
환경 설정 파일 circle.yml checkout: post: - cp ./profiles-default.clj
./profiles.clj profiles-default.clj {:profiles/dev {:env {:db {:subprotocol "mysql" :subname "//localhost:3306/toxfree" :user "root" :password "" :useSSL false}}}} 17 / 37
18.
테스트 circle.yml test: override: - lein trampoline
test - lein doo phantom test once post: - lein clean - lein compile - lein cljsbuild once dev 18 / 37
19.
테스트 지속적인 통합에서 테스트의 역할 서버 HTTP 요청 -->
--> --> 핸들러 쿼리단 DB HTTP 응답 <-- <-- <-- 단위 테스트: 핸들러 테스트, DB 테스트 우리가 테스트하고 싶은 것: 어떤 요청을 보내면 어떤 응답이 오나? 19 / 37
20.
테스트 지속적인 통합에서 테스트의 역할 서버 HTTP 요청 -->
--> --> 핸들러 쿼리단 DB HTTP 응답 <-- <-- <-- 단위 테스트: 핸들러 테스트, DB 테스트 통합 테스트: HTTP 요청과 응답을 이용해 서버단 테스트 20 / 37
21.
routing_test.clj (deftest depts-routing (with-test-db (let [{dept-id
"dept-id" :as create-res} (request :post "/dept/create" {"dept" "연구1실"})] (testing "/dept/create" (is (= {"dept-id" dept-id, "dept" "연구1실"} create-res))) (testing "/depts/read" (is (= [["dept-id" "dept"] [dept-id "연구1실"]] (request :get "/depts/read")))) (testing "/dept/update/:dept-id" (is (= {"dept-id" dept-id, "dept" "연구6실"} (request :post (str "/dept/update/" dept-id) {"dept" "연구6실"})))) (testing "update 확인" (is (= [["dept-id" "dept"] [dept-id "연구6실"]] (request :get "/depts/read")))) (testing "/dept/delete/:dept-id" (is (= dept-id (request :delete (str "/dept/delete/" dept-id))))) (testing "delete 확인" (is (= [["dept-id" "dept"]] (request :get "/depts/read"))))))) 21 / 37
22.
routing_test.clj (deftest depts-routing (with-test-db (let [{dept-id
"dept-id" :as create-res} (request :post "/dept/create" {"dept" "연구1실"})] (testing "/dept/create" (is (= {"dept-id" dept-id, "dept" "연구1실"} create-res))) (testing "/depts/read" (is (= [["dept-id" "dept"] [dept-id "연구1실"]] (request :get "/depts/read")))) (testing "/dept/update/:dept-id" (is (= {"dept-id" dept-id, "dept" "연구6실"} (request :post (str "/dept/update/" dept-id) {"dept" "연구6실"})))) (testing "update 확인" (is (= [["dept-id" "dept"] [dept-id "연구6실"]] (request :get "/depts/read")))) (testing "/dept/delete/:dept-id" (is (= dept-id (request :delete (str "/dept/delete/" dept-id))))) (testing "delete 확인" (is (= [["dept-id" "dept"]] (request :get "/depts/read"))))))) 테스트 DB 를 대상으로 실행 한 테스트가 끝나면 테스트 DB 원상복구 22 / 37
23.
routing_test.clj (deftest depts-routing (with-test-db (let [{dept-id
"dept-id" :as create-res} (request :post "/dept/create" {"dept" "연구1실"})] (testing "/dept/create" (is (= {"dept-id" dept-id, "dept" "연구1실"} create-res))) (testing "/depts/read" (is (= [["dept-id" "dept"] [dept-id "연구1실"]] (request :get "/depts/read")))) (testing "/dept/update/:dept-id" (is (= {"dept-id" dept-id, "dept" "연구6실"} (request :post (str "/dept/update/" dept-id) {"dept" "연구6실"})))) (testing "update 확인" (is (= [["dept-id" "dept"] [dept-id "연구6실"]] (request :get "/depts/read")))) (testing "/dept/delete/:dept-id" (is (= dept-id (request :delete (str "/dept/delete/" dept-id))))) (testing "delete 확인" (is (= [["dept-id" "dept"]] (request :get "/depts/read"))))))) (defmacro with-test-db [& body] `(jdbc/with-db-transaction [t-conn# test-db*] (jdbc/db-set-rollback-only! t-conn#) (with-redefs [db* t-conn#] ~@body))) 23 / 37
24.
routing_test.clj (deftest depts-routing (with-test-db (let [{dept-id
"dept-id" :as create-res} (request :post "/dept/create" {"dept" "연구1실"})] (testing "/dept/create" (is (= {"dept-id" dept-id, "dept" "연구1실"} create-res))) (testing "/depts/read" (is (= [["dept-id" "dept"] [dept-id "연구1실"]] (request :get "/depts/read")))) (testing "/dept/update/:dept-id" (is (= {"dept-id" dept-id, "dept" "연구6실"} (request :post (str "/dept/update/" dept-id) {"dept" "연구6실"})))) (testing "update 확인" (is (= [["dept-id" "dept"] [dept-id "연구6실"]] (request :get "/depts/read")))) (testing "/dept/delete/:dept-id" (is (= dept-id (request :delete (str "/dept/delete/" dept-id))))) (testing "delete 확인" (is (= [["dept-id" "dept"]] (request :get "/depts/read"))))))) (use-fixtures :once (fn [f] (init/migrate test-db*) (f))) 24 / 37
25.
routing_test.clj (deftest depts-routing (with-test-db (let [{dept-id
"dept-id" :as create-res} (request :post "/dept/create" {"dept" "연구1실"})] (testing "/dept/create" (is (= {"dept-id" dept-id, "dept" "연구1실"} create-res))) (testing "/depts/read" (is (= [["dept-id" "dept"] [dept-id "연구1실"]] (request :get "/depts/read")))) (testing "/dept/update/:dept-id" (is (= {"dept-id" dept-id, "dept" "연구6실"} (request :post (str "/dept/update/" dept-id) {"dept" "연구6실"})))) (testing "update 확인" (is (= [["dept-id" "dept"] [dept-id "연구6실"]] (request :get "/depts/read")))) (testing "/dept/delete/:dept-id" (is (= dept-id (request :delete (str "/dept/delete/" dept-id))))) (testing "delete 확인" (is (= [["dept-id" "dept"]] (request :get "/depts/read"))))))) 19개의 테스트, 94개의 단정문 25 / 37
26.
routing_test.clj (deftest depts-routing (with-test-db (let [{dept-id
"dept-id" :as create-res} (request :post "/dept/create" {"dept" "연구1실"})] (testing "/dept/create" (is (= {"dept-id" dept-id, "dept" "연구1실"} create-res))) (testing "/depts/read" (is (= [["dept-id" "dept"] [dept-id "연구1실"]] (request :get "/depts/read")))) (testing "/dept/update/:dept-id" (is (= {"dept-id" dept-id, "dept" "연구6실"} (request :post (str "/dept/update/" dept-id) {"dept" "연구6실"})))) (testing "update 확인" (is (= [["dept-id" "dept"] [dept-id "연구6실"]] (request :get "/depts/read")))) (testing "/dept/delete/:dept-id" (is (= dept-id (request :delete (str "/dept/delete/" dept-id))))) (testing "delete 확인" (is (= [["dept-id" "dept"]] (request :get "/depts/read"))))))) 서버 수정할 때 안정감 최신 상태의 문서 26 / 37
27.
테스트 클라이언트 --> --> -->
HTTP 요청 브라우저 DOM 처리단 <-- <-- <-- HTTP 응답 27 / 37
28.
테스트 클라이언트 --> --> -->
HTTP 요청 브라우저 DOM 처리단 <-- <-- <-- HTTP 응답 단위 테스트: 처리단에서 변환로직 10개의 테스트, 49개의 단정문 28 / 37
29.
테스트 클라이언트 --> --> -->
HTTP 요청 브라우저 DOM 처리단 <-- <-- <-- HTTP 응답 클라이언트 수정시 안정감 29 / 37
30.
배포 개발 절차 Git 협업 방법 https://github.com/infokraft/toxfree/pull/138 https://github.com/infokraft/toxfree/pull/261 마스터 브랜치에 머지되면 테스트 서버에 바로 배포해서 확인 30 / 37
31.
배포 다양한 배포 방법 https://circleci.com/docs/ 31 / 37
32.
배포 SSH 키 세팅 32 / 37
33.
배포 테스트 서버 circle.yml deployment: master: branch: master commands: - lein
clean - lein uberjar 2> error.log - scp target/toxfree-0.1.0-SNAPSHOT-standalone.jar ubuntu@111.111.111.111:~/target - ssh ubuntu@111.111.111.111 "sudo pkill java;sudo java -jar target/toxfree-0.1.0-SNAPSHOT-stand alone.jar 80 &> log/log-$CIRCLE_BUILD_NUM.txt &" 마스터 브랜치에 커밋이 되면 배포 $CIRCLE_BUILD_NUM 테스트 서버에서 확인 33 / 37
34.
배포 릴리즈 서버 circle.yml deployment: release: tag: /release-.*/ commands: - lein
clean - lein uberjar 2> error.log - scp target/toxfree-0.1.0-SNAPSHOT-standalone.jar ubuntu@222.222.222.222:~/target/toxfree-0.1.0 -SNAPSHOT-standalone-$CIRCLE_TAG.jar - ssh ubuntu@222.222.222.222 "sudo pkill java;sudo java -jar target/toxfree-0.1.0-SNAPSHOT-stand alone-$CIRCLE_TAG.jar 80 $CIRCLE_TAG &> log/log-$CIRCLE_TAG.txt &" release-* 태그가 푸시되면 배포 $CIRCLE_TAG 34 / 37
35.
CircleCI 메모리 문제 배포에서 빌드 깨지는 문제 https://circleci.com/gh/infokraft/toxfree/402 참고문서 https://circleci.com/docs/oom/ 해결 circle.yml machine: environment: _JAVA_OPTIONS: "-Xms512m -Xmx1024m" 35 / 37
36.
느낀점 쉬운 배포 오류를 빨리 발견 엔드 투 엔드(End to End) 테스트 기대: 참고 팀을 위한 툴? 36 / 37
37.
감사합니다 37 / 37
Descargar ahora