본문 바로가기
지속적 통합

DevOps Day 33 (4.20) 지속적 통합_CI/CD 리뷰

by Jackykim 2023. 4. 20.

CI/CD 파이프라인
전통적인 소프트웨어 전달 방식 : 출시 기한을 정해 놓고 소프트웨어를 완성 : 폭고수 모델

 

문제점 :
- 출시 시점에 소프트웨어의 신뢰성, 안정성을 보장할 수 없음
- 출시를 약속하고 뚜껑을 열어봤을 때, 산더미처럼 쌓여있는 버그

소프트웨어 안전성 개선을 위한 노력 : 베타 버전 등을 통한 테스트

 

특징 :
- 사용자가 항상 최신 상태로 업데이트해야 함
- 따라서 버그 수정을 사용자에게 전달하기 매울 어려움
- 여전히 모바일 애플리케이션이 사용하는 전달 방식

 

Saas (Software as a service)
- 서비스로서의 소프트웨어
- 브라우저에 접속하기만 해도, 새 버전을 즉시 사용할 수 있음

 

클라우드 서비스의 전달 방식 : 고객의 요구에 민첩하게 대응하여 지속적 전달 : 애자일 모델

장점 :
- 사용자 업데이트에 대한 걱정에서 벗어남
- 하루에 여러 번의 릴리즈도 가능
- 다양한 배포방식을 적용하거나 A/B 테스트가 가능
- 빠른 배포를 보장

 

서비스 전달 관점에서의 Devops의 역할 : 서비스 전달/배포 Workflow를 구성할 수 있어야한다

 

CI/CD 파이프라인 : 지속적 배포 (Continuous Deployment)
Plan -> Code -> Build -> Test -> Release -> Deploy -> Operate

 

유용한 CI 도구들

CI/CD를 위한 많은 Tool이 존재하고 있으며 Jenkins, Github action, Travis CI에 대해 학습

 

Jenkins : 오픈소스 자동화 서버입니다. 빌드, 테스트, 배포와 같은 소프트웨어 개발의 일부분을 자동화하는 데 도움을 주며, 지속적 통합과 지속적 배포를 돕습니다.
특징 :
- 설치형: 별도의 서버가 필요합니다.
- 다양한 플러그인을 활용할 수 있습니다.
- 쿠버네티스, Docker 등과 호환됩니다.
- 다양한 운영체제에서 사용이 가능합니다.

 

Travis CI : 호스트형(hosted) 배포 자동화 서비스로, GitHub 및 Bitbucket 등에서 호스팅되는 소프트웨어 프로젝트를 빌드하고 테스트하는 데 사용됩니다.
특징 :
- 클라우드 서비스(SasS) 형태로 사용할 수 있습니다.
- Travis 자체에서 호스팅을 해주기 때문에 관리적인 측면에서 편리합니다.
- Clojure, Erlang, Groovy Haskell, Java, JavaScirpt, Node.js, Perl PHP, Rython, Ruby 등의 다양한 언어를 지원합니다.

 

Github Action : 모든 소프트웨어 워크플로우를 자동화하는 것이 쉬워졌습니다. 이제 세계적 수준의 CI/CD와 함께 GitHub에서 코드를 빌드, 테스트 및 배포할 수 있습니다.
특징 :
- GitHub 저장소를 기반으로 소프트웨어 개발 Workflow를 자동화할 수 있는 툴입니다.
- GitHub 마켓 플레이스를 통해 여러 사람이 공유한 Workflow를 찾을 수 있으며, 자신이 직접 만들어 공유할 수도 있습니다.
- 공개 저장소를 무료로 사용할 수 있으며, 비공개 저장소 같은 경우 무료 사용량 이후에 요금이 부과됩니다.
  - 한 달에 500MB 스토리지와 실행 시간 2,000분(minute)까지 제공됩니다.
- Github Actions 레퍼런스: Learn GitHub Actions - GitHub Docs

 

빌드와 언어별 빌드 도구
빌드 :
프로그램의 소스 코드를 독립적인 아티팩트(artifact)로 변환하는 과정입니다. 때로는 그 아티팩트 그 자체로도 실행이 가능하며, 대체로 런타임(소프트웨어 실행 환경)이 필요한 경우가 많습니다.

 

프레임워크 : 오로지 빌드만을 위한 도구도 많지만, 대부분의 경우 어떤 언어나 프레임워크를 선택하느냐에 따라 빌드 도구가 정해지기 마련입니다. 프레임워크는 소프트웨어 개발을 쉽게 만들어주기 위해 필요한 도구, 규약의 집합체입니다. 프레임워크 없이 코드 작성이 가능하나 문제들이 발생할 수 있음.

 

백엔드 웹 애플리케이션 개발용 프레임워크
- Spring (Java, Kotlin)
- Django (Python)
- Express (Javascript)

 

프론트엔드 웹 애플리케이션 개발용 프레임워크 :
- React 및 관련 라이브러리 (JavaScript)
- Vue.js, Svelte (JavaScript)

 

모바일 및 데스크톱 애플리케이션 개발용 프레임워크 :
- Flutter (Android, iOS 등)
- .NET Framework (Windows)
- Apple 운영체제 기본 Native 프레임워크 Cocoa (macOS), Cocoa Touch (iOS)
- 안드로이드 기본 Native 프레임워크 (Android)

 

대표적인 빌드 도구 :
JavaScript
기반의 React 생태계
React 프레임워크를 사용하는 경우 create-react-app 또는 next.js 와 같은 프레임워크를 사용합니다. 이 경우 대부분 다음과 같은 과정으로 프로덕션용 빌드 결과물(아티팩트)을 만들어낼 수 있습니다.
1. node.js 개발 환경 준비
2. 프로젝트 폴더로 이동
 - package.json 파일이 있는지 확인합니다
3. 의존성 (dependency) 설치
 - npm install 명령 입력
4. 빌드
 - npm run build 명령 입력
5. 빌드 결과물 확인
 - build 폴더 확인
 - React는 프론트엔드 웹 애플리케이션이므로 결과물로는 HTML, CSS, JS 파일을 포함합니다.
 - 이후 이 파일들을 nginx 등에서 정적 호스팅할 수 있습니다.

 

Java/Kotlin 기반의 Spring Boot 생태계 (Gradle)
Java/Kotlin 애플리케이션을 빌드하면 JVM(자바 런타임) 위에서 실행되는 war 파일이 아티팩트로 생성됩니다. 빌드 도구를 이용해 이를 실행할 수도 있습니다.
1. 자바 개발 환경(JDK, OpenJDK가 대표적) 준비
2. gradle 설치
3. 프로젝트 폴더로 이동
4. 빌드
 - gradlew build 명령 입력

 

빌드가 필요 없는 경우 : node.js 앱이나 Python 같이 소스 코드 그대로 런타임을 실행할 있는 경우, 다른 변환 작업이 필요 없는 경우에는 빌드 과정이 생략될 있습니다.