[Devops] # 지속적 통합 (CI : Continuous Ingegration)

empty·2021년 1월 30일
0

DEVOPS

목록 보기
1/1

지속적 통합 (CI : Continuous Ingegration) 는 개발자들이 빠른 주기로 작업한 내용을 통합 브랜치에 통합하고 빌드하는 개발방식이다.

여기서 말하는 통합이란 개인이 작업한 코드를 공용 작업환경에 올리는 것을 의미하고 통합은 병합(merge)이라는 과정으로 이루어진다.

CI는 통합하는 과정에서 발생하는 이슈를 가능한 빨리 발견하기 위해서 필요하다.

CI를 통한 애자일(Agile)

애자일 개발 방법론은 빠른 배포를 기반으로 하는데 CI는 애자일에서 필요한 속도를 얻는데 도움을 준다. 기본적인 기능을 개발할 때의 과정이다.

  1. 기능을 개발 및 커밋
  2. 빌드 및 단위 테스트
  3. 통합
  4. 빌드
  5. 통합 테스트
  6. 패키징

위의 과정에서 단계마다 알람을 추가한다면 팀원이 빌드실패, 통합실패, 배포실패를 빨리 알아차려서 더욱 빨리 대응할 수 있게된다. 따라서 CI를 사용하면 위의 모든 과정을 빠르게 에러없이 진행할 수 있다.

즉 애자일의 기민함은 CI를 통해 달성된다.

📌 CI의 구성요소

버전 관리 시스템(Version Control System)

CI를 구성하는 데 가장 기본이자 중요한 요소이다. 기본적으로 소프트웨어 빌드와 관련된 모든 것은 버전관리가 돼야한다.

  • 버전관리 시스템에는 비분산형과 분산형이 존재한다.

비분산형에는 SVN, IBM Rational ClearCase 등이 존재하고 분산형에는 git, Mercurial 등이 존재한다.

브랜칭 전략

버전 관리 시스템을 사용할 때는 브랜치를 최소화하는 것이 좋다. 대부분의 회사는 여러 브랜치를 사용하는 전략을 유지하는데 이유는 팀의 일부가 릴리스 브랜치에서 작업할 때 다른 팀원은 또 다른 릴리스 브랜치에서 작업해야 하는 경우가 생기기 때문이다.

CI도구

CI도구는 단순히 지휘자 역할을 하고 파이프라인을 생성하는 방법을 제공한다.

  • CI 시스템의 중심에 위치하여 버전관리, 빌드도구, 바이너리 관리 도구, 소스코드 분석도구 및 자동화 테스트도구 등을 연결한다.

각 파이프라인에는 고유한 목적이 있고 CI를 관리하거나, 소작업 또는 배포를 관장한다. (연속된 작업의 흐름임)

핵심은 스크립트 언어를 이용하여 다양한 소작업을 수행한다는 것이다.

빌드 자동화

빌드 자동화는 코드를 컴파일하고 실행파일을 만들어내는 여러 단계를 자동화 하는것이다.

  • 주로 Ant나 Maven같은 빌드도구를 이용한다.

빌드 자동화에서 가장 중요한 부분으로 아래의 두 가지 조건이 충족돼야 한다.

1️⃣ 빠른 속도

2️⃣ 코드나 이슈를 최대한 빨리 잡아내는 것

빌드가 하루에 100~200번 발생하는 프로젝트도 있는데 이 경우에 속도가 매우 중요하다.

빌드를 자동화하게 되면 많은 시간을 절약할 수 있고 빌드를 시작시키는 행위도 자동화하면 변화는 더욱 커진다.

빌드가 자주발생되고 빠르게 수행된다면 에러를 발견할 확률이 높아지고 발견되는 시점도 빨라진다.

코드 정적 분석

정적 분석은 화이트 박스 테스트라고 부르기도 하는데 실제로 프로그램을 수행하지 않고 내부적인 구조를 평가한다.

  • 반복적으로 사용되는 코드나 주석 처리된 라인의 수, 코드의 복잡성 등..

코드 정적 분석은 일반적으로 CI의 일부로써 빌드 할 때마다 같이 수행된다. 따라서 낮은 품질의 코드가 머지되는 것을 예방할 수 있다.

  • 코드 정적 분석의 대표적인 도구에는 Sonarqube가 있다.

테스트 자동화

테스트는 수작업이고, 오랜 시간이 소요되는 반복적인 일이기 때문에 테스트 과정을 자동화하면 소프트웨어 배포에 걸리는 시간을 대폭 단축시킬 수 있다.

  • 하지만 테스트를 자동화하는 일은 빌드, 릴리스, 배포를 자동화하는 것보다 훨씬 어렵다.

바이너리 관리 도구

소스코드는 CI를 통해 주기적으로 빌드가돼어 Binary 파일로 만들어진다. 따라서 이렇게 빌드된 바이너리를 저장할 공간이 필요하다. CI를 사용하면 자체 바이너리 저장소를 사용하여 관리할 수있다.

패키징 자동화

빌드가 여러 종류의 결과물을 가지게 되는 경우가 있다. 여러 결과물을 하나로 묶는 작업을 패키징이라고 하고 이 과정도 CI도구를 이용하여 자동화 하게 된다면 많은 시간을 단축할 수있다.

📌 CI사용의 장점

1️⃣ 복잡하고 어려운 통합으로부터 해방

기능 브랜치에 올려진 모든 커밋을 통합 브랜치에 통합하고 테스트하면 CI가 통합 이슈를 즉시 알려주게 된다.

2️⃣ 메트릭

Jenkins, Sonaqube, Artifactory, Github와 같은 도구를 사용하여 프로젝트 팀원들은 프로젝트의 진행방향 및 속도를 확인할 수 있다.

3️⃣ 이슈의 조기 발견

CI를 잘 구성하게 되면 모든 merge이슈나 통합 이슈가 바로 발견되고 빌드가 실패할 경우 즉시 알람을 통해 이를 알려주게 된다.

4️⃣ 빠른 개발

기술적 관점에서 팀원들을 좀 더 효율적으로 일할 수 있게 도와준다. 빌드, 테스트, 소스코드 통합을 자동화하는 환경이 되고 이는 곧 빠른 개발로 이어진다.

5️⃣ 기능 추가에 집중

빌드, 릴리스, 배포작업이 자동화됨에 따라서 개발팀은 기능 개발 이외의 것에 신경 쓸 이유가 사라졋다. 따라서 개발팀은 코드 개발에 더 많은 시간을 할애할 수 있게되었다.

0개의 댓글