studybook
  • Introduction
  • 실무 하며 깨닫는 부분 정리
    • 옵션에 대해서
    • 코드 작성의 순서
    • 자바 프로그램에 문제가 생겼다면
    • 장애 대처법
  • Logstash, Beats 정리
  • Zookeeper 정리
  • Message Queue 정리
    • RabbitMQ 삽질
  • Java 관련 정리
    • Java Primitive Wrapper class
    • Java NIO
    • Java8 Double colon operator
    • Effective Java
      • 4장
      • 5장
      • 6장 - Enum, Annotation
      • 7장 - Method
      • 8장 - 프로그래밍 일반
      • 9장 - Exception
    • Java8 Lambda expression
    • JDBC
    • Linux에서 WatchService 이상동작
  • Spring 관련 정리
    • Spring Bean init, destroy 순서
    • Spring Async Controller
    • Spring Executable jar 웹 개발 및 배포
    • Spring Boot Font 배포 에러
    • Spring AOP
      • Spring AOP로 모든 Request 로그 남기기
    • Spring Cache
    • Spring Cloud
      • Consul로 spring 설정 관리하기
    • Spring Test
      • Spring Test DirtiesContext
      • Spring Test MockBean, SpyBean
      • Spring Test Dynamic @Scheduled
    • Spring JDBC
    • Spring Validation
    • Spring Transaction Management
      • Spring with JTA 삽질
    • Spring에서 효율적으로 Static resource 관리하기
    • Zuul을 사용해서 Spring Reverse proxy 만들기
    • Spring Security
    • 스프링 어노테이션이 안 먹힐 때 의심해볼만한 것
    • Spring Data
    • Spring Webflux
      • Tobi 강연
  • 코드 리팩토링
    • 한번에 하나씩
  • 지속적 통합 (CI)
    • Jenkins pipeline 삽질기
  • Log Aggregator 정리
    • Flume 테스트
    • Fluentd 테스트
  • Web Socket 정리
  • Akka
    • Actor 모델
    • Supervision
  • IE 8 대응 정리
  • 함수형 프로그래밍
    • 모나드
  • Netty
    • Netty 기본 예제
    • Netty 주요 특징
    • Netty 부트스트랩
    • Netty 채널 파이프라인, 코덱
    • Netty 이벤트 모델
    • Netty 바이트 버퍼
  • 스칼라 관련 정리
    • Maven으로 컴파일하기
    • Scala def 괄호 여부의 차이
    • 스칼라 function, method 차이점
    • ScalaTest와 Spring 연동하기
    • Programming in Scala
  • J2S 컨퍼런스
  • Android
    • 테스트
    • NDK
  • DDOS
  • HTTP
  • HttpClient
  • Container
    • Image 개요
    • cri-o
    • kata containers
    • Open Container Initiative Image
    • Buildkit
  • Github pages
  • Static Website
  • Webhook
  • Service Discovery Tools
    • Etcd
    • Eureka
    • Consul
      • ACL
    • 비교
  • React
    • JSX
    • React Element
    • Components, Props
    • State, Lifecycle
    • Handling Event
    • Flux
  • Vagrant
    • SSH 접속
  • Linux
    • Systemd
    • Alternatives
  • Messaging protocols
    • XMPP
    • AMQP
  • Windows
    • Windows10 내장 우분투에 ssh 클라이언트로 접속하기
    • Windows10 Hyper-V와 Virtual Box가 충돌을 일으켰을 때
    • Hyper-V 기반 docker에서 Shared Drives 설정 실패할 때
    • 윈도우 개발환경 설정
    • Docker desktop 없이 docker 환경 세팅하기
    • UWP 앱을 항상 관리자권한으로 실행하는 바로가기 만들기
  • Spring camp 2017
    • Project Reactive
    • 이벤트 소싱
    • CQRS
  • Spring webflux
  • 리액티브 프로그래밍
  • Linux Settings
    • 홈서버 백업 및 복구기
    • 홈서버 트러블슈팅
  • Kubernetes
    • k3s 설치 및 삽질
    • pod resources
    • Argo workflow
    • 트러블 슈팅
      • Kubernetes namespace의 phase가 Terminating에서 멈춰있을 때
    • 쿠버네티스 마스터
    • Knative
    • Knative Pipeline
    • Aggrerated API server
    • Accessing the API
      • Authenticating
  • Sonarqube
  • HTTP/2
  • Go
    • Go Module
    • Go dependency injection
    • Go Error handling
    • Go in Action
      • 3장 패키지
      • 4장 배열, 슬라이스, 맵
      • 5장 GO의 타입 시스템
      • 6장 동시성
      • 7장 동시성 패턴
      • 8장 표준 라이브러리
      • 9장 테스트와 벤치마킹
    • Go Channel 사용법
  • Cloud Native
