여러분들은 프로젝트를 배포해야하는 상황에서 어떻게 하셨나요?
저는 다음과 같은 과정을 통하여 프로젝트를 배포하곤 하였습니다.
1) github에 변동 사항 커밋 후 merge
2) EC2 서버에서 clone
3) 프로젝트 jar 파일로 변경
4) jar파일을 통하여 프로젝트 실행
이 과정이 간단하긴 하지만, 솔직히 불편한 점이 많습니다.
많은 사람들과 함께 협업하는 프로젝트에서는 커밋이 빈번하게 발생하기 때문에 커밋이 발생할때마다 위 과정을 반복하면 시간도 시간이지만 매우 번거로울 것입니다.
저도 프로젝트를 할 때마다 위 과정을 반복해하니 많이 귀찮더라구요.
그래서 오늘은 CI/CD를 공부하면서 Github Action과 AWS Code Deploy를 사용해보도록 하겠습니다.
일단 먼저 CI/CD라는 용어에 대해서 알아보겠습니다.
CI/CD는 Continuous Integration/Continuous Delivery 혹은 Continuous Integration/Continuous Development의 약자로, 용어만 해석해보면 계속적으로 통합하면서 전달하는 과정, 개발하는 과정이라고 생각하면 좋을 것 같습니다.
우리가 코드를 작성하고, 이를 배포한 서버에 적용하는 과정을 생각해봅시다.
1) 코드 작성
2) github로 push
3) merge
4) git conflict test
5) merge한 내용을 배포해놓은 서버로 clone
6) 기존 서버 종료
7) 배포한 서버에서 새로운 프로젝트를 실행
보통 다음과 같은 과정을 거칠 것입니다.
여기서 1,2,3 단계를 CI라고하며, 새로 작성한 코드들이 공유 저장소에 병합되는 단계를 의미합니다. 이 과정에서 새롭게 병합되는 코드들이 기존의 코드들과 문제를 일으킬 수 있는지 확인할 수 있는데, 이 과정을 거침으로써 코드가 github에 병합이 됩니다. 이 과정을 Continuous Delivery라고 합니다.
그리고 나머지 5,6,7 단계를 Continuous Deployment라고 하는데, 코드의 변경 사항을 배포된 서비스에 적용하는 과정을 의미합니다.
[Reference : https://www.redhat.com/ko/topics/devops/what-is-ci-cd]
위에서 설명했던 단계들이 자동으로 수행되는 것을 CI/CD라고하는데, Jenkins나 Github Action이 많이 사용되는 것 같습니다.
둘 다 공부할 생각이지만, 일단 상대적으로 쉬운 Github Action을 사용하여 CI/CD 환경을 구축해보겠습니다.
솔직히 처음 공부할 때에는 Github Action만 사용하면 이 친구가 배포까지 싹 자동화 시켜주는 줄 알았습니다...
그런데 제목에서부터 확인할 수 있듯이 AWS Code Deploy까지 사용해야합니다.
왜 그럴까요?
왜 그런지는 Github Action 공식 문서를 까보면 나옵니다.
[Reference : https://docs.github.com/ko/actions/learn-github-actions/understanding-github-actions]
간단하게 해석해보면, 우리가 PR과 같은 이벤트를 발생시켰을 때, 특수한 동작을 수행하도록 workflow라는 것을 만들 수 있는데, 이 workflow는 Runner라는 가상 머신에서 동작한다는 것입니다.
그럼 뭐가 문제냐?
workflow가 끝마치면 컴퓨터는 꺼지겠죠...
그래서 Github Action만 사용해서는 CI까지만 가능하며, CD를 구현하기 위해서 AWS CodeDeploy를 하용하게 된 것입니다.
그럼 CodeDeploy는 뭘까요?
AWS CodeDeploy는 EC2 인스턴스나 기타 AWS 서비스 인스턴스로 어플리케이션 배포를 자동화해주는 서비스입니다.
AWS CodeDeploy를 사용할 경우, AWS S3 버킷이나, Github Repository에 저장된 코드를 인스턴스에 자동으로 배포할 수 있다는 장점이 있습니다.
그런데 다른 분들의 코드나 공식 문서를 살펴보니, AWS S3를 사용하는 방식이 정신에 이로울 듯 합니다....
https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/integrations-partners-github.html
일단 배포 서비스를 사용할 수 있는 범위가 다르며,
이 부분은 개인적인 생각이지만, AWS S3를 사용하는 경우에는 IAM으로 사용자 인증을 해결할 수 있기에 과정이 그렇게 복잡하지는 않지만, Github를 사용하는 경우에는 사용자 인증을 추가적으로 해주어야하기 때문에 조금 복잡한 것 같습니다.
정리하자면, 우리가 구현해야할 환경은 다음과 같습니다.
일단 별도의 Repository를 생성하고, 나머지 설정은 다음에 해보도록 하겠습니다.
https://github.com/chrkb1569/DevOps-Practice
https://www.redhat.com/ko/topics/devops/what-is-ci-cd
https://katalon.com/resources-center/blog/continuous-delivery-vs-continuous-deployment
https://docs.github.com/ko/actions/learn-github-actions/understanding-github-actions
너무 정리가 잘되어있네요 잘읽고갑니다