우아한테크코스 미션을 하던 도중에 있던 CI/CD 에서 CD를 구축한 과정을 정리하게 되었습니다
코드는 여기서 확인하실 수 있습니다
CI/CD 란?
아주 간단한 설명을 드리겠습니다
CI(Continuous Integratoin)
지속적 통합으로, 자주자주 메인 코드베이스에 머지가 되어야 한다는 부분을 다루고 있는 부분입니다
이때 체크를 위해서 테스트를 만든다던가, 하는 과정을 거치죠
CD(Continuous Deploy)
프로덕션 환경에 자동으로 배포를 할 수 있어야 한다는 부분입니다
왜 CI/CD 가 필요한가?
우아한테크코스 환경에서는 외부에서 SSH 연결을 하지 못하게 막아두었습니다
허용해 둔다면, 어떤 사용자든 원하는 대로 SSH 연결을 해버려서, ec2를 마음대로 사용할 수 있으니 사실 당연한 거죠
하지만, 개발을 하는 입장에서는 정말 불편하게 느껴질 수도 있습니다
집에서는 절대로 코드 업데이트를 할 수 없고, 서버가 죽어도 다시 살릴 방법도 없습니다
코드를 자동으로 업데이트하는 쪽에 초점을 맞춘 부분이 CI/CD 에서 CD입니다
왜 Self Hosted Runner야?
우테코의 제약사항
1. Aws Access Key와, Aws Secret Key를 받을 수 없습니다
2. SSH 접속이 우테코 내부 IP로 고정되어 있습니다
캠퍼스에 있는 IP 로만 접속이 가능하기에, 키가 있다고 해도, 연결을 하기 힘든 상황입니다
3. 외부에서 접근 가능한 포트가 제한되어 있습니다
SSH(22) : 가 외부에서 접근하기 힘듭니다
위의 제약을 고려했을 때, 평범한 github actions 나, Jenkins 같은 것들을 사용하기 힘든 상황이라고 판단했습니다
Self Hosted Runner를 사용하면 뭐가 해결되는데?
1. Secret Key와 Access Key 가 필요하지 않습니다
키가 없어도 접근이 가능하기에, 1번 제약 조건을 넘어갈 수 있습니다
이때, 레포지토리에 대한 권한이 필요하지만, fork를 받은 브랜치는 자유롭게 사용 가능합니다
2. SSH 접속이 필요하지 않습니다
3. 외부에서 접속을 하지 않습니다
EC2에서 outbound 트래픽만 443으로 허용되어 있으면 괜찮기에, 우테코의 제약사항을 넘어갈 수 있습니다
먼저 해야 하는 일
현재 저희의 EC2 환경은 램의 크기가 작아서, 위 과정을 따라 하시면, 서버가 죽을 수 있습니다
램이 부족해서, 제대로 작동을 하지 못하고, 서버가 죽어있게 됩니다
이를 해결하기 위한 방법으로 Swap 메모리가 있는데요
Swap 메모리 설정
Ram 이 부족하면, 하드디스크를 Ram처럼 사용할 수 있도록 하는 설정입니다
당연하지만, 많이 사용하게 되면 CPU 자원이 사용되기에, 성능이 떨어질 수 있습니다
설정하는 과정은 여기에 있습니다
이때, 2GB를 사용하면 최대 8GB의 EBS에 부담이 될 수 있기에, 1GB 만 사용하도록 하겠습니다
sudo fallocate -l 1G /swapfile
하고 나면 위와 같은 free -m 명령어로 확인해 볼 수 있습니다.
잘 적용되었다면 Swap: 부분이 있겠죠
작업 흐름
1. Github actions SelfHosted 등록
포크 받은 github 레포지트리에서, 아래 사진의 순서대로 선택을 하고
들어가면 아래와 같은 화면이 나오는데요
자신이 이 Runner를 돌리고 싶은 환경을 선택하고 나서
아래에 나오는 Configure까지 순서대로 콘솔에 입력합니다.
복사를 지원하니 편하게 붙여 넣을 수 있습니다
./run.cmd 같은 # Run it!
부분에서는 ubuntu 환경의 경우 아래의 명령을 사용하면
nohup ./run.sh &
백그라운드에서, 터미널을 닫아도 계속 실행하게 만들 수 있습니다
제일 밑에 나오는 runs-on 부분은 github actions 파일에서 사용되니, 지금은 무시하셔도 됩니다
2. Github workflow 파일 생성
.github/workflows
폴더 안에 yml을 만듭니다
저의 경우는 deploy.yml을 만들었습니다
# github actions 에서 보이는 이름입니다
name: deploy
# 언제 이 yml 을 작동시키는지를 설명합니다
on:
# 수동으로 작동시킬 수 있도록 하는 설정입니다
workflow_dispatch:
# 어느 브랜치에서든 push 가 발생하면 job 을 실행합니다
push:
jobs:
# 이 job 의 이름입니다
deploy:
# 우리가 등록한 Github Self Hosted Runner 에서 실행합니다
runs-on: self-hosted
# 잡의 구체적인 단계입니다
steps:
# 처음 _work 폴더에 github actions 프로그램이 파일을 수정할 권한이 없어서, 권한을 부여해 주기 위한 작업입니다
# 이 명령을 통해서 이미 있는 폴더에 git pull 을 사용할 수 있습니다
- name: change permission
# 마지막 jwp-shopping-order 는 repository 이름입니다.
run: |
sudo chown -R ubuntu:ubuntu /home/ubuntu/actions-runner/_work/jwp-shopping-order
# git clone, git pull, git fetch 같은 작업을 단순화 하기 위한 action 입니다. actions/checkout@v3
# 미리 다른 개발자가 만들어둔 action 을 사용한다는 의미입니다
- uses: actions/checkout@v3
# bootjar 를 만들고, 실행시키는 과정을 담고 있습니다
- name: gradle bootjar
# 처음에 ./gradlew 파일을 실행할 수 없어서, chmod 로 실행 가능하도록 바꿔줍니다
run: |
chmod +x ./gradlew
./gradlew bootjar
# 80 번 포트가 이미 있다면, 그 프로그램을 종료합니다
- name: kill 80 port if exist
run: |
if sudo lsof -i :80; then
echo "Port 80 is already in use. Killing the process..."
sudo lsof -i :80 | awk 'NR!=1 {print $2}' | sudo xargs kill -9
fi
# 스프링 프로그램을 실행합니다
- name: deploy
run: |
sudo java -jar build/libs/jwp-shopping-order.jar --spring.profiles.active=prod &
위와 같은 yml 을 작성해 둔다면, 설명에 따라 실행되게 됩니다
주의점
Swap 파일 설정을 안 했을 경우에, Ram의 부족으로, ec2의 작동이 멈출 수 있습니다
ec2를 재부팅하고 나면, 해결되어 있습니다
.github/workflows 폴더에 yml을 작성해야 합니다
이 경로는 github에서 기본적으로 지정해 둔 경로이기에, 이 경로를 지키지 않으시면, github actions에서 읽어올 수 없어 실행되지 않습니다
계속 Picking job에서 안 넘어가요
ec2 에서 ./run.sh 가 실행되고 있는지 확인해 주세요
자동 배포 구축 완료
이렇게 자동 배포 구축이 끝났습니다
실제로, push를 하게 되면, Actions 탭에서 진행상황을 볼 수 있습니다
직접 클릭해서 들어가면
단계별로 진행상황을 확인할 수 있어서 조금 더 자세한 상황을 볼 수 있습니다
요약
github self hosted runner를 사용해서 생각보다 간단하게 배포 작업을 진행할 수 있습니다
모두 편하게 자동으로 배포할 수 있었으면 좋겠습니다
'인프라' 카테고리의 다른 글
안전하게 분산 환경에서 Lock 잡기 (Redlock) (2) | 2023.09.08 |
---|---|
private 서브넷에 인스턴스를 외부와 연결할 때, public ip? private ip? (4) | 2023.07.23 |