CI/CD란
- 자동으로 코드를 리포지토리에 푸시하고
- 자동으로 테스트를 진행하며
- 배포까지 자동으로 진행해주는 모든 과정을 말한다.
CI 란
- 여러 종류의 코드 리포지토리가 존재한다. (대표적으로 github)
- CI는 Continious Intergration의 약자로 지속적 통합을 의미한다.
- 코드를 저장소에 푸시했을 때 자동으로 코드를 빌드하고, 테스트를 진행하여 코드 빌드에 문제가 없는지 확인하는 과정이 ci이다.
- 이 빌드 과정이 무사히 통과 된다면, 바로 배포를 할 수 있다는 의미이다.
CD란
- Continious Delivery의 약자다.
- ci를 통해서 빌드 테스트가 통과된 코드를 배포 서버에 올려서 자동으로 배포하는 과정이다.
- 코드를 저장소에 푸시할 때마다. 자동으로 모든 과정이 이뤄지게 만들 수 있다.
여러 가지 CI/CD 툴
- 그림을 보면 알 수 있듯
- 빌드와 테스트는 aws 코드 빌드에서 이뤄지고
- 배포는 aws 코드 디플로이에서 이뤄진다.
- 만약 provision을 하고 싶다면 elastic beanstalk을 사용할 수 있다.
- 이 모든 과정을 한 곳에서 관리하는 도구는 AWS Code PipeLine이다.
AWS CodeCommit
- 먼저 버전 관리라는 개념에 대해서 살펴보자
- 코드의 모든 버전을 기록해 놓음으로서, 코드를 롤백시키거나 과거의 작업을 확인할 수 있는 유용한 기능이다.
- 누가 커밋했고, 수정 사항, 제거 사항 등 모든 것을 확인할 수 있다.
- 협업에 아주 유용한 도구라고 볼 수 있다.
- AWS CodeCommit은 이러한 버전관리 도구이다. (github라고 생각하면 편하다.)
- 용량의 제한이 없고, 완전 관리형이다.
- 모두 암호화 되어 저장되기 때문에 보안성이 높다고 한다.
AWS CodeCommit - Security
- 깃허브와 호환된다. 깃 명령어를 사용할 수 있다. 다만 인증은 해야한다.
- SSH키를 사용하여 코드 커밋 레포지토리에 접근할 수 있다.
- 비밀 번호를 사용해서 접근할 수도 있다.
- IAM 정책을 이용해서, 사용자와 특정 리포지토리에 대한 역할 권한을 관리할 수 있다.
- 코드는 모두 KMS를 이용해서 암호화 된다.
- 코드를 푸시할 때는 오로지 SSH 또는 HTTPS 프로토콜에서만 푸시할 수 있다.
AWS CodePipeline
- aws 안에서 ci/cd 툴들을 관리할 수 있게 해주는 시각적 워크 플로우 툴이다.
- 여러 가지를 다룰 수 있다.
- source: 코드 커밋, ECR, S3, Bitbucket, Github 중에서 코드를 가져올 수 잇다.
- Build: 말 그대로 코드 빌드다. CoidBuild, Jenkins, CloudBees, TeamCity등이 있다.
- Test: CodeBuild, AWS Device Farm, 다른 기타 툴 ,,
- Deploy: CodeDeploy, Elastic Beanstalk, CloudFormation, ECS, S3
- 이러한 단계는 순차적으로 진행할 수도 있고, 병렬적으로 구성할 수도 있다.
CodePipeline - Artifacts
- 코드 커밋, 코드 빌드, 코드 디플로이 모든 곳에서 아티팩트를 생성할 수 있다.
- 아티팩트란 코드 파이프라인 내에서 생성된 모든 것을 아티팩트라 부른다.
- 아티팩트는 S3버킷에 저장된 후 다음 단계로 전달된다.
- 여기서 다음 단계란, code build이후에 code deploy로 이동하는 것 등을 의미한다.
- 아티팩트를 받음으로서, 다음 단계를 수행할 수 있는 것이다.
- 예시를 살펴보자
- 코드 커밋에 코드를 푸시한다.
- 코드가 모두 추출되어 아티팩트가 만들어지고, 해당 아티팩트는 S3에 저장된다.
- 코드 빌드가 호출된다.
- 코드 빌드는 S3에 접근하여, 아티펙트를 가져와 빌드한다.
- 이후 빌드한 결과물을 다시 아티팩트로 만들어 S3에 저장한다.
- 코드 디플로이가 호출된다.
- S3에서 아티팩트를 가져와 배포를 진행한다.
AWS CodeBuild
- 코드 빌드에서도 여러 가지 단계가 존재한다.
- Source: 소스 코드를 얻는 저장소로 코드 커밋, S3, Bitbucket, Github등이 있다.
- Build instrctions: 소스 안에 존재하는 것으로 빌드 지침이다.
해당 파일의 이름은 buildspec.yml 이다.
해당 파일은 루트 폴더 안에 존재해야 한다.
- Build instrctions: 소스 안에 존재하는 것으로 빌드 지침이다.
- Output logs: 빌드 완료 이후 로그는 S3, CloudWatch Logs에 저장된다.
- CloudWatch Metrics로 빌드 통계를 볼 수 있고
- EventBridge로 빌드 실패나 트리거 알림을 감지할 수 있다.
- CloudWatch Alarms로 임계값을 설정한 후 해당 임계값을 넘는 횟수의 실패를 알림할 수도 있다.
- Build Project는 코드 파이프라인 또는 CodeBuild에서 정의될 수 있다.
- Source: 소스 코드를 얻는 저장소로 코드 커밋, S3, Bitbucket, Github등이 있다.
- 다음과 같은 환경을 지원한다.
CodeBuild - 실행 순서
- 코드 커밋에서 소스 코드와 빌드 지침 파일을 가져온다.
- 코드 빌드는 환경에 맞는 컨테이너를 지니고 있으며, 해당 컨테이너 내부로 모든 코드를 불러온다.
- 도커 이미지를 통해 컨테이너를 빌드할 수도 있다.
- 이후 빌드 지침에 따라 빌드를 수행한다.
- 성능의 향상을 위해 S3를 캐시로 사용할 수도 있다.
- 생성된 아티팩트는 S3로 이동하며,
- 로그는 S3, CloudWatch Logs에 저장된다.
CodeBuild - 빌드 지침
- 빌드 지침은 buildspec.yml에 저장된다.
- 코드 디렉터리 최상단에 위치해야 한다.
- 이제 변수를 살펴보자
- env: 환경 변수를 설정하는 곳이다.
- plaintext variable - 플레인 텍스트의 환경 변수를 설정할 수도 있고
- parameter-store - SSM 파라미터 스토어에서 가져올 수도 있다.
- secrets-manager - AWS Secrets Manager에서 변수를 가져올 수도 있다.
- phases: 코드 빌드가 무엇을 할 지를 정의하는 곳이다. 주로 install이 많다.
- install: 사전에 필요한 패키지 등을 설치하기 위한 명령어 등이 존재한다.
- pre_build: 빌드 직전에 실행되는 명령어를 적어둔 곳이다.
- build: 실제 빌드 명령어로 매우 중요하다.
- post_build: 마무리 작업으로 빌드가 되면 .zip결과물 등을 만드는 일을 의미한다.
- artifacts: 도커 컨테이너에서 추출 되어 S3로 보내지는 파일이며, KMS로 암호화 되어 있다.
- cache: 빌드 속도를 올리기 위해 캐싱할 파일이나 종속 항목들을 의미한다.
- env: 환경 변수를 설정하는 곳이다.
'AWS' 카테고리의 다른 글
[AWS] aws 강의 섹션 25 (AWS SAM) (0) | 2024.11.28 |
---|---|
[AWS] aws 강의 섹션 24 - 2 (Code Deploy, Code Star, Code Artifact, code Guru) (0) | 2024.11.27 |
[AWS] aws 강의 섹션 22 (Dynamo DB) (0) | 2024.11.05 |
[AWS] aws 강의 섹션 21-2 (람다함수, X-Ray, TMP, ECR, LIMIT) (3) | 2024.10.24 |
[AWS] aws 강의 섹션 21-1 (람다 (Lambda), 람다 함수(Labda Function)) (0) | 2024.10.22 |