Powered by GitBook
On this page
  • 개요
  • 시작하기
  • 변경할 때마다 소프트웨어를 빌드하기
  • 순서
  • 자주 빌드하여 얻을 수 있는 해답
  • CI의 특징
  • 기본 요소
  • 지속적인 통합 도입하기
  • CI가 지닌 가치
  • 프로세스 자동화
  • CI 적용 단계
  • CI와 다른 개발 실천 방법
  • 실천 방법
  • 위험 줄이기
  • 위험 요소들
  • 변경과 동시에 소프트웨어 빌드하기
  • 빌드를 자동화하기
  • 명령어 하나로 빌드를 수행하기
  • 소프트웨어 자산을 중앙 집중화 하기
  • 빨리 실패하는 빌드를 만들기
  • 환경에 독립적으로 빌드 되도록 하기
  • 빌드 유형
  • 빌드 메커니즘
  • 전용 통합 빌드 머신 사용
  • CI 서버 사용
  • 빌드 시간 단축
  • 지속적인 테스트
  • 단위 테스트 자동화하기
  • 컴포넌트 테스트 자동화하기
  • 시스템 테스트 자동화하기
  • 기능 테스트 자동화하기
  • 결함 검사용 테스트 작성하기
  • 컴포넌트 테스트를 반복할 수 있게 만들기
  • 테스트 케이스 하나에 assert 하나로 제한하기
  • 지속적인 검사

지속적 통합 (CI)

개요

  • 개발 프로세스 중 가장 고통스러운 통합과정을 자동화하는 방법.

  • 프로젝트의 복잡도가 증가하고 여러 사람이 협업하는 과정이 필요하다면, 통합의 비용이 기하급수적으로 증가하기 때문.

  • 사실은 그저 작업을 자주 자주 통합하는 것이라고 봐도 무방함.

  • 결함이 발생하는 시점과 고쳐지는 시점의 간격을 줄이고, 신속하게 피드백을 제공.

  • 리팩토링, 테스트 주도 개발과 잘 어울림.

  • 변경 부분이 기존 부분과 잘 융합하여 작동되는걸 쉽게 확인해보게 도와주는 안전망

시작하기

변경할 때마다 소프트웨어를 빌드하기

  • 빌드: 컴파일보다 큰 개념. 컴파일, 테스트, 검사, 배포 등의 과정을 모두 포함하며 소프트웨어가 하나의 단위로 작동하는지 확인하는 과정

순서

  1. 소스코드 커밋, CI 서버가 변경사항이 없는지 계속해서 확인.

  2. CI서버가 변경 내역 감지. 최신 소스코드 복사본을 가져와서 빌드스크립트를 실행하고 통합 시도.

  3. 이메일 등으로 빌드 결과 내보냄

  4. 다시 새로운 변화에 대해서 감시

자주 빌드하여 얻을 수 있는 해답

  1. 모든 소프트웨어 컴포넌트가 함께 작동하는가

  2. 코드 복잡도가 얼마나 되는가

  3. 팀이 코딩 표준을 잘 지키는가

  4. 코드의 테스트 커버리지가 얼마나 되는가

  5. 가장 최근의 변경 사항 적용 후 모든 테스트가 성공했는가

  6. 마지막 배포에 문제가 없었는가

CI의 특징

  • 버전 관리 저장소 연결

  • 자동 빌드

  • 피드백 메커니즘

  • 소스코드 변경 내역 통합 프로세스

기본 요소

  • 컴파일, 데이터베이스 통합

  • 테스트

  • 검사

  • 배포

  • 문서화 및 피드백

지속적인 통합 도입하기

CI가 지닌 가치

  • 위험을 줄여줌

    • 결함 조기 발견 및 수정

    • 소프트웨어 건강 상태 측정

    • 가정을 줄일 수 있음

  • 반복적인 수작업을 줄여줌

  • 언제 어느 때라도 배포 가능한 소프트웨어를 만들어줌

  • 프로젝트 가시성을 높여줌

    • 효과적인 의사결정

    • 추세 인지

  • 개발 팀이 자신의 제품에 자신감을 가지게 해줌

프로세스 자동화

  1. 식별하기

  2. 빌드

  3. 공유하기

  4. 지속적으로 돌아가게 만들기

CI 적용 단계

  • 새로운 프로젝트의 시작과 동시에

CI와 다른 개발 실천 방법

  • 개발자 테스트

  • 코딩 표준 준수

  • 리팩토링

  • 작은 릴리즈

  • 공동 소유권

실천 방법

  1. 코드를 자주 커밋

    • 조금씩 바꾸기

    • 각 작업이 끝날 때 마다 커밋

  2. 깨진 코드는 커밋하지 않기

  3. 빌드가 깨지면 즉시 고치기

  4. 자동화된 개발자 테스트 작성

  5. 테스트와 검사는 모두 통과해야함

  6. 개인 빌드를 먼저 돌리기

  7. 깨진 코드는 가져오지 않기

