[CI/CD] GitHub Actions + AWS CodeDeploy

2021. 12. 31. 01:42[ DevOps ]/[ CI-CD ]

CI (Continuous Integration)

배포 이전까지의 단계인 공유 레포지토리(git, svn)에 빌드나 테스트, 병합 등으로 최종 릴리즈까지 통합하는 것을 자동화한다는 것을 의미한다. 코드의 변경사항이 많아지면 충돌의 가능성이 커지고 이에따라 변경사항을 주기적으로 빈번하게 머지할 중요성이 커졌다. 이에따라 최종 배포 전까지의 단계를 스크립트 파일을 통해 자동화하여 보다 빈번하게 머지할 수 있도록 하기 위해 등장한 것이 CI이다. 무엇보다 CI는 공유 레포지토리에 빈번하게 머지된 소스코드를 자동으로 빌드하고 테스트하며 이에 대한 이력을 쉽게 보여줘야 한다. 이로써 주기적으로 머지되는 소스코드의 충돌을 최소화하고 빌드와 테스트를 자동화하여 코드 결합을 빠르고 쉽게 이루어낼 수 있다.

 

CD(Continuous Delivery 또는 Deployment)

CI에서 릴리즈된 최종 결과물을 고객의 운영(Production) 환경까지 릴리즈 되는 것을 의미한다. 즉, 지속적인 배포를 의미하며 배포되는 과정을 자동화해 빠르게 배포를 만들 수 있을지에 대한 개념이다. 하지만 CD에서 자동화는 필수 사항은 아니다. 배포는 수동으로 할 수도 있으며 이 경우에는 Delevery에 해당되고 자동화까지 고려한다면 Deployment에 해당된다. 언제든지 복구가 가능한 버전을 유지하는 것도 CD의 역할이다.

 


AWS에서 제공되는 CI/CD

 

[code commit] : 저장 - CI

- github과 유사한 레포지토리

- AWS에서 제공하는 소스 저장 레포지토리

- https://aws.amazon.com/ko/codecommit/

 

[code build] : 빌드 - CI

- 소스를 컴파일하고 테스트하고 빌드해서 배포할수 있는 artifact를 만들어 줌

https://aws.amazon.com/ko/codebuild/

 

[code deploy] : 배포 - CD

- 배포 자동화 서비스임

- https://aws.amazon.com/ko/codedeploy/

 

[code pipeline] - CI/CD

- 위 일련의 과정(소스저장, 소스빌드, 소스배포)을 모아서 싸이클(단계)을 만들어둠

 


CI/CD 구축해보기

- CI : GitHub Action 이용

- CD : AWS CodeDeploy 이용

 

https://wbluke.tistory.com/39

CI/CD 파이프라인 과정

1) 개발자가 코드를 작성하고 주기적으로 레포지토리에 머지

- git push + 코드리뷰

2) 레포지토리에서 자동으로 '빌드'하고 '테스트'하는 과정을 거쳐서 통과되었는지, 아닌지 확인

- github action이 담당

- .github/workflows/ 에 스크립트 파일을 작성해 두면 특정 이벤트 발생시 실행

3) 통과되었다면 릴리즈 준비를 함

- github action이 빌드하고 패키징한(압축한) 파일을 S3로 올림

4) 릴리즈할 파일을 자동적으로 또는 수동적으로 배포함(CD) 

- EC2에 설치된 AWS CodeDeploy Agent가 S3로 부터 압축파일을 가져오고 appspec.yml 스크립트를 실행

 

 

 

 

 

1. IAM 역할 만들기

1) EC2에 설정할 역할 만들기 : EC2에서는 S3에 접근할 수 있어야 하기 때문에 S3FullAccess 역할을 만든다 

 

 

 

2) code deploy에 설정할 역할 만들기 

 

 

 

 

- 결과적으로 총 2개의 역할을 만들고 각각 EC2 및 Code Deploy에 부여해야 함.

 

 

 

2. EC2 생성

- EC2 생성 시 '인스턴스 세부 정보 구성'에서 위에서 만든 역할을 선택해 부여해줘야 함 (첫 번째로 만든 권한: ec2에서 s3에 접근할 수 있는 권한)

 

 

