[CI/CD 자동화] Jenkins + AWS CodeDeploy

jonghyukLee·2022년 11월 6일
0

안녕하세요!
오늘은 Jenkins와 AWS CodeDeploy를 사용하여 CI/CD 자동화를 구축했던 내용을 업로드 하려고 합니다.

왜?

프로젝트 초기 단계에서 코드 수정이 자주 발생할 수 밖에 없었는데, 그 와중에 저희 팀이 테스트를 진행하고 배포하는 방식은 이랬습니다.
1. 브랜치 분리 후 로컬 작업
2. pull request
3. 팀원이 코드 리뷰 후 승인 해주면 merge
4. 서버 인스턴스(EC2) 2개에 각각 ssh 접속해서 배포 스크립트 실행 (더 초반에는 이마저도 수동이었습니다...)
5. 심지어 yml 설정파일은 gitignore가 걸려있어서, 변경될 때 마다 수동으로 옮기고 수정해야 했습니다.

정말 비효율적이라 생각했고, 하루 빨리 자동화를 구축하고 싶었으나..
초반에는 AWS도 이제 막 익숙해지는 단계였고, Jenkins나 GitHub Actions도 한번도 다뤄본 적 없었기 때문에, 소모될 시간이 우려되어 미뤄왔던 것 같습니다ㅠ
개발을 진행할수록 필요성이 느껴졌고, 갑자기 문득 깨달음? 을 얻어서 하루 날잡고 씨름한 끝에 완성할 수 있었습니다 ㅎㅎ

제가 저희 프로젝트에 적용한 흐름은 아래와 같습니다.

흐름 설계

  1. 설정한 git 브랜치에 코드를 push
  2. github -> Jenkins web hook 발생
  3. Jenkins build/test
  4. 성공 시 S3에 결과물을 업로드
  5. Jenkins -> CodeDeploy 배포 요청(빌드 후 조치)
  6. CodeDeploy가 배포 수행 (블루그린 방식)

복잡해 보이지만, 한번 세팅하면 저희의 역할은 1번 뿐이기 때문에..ㅎㅎㅎ

설정


그럼 설정을 시작해보겠습니다.
세부적인 AWS 로드밸런서, 타겟그룹 등의 설정은 기존 방식과 크게 다르지 않기 때문에, 생략했습니다.

AWS CodeDeploy

가장 먼저, CodeDeploy부터 설정하겠습니다.

애플리케이션 생성

애플리케이션을 생성해야합니다.
AWS CodeDeploy 서비스로 이동하면, 간단하게 이름만 입력하여 생성할 수 있습니다.

배포그룹

배포 그룹을 생성합니다.
배포 그룹에는 CodeDeploy뿐만 아니라 AutoScaling에 관한 권한도 필요합니다.
설정값을 환경에 맞게 세팅하고 생성합니다.


S3

S3 버킷도 하나 생성해줍니다.


Jenkins

다음은 Jenkins 입니다.
저는 EC2 인스턴스를 하나 생성해서 Docker 컨테이너 위에 Jenkins를 설치했습니다.
여기서 주의할 점은, Jenkins는 기본 포트로 8080을 사용하기 때문에 저처럼 Spring에서 이미 사용하고 계시다면 포트를 변경해주어야 합니다! 저는 9090으로 사용했습니다.

인스턴스를 생성했다면, Jenkins 서버에 접속합니다.

플러그인

먼저 플러그인을 설치해야 합니다.
CodeDeploy 플러그인을 설치합니다.
꽤 오래걸립니다 ㅠ

프로젝트 생성

설치를 마쳤다면, 새 프로젝트를 생성해줍니다.
저는 빈 프로젝트로 생성했습니다.

Git Repository 설정


저는 운영 서버 이전에, 테스트를 위해 주로 사용하는 개발 서버용 develop 브랜치를 등록했습니다.

위 옵션도 체크해줍니다.

빌드 스크립트


빌드를 진행하기 위한 스크립트입니다.
저는 겪어보지 못했지만, 실행 권한이 없어서 오류를 마주한 분이 있다고 해서, 실행 권한을 먼저 부여하고, 빌드합니다.
참고로 -x test를 추가하면 테스트를 생략하고 빌드할 수 있습니다.

빌드 후 조치


저희는 빌드 후에 CodeDeploy를 사용해 배포할 것이므로,
Deploy an application to AWS CodeDeploy를 선택합니다.
위 옵션이 보이지 않는다면, 플러그인 설치가 제대로 되지 않은 것이므로, 확인해주면 됩니다.

AWS CodeDeploy Application Name: CodeDeploy에 생성한 어플리케이션명
AWS CodeDeploy Deployment Group: 배포 그룹명
S3 Bucket: S3 버켓명
Include Files: S3에 업로드 포함할 파일명
Exclude Files: 업로드 제외할 파일명
Use Access/Secret keys: S3, CodeDeploy에 Access 권한이 있는 IAM 계정의 키를 입력합니다.


GitHub

마지막으로, web hook 설정입니다.
git repository -> settings -> webhooks 에 접속하여 webhook을 생성합니다.
Payload URL을 기입할때는
http://젠킨스서버:포트/github-webhook/
이런 식으로 뒤에 github-webhook/을 붙여줍니다.
/까지 붙여줘야 원활하게 동작합니다.

이런식으로, 초록색 체크표시가 뜨면 성공입니다.


이로서 모든 세팅이 끝났습니다.
설정한 브랜치에 push 이벤트를 발생시켜 보시면, Jenkins부터 CodeDeploy까지 정상적으로 넘어가서 배포가 이루어지는 것을 확인하실 수 있습니다.

이렇게 모든 세팅을 마쳤습니다!
코드 push 후에 화장실도 다녀오고, 물한잔 할 수 있는 여유가 생겨서 너무 뿌듯하네요..
프로젝트 초기 단계에 세팅해놓으면 개발 효율을 크게 단축할 수 있을것 같습니다 ㅎㅎ

profile
머무르지 않기!

0개의 댓글