1. CI(Continuous Integration), 지속적 통합
개발자들이 빠른 주기로 작업한 내용을 통합 브랜치에 통합하고 빌드하는 개발 방식을 의미한다. 여기서 통합이란, 개인이 작업한 코드를 공용 작업 환경에 올리는 것을 의미한다. 이 과정은 개인 브랜치를 중앙 브랜치에 merge하는 과정으로 이뤄진다.
CI는 통합과정에서 발생하는 이슈를 가능한 빨리 발견하기 위해 필요하다.
2. CI를 이용한 애자일
기능을 개발할 때는 코드를 여러 번 수정하게 되는데, 이 과정에서 코드를 반영하고, 버전 관리 시스템에서 변경 사항을 가져오고, 소스코드를 빌드하고, 단위 테스트를 진행하고, 통합하고, 통합된 코드르 빌드하고, 이를 묶어 배포하는 등 여러 과정을 수행한다. CI 환경에서는 젠킨스 같은 도구를 이용해 모든 과정을 빠르게 에러 없이 진행할 수 있다. 따라서 애자일 방법론의 기민함은 CI를 통해 달성된다고 볼 수 있다.
3. CI의 구성요소
VCS(Version Control System)
CI를 구성하는 데 가장 기본이자 중요한 요소다.
브랜칭 전략
가장 확장된 방식의 gitflow 브랜칭 전략은 다음과 같다.
1) 마스터와 프로덕션 브랜치에는 언제나 최종 배포가 가능한 코드만 있다.
2) 기능 브랜치에는 모든 개발 내용이 들어간다.
3) 통합 브랜치에서 2)의 모든 코드를 통합하고 품질을 위해 테스트한다.
4) 통합 브랜치에서 안정적인 릴리스 버전이 생길 때 이 버전에 기반해 릴리스 브랜치를 생성한다.
5) 릴리스 된 코드의 버그 픽스는 릴리스 브랜치에 통합된다.
6) 마스터나 프로덕션 브랜치에 핫픽스가 필요한 경우에도 각각의 브랜치를 기반으로 핫픽스 브랜치가 생성된다.
CI 도구
CI시스템의 중심에 위치해 버전 관리 시스템, 빌드 도구, 바이너리 관리 도구, 테스트 및 프로덕션 환경, 소스코드 분석도구 및 자동화 테스트 도구 등을 연결한다. Build Forge, Bamboo, TeamCity, Jenkins 등이 있다.
CI도구는 파이프라인을 생성하는 방법을 제공한다. 파이프라인의 각 작업은 연속해서 수행되는 소작업의 모음이다. CI도구 사용의 핵심은 스크립트 언어를 이용해 다양한 소작업을 수행하는 것이다.
자동으로 시작되는 빌드
빌드 자동화는 코드를 컴파일하고 실행 파일을 만들어내는 여러 단계를 자동화하는 것이다. 주로 Ant, Maven 같은 빌드 도구로 자동화한다.
자동으로 시작되는 빌드는 CI 시스템에서 가장 중요한 부분으로 다음 두 가지 조건이 충족돼야 한다.
1) 빠른 속도
2) 코드나 통합 이슈를 최대한 빨리 잡아내는 것
코드 커버리지
테스트케이스가 커버하는 코드 양을 백분율로 나타낸 값이다.
코드 정적 분석(화이트박스 테스트)
코드의 구조적인 품질을 측정하는 소프트웨어로 코드가 얼마나 견고하고 지속 가능한지를 알려준다. 코드 정적 분석은 실제로 프로그램을 수행하지 않고 실행된다. 이것은 기능을 테스트하는 동적 테스트와 달리 소프트웨어의 기능적인 부분을 분석하지 않는다.
코드 정적분석은 소프트웨어의 내부적인 구조를 평가한다. 예를 들어 반복적으로 사용되는 코드나 주석 처리된 라인의 수, 코드의 복잡성 등이 측정된다. 사용자 정의된 메트릭을 통해 분석 결과가 생성돼 유지 보수성에 대한 코드의 품질을 알려준다.
자동화된 테스트
테스트는 SDLC(Software Development Life Cycle, 소프트웨어 개발 수명 주기)에서 중요한 역할을 한다. 소프트웨어의 품질을 유지하려면 다양한 테스트 시나리오를 통해 소스를 테스트해야 한다.
모든 테스트를 자동화하는 것이 불가능할 수도 있지만 중요한 것은 가능한 많은 부분을 자동화하는 것이다.
바이너리 관리 도구
바이너리 관리 도구는 바이너리 파일의 버전 관리 시스템이다. 바이너리 관리 도구는 다음과 같은 역할을 한다.
1) 빌드된 바이너리가 생성될 때마다 바이너리 관리 도구에 저장된다. 결과물이 중앙 서버에 저장돼 필요할 때마다 쉽게 접근 가능해진다.
2) 빌드시 필요한 서드파티의 바이너리 플러그인이나 모듈을 저장한다. 따라서 빌드 도구가 빌드 시 플러그인을 다운로드할 필요가 없어진다. 바이너리 관리 도구가 온라인에 연결돼 플러그인들을 항상 최신 버전으로 유지하는 역할을 한다.
3) 누가, 언제, 어떤 바이너리를 만들었는지 기록한다.
4) 릴리스를 더 쉽게 관리할 수 있게 스테이징 환경을 제공하고, CI절차의 속도 향상에 도움을 준다.
5) 빌드의 주기가 빠른 CI환경에서는 매 빌드시 패키지가 만들어진다. 이렇게 만들어진 모든 패키지가 한 장소에 존재하기에 개발자가 다음 단계에 적용시킬 바이너리를 쉽게 고를 수 있다.
패키징 자동화
빌드가 여러 종류의 결과물을 가지게 되는 경우에서, 이 모든 결과물을 하나로 묶는 작업을 패키징이라고 한다. 이 과정도 CI도구를 이용해 자동화하면 많은 시간을 단축할 수 있다.
4. CI 사용의 장점
1. 복잡하고 어려운 통합으로부터 해방될 수 있다. 기능 브랜치에 올려진 모든 커밋을 통합 브랜치에 통합하고 테스트하면 CI도구가 통합 이슈를 즉시 알려준다.
2. 메트릭(데이터 시각화) : 작업기간 동안의 추세를 기록하고 보여주기 때문에 이 추세를 통해 PM과 팀원들은 프로젝트의 진행방향 및 속도를 확인할 수 있다.
3. 이슈의 조기 발견 : 모든 머지 이슈나 통합 이슈가 바로 발견되고, CI 시스템이 빌드 실패 즉시 알람을 통해 이를 알려준다.
4. 빠른 개발 : CI를 사용하는 프로젝트은 빌드, 테스트, 소스코드 통합을 자동으로 하는 환경이 되고, 빠른 개발로 이어진다.
5. CI도구를 이용해 빌드, 릴리스, 배포 작업이 자동화됐고, 개발 팀이 기능 개발 외에 것에 신경 쓸 이유가 사라졌다. 따라서 CI절차를 따라감으로써 개발팀은 코드 개발에 더 많은 시간을 할애할 수 있다.
출처 : 초보를 위한 젠킨스 2 활용 가이드 2/e
'기록 > CI&CD' 카테고리의 다른 글
[AWS] 같은 브랜치에 있는 프론트엔드, 백엔드 자동배포하기 (2) Docker, Docker Compose 설치 (0) | 2022.08.11 |
---|---|
[AWS] 같은 브랜치에 있는 프론트엔드, 백엔드 자동배포하기 (1) 초기설정 (0) | 2022.08.10 |
[AWS] ec2에 openVidu on premises 설치하기 (0) | 2022.08.09 |
[AWS] ec2에 mysql 설치하기 (0) | 2022.08.08 |
Docker + Jenkins + Vue (0) | 2022.06.18 |
댓글