위험 줄이기

위험 요소들

  1. 배포 가능한 소프트웨어의 부재

    • 깨끗한 빌드 전용 서버가 따로 있어야 한다.

  2. 뒤늦은 결함 발견

    • 테스트 커버리지 체크

  3. 프로젝트 가시성의 부재

    • 현재 상황에 대한 공유

  4. 저품질의 소프트웨어

    • 코딩 표준 준수

    • 중복 코드

    • 아키텍쳐 준수

변경과 동시에 소프트웨어 빌드하기

빌드를 자동화하기

명령어 하나로 빌드를 수행하기

  • IDE에 의존하지 말고, 단 하나의 명령어로 빌드되게끔 할 것.

소프트웨어 자산을 중앙 집중화 하기

  • 외부 소스 저장소 사용

빨리 실패하는 빌드를 만들기

  1. 컴포넌트 통합

  2. 단위 테스트

  3. 기타 무거운 프로세스

환경에 독립적으로 빌드 되도록 하기

  • properties, profile 등만 수정하면 되도록.

빌드 유형

개인 빌드

  • 컴파일

  • 단위 테스트

통합 빌드

  • 컴포넌트

  • 시스템

  • 성능 테스트

  • 코딩 표준 준수

  • 코드 복잡도

  • 코드 커버릿지

릴리즈 빌드

  • 인수 테스트

  • 설치 매체

  • 품질 보증

빌드 메커니즘

  1. 주문형

  2. 시간 기반

  3. 변경사항 감시

  4. 이벤트 주도

전용 통합 빌드 머신 사용

  • 충분한 하드웨어

  • 모든 소프트웨어 자산을 두기

  • 깨끗한 환경

CI 서버 사용

빌드 시간 단축

빌드 메트릭 수집, 분석 및 개선

  • 컴파일 시간, 줄 수, 검사 개수 및 유형, 어셈블리 생성 시간, 테스트 실행 시간 등

전용 빌드 머신 사용

테스트 성능 개선

지속적인 테스트

  • 객체 수준에서 신뢰도를 보장할 수 있어야 한다.

단위 테스트 자동화하기

  • 의존성이 있는 어떤 클래스를 테스트 할 때, Mock 클래스 등을 쓰지 않고 파일 시스템이나 데이터베이스같은 외부 개체에 의존하면 그건 컴포넌트 테스트.

  • 단위 테스트는 외부 의존성에 전혀 기대지 않아야 함. 왜냐하면 테스트에 걸리는 시간이 길어지므로.

컴포넌트 테스트 자동화하기

  • 시스템의 일부를 검증

  • 외부 의존성이 필요할 수 있음.

  • 상호작용하여 예상된 총체적 행동을 생산해내는지 검증해야함.

  • 단위테스트에 비해서 오래 걸리는 경향이 있음.

시스템 테스트 자동화하기

  • 전체 시스템을 실행시킴.

  • 완전히 설치된 시스템 필요.

  • 기능 테스트와는 근본적으로 다름.

기능 테스트 자동화하기

  • 클라이언트의 관점에서 테스트.

  • 인수 테스트라 하기도 함.

결함 검사용 테스트 작성하기

  • 결함 주도적 방식의 시나리오 사용

    • assert를 적절하게 이용하기 어렵다.

    • 테스트 케이스가 실패하지 않게 되었다고 해서 제대로 동작하는 것은 아니다.

    • 그러나 테스트 케이스에서 더이상 문제가 없으므로 지나치려는 경향이 있다.

  • 지속적인 예방 개발

    • 결함을 고치고, 재발하는걸 막으며, 변화된 행동까지 검증하게끔 이끈다.

컴포넌트 테스트를 반복할 수 있게 만들기

테스트 케이스 하나에 assert 하나로 제한하기

지속적인 검사

  • 정적 분석 도구를 활용하라 (기존 사람의 분석과 같이 사용하는 것이 더 효율적)

  • 검사 주기는 짧을 수록 좋음.

    • 결함을 조기에 발견하고 수정할 가능성이 높아짐

  • 코드 메트릭을 검사

    • 순환 복잡도 수

    • 설계와 연관된 의존성 메트릭 (구심성 결합도, 원심성 결합도, 불안정성)

  • 코드 심사

    • 코딩 규약

    • 아키텍쳐

  • 중복 코드 줄이기

  • 코드 커버리지 평가

    • 코드 커버리지 테스트의 부하가 크기 때문에 성능 테스트나 부하 테스트와 병행하지 말 것

Previous한번에 하나씩NextJenkins pipeline 삽질기

Last updated 7 years ago