3. 배포 권한을 줄 사용자 만들기(배포 담당)

- github actions가 발생했을 때 S3로부터 압축파일을 가져오고 배포를 해 줄 IAM 사용자가 필요함.

- IAM -> 사용자

 

 

- 다음과 같이 두 개의 권한 추가 (S3접근 권한, CodeDeploy 접근 권한)

 

 

 

- 접속 키 발급 받아 두기 (깃헙 레포지토리의 설정에 등록해야 함)

 

 

4. 만든 EC2에 접속해서 Code Deploy Agent 설치

- 로컬에서 만든 EC2로 접속(기존에 사용하던 pem키가 있다면 그대로 사용 가능)

- (https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/codedeploy-agent-operations-install-ubuntu.html) 참고해서 설치

 

 

[ubuntu에서 code deploy agent 설치 명령어 순서]

- sudo apt update

- sudo apt install ruby-full

- sudo apt install wget

- cd /home/ubuntu

- wget https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install (code deploy의 리소스 키드 다운)

- chmod +x ./install (실행권한 부여)

- sudo ./install auto (에이전트 설치)

- sudo service codedeploy-agent status (codedeploy agent가 제대로 동작중인지 확인)

 

cf. jdk가 없다면 설치 필요

- sudo apt-get remove openjdk*

- sudo apt install openjdk-11-jdk 

- java --version (버전확인)

 

5. S3 버킷 생성

- 특별히 설정할 것은 없음. 버킷 이름만 만들고 바로 생성하기

 

6. Code deploy 앱 생성 및 배포 그룹 생성

- Code Deploy에서 배포할 앱과 해당 앱에 설정할 배포 그룹을 생성

 

1) code deploy 앱 생성

- code deploy 애플리케이션 이름은 자유롭게

 

 

2) code deploy 배포 그룹 생성

* 반드시 이전에 생성한 역할을 지정해 줘야 함

 

cf. 배포 유형

 

- 현재위치 : 실행중이던 것이 잠시 죽더라도 그대로 배포

- 블루/그린 : 실제 운영에서 그룹지어서 배포함 (실무에서 사용하는 방식)

 

 

* 배포할 EC2 지정

 

* 에이전트 구성

 

- 위에서 설치했으므로 '안 함'

 

 

- 배포 양이 적다면 AllAtOnce

 

 

 

 

[아래 설정파일은 Push 이벤트 발생에 대한 github actions임]

8. github 레포에서 .github/workflow/main.yml 파일 생성

- 이 파일은 github action과 관련해 어떤 동작을 수행할지 명시함

 

ex) https://github.com/YAPP-19th/iOS-Team-2-Backend/blob/dev/.github/workflows/main.yml

 

- aws s3 cp : s3로 파일을 업로드 하는 동작

- aws deploy : code deploy에 배포 단위를 생성하는 동작

 

9. appspec.yml 작성

- appspec.yml은 code deploy의 동작을 설정하기 위한 파일이다.(CD) 해당 파일을 작성 후 프로젝트의 루트 디렉토리에 위치시킨다.

 

ex) https://github.com/YAPP-19th/iOS-Team-2-Backend/blob/dev/appspec.yml

 

- files.source : 프로젝트에서 어느 경로를 다운받을지 명시

- hook.AfterInstall : CodeDeploy 수명주기 중 AfterInstall 발생 시(install이 끝날을 때) 코드에서 scrips 디렉토리 안에 있는 deploy.sh를 실행하라는 이벤트 

 

cf. https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html 

 

10. 배포용 쉘 스크립트 작성

- scripts 디렉토리 안에 deploy.sh 를 생성한다.

 

* deploy.sh ex) https://github.com/YAPP-19th/iOS-Team-2-Backend/blob/dev/scripts/deploy.sh

 

- 먄약 Push후 github에서는 통과했으나 AWS 단에서 문제가 발생했다면 code deploy agency에서 로그 파일 확인하기 (cat /var/log/aws/codedeploy-agent)