CI/CD란 Continuous Integration, Continuous Deployment
CI/CD는 테스트(Test), 통합(Merge), 배포(Deploy)의 과정을 자동화하는 걸 의미한다.
GitHub Actions를 통한 CI/CD를 한마디로 말하자면
깃허브에 커밋을 하면 자동으로 빌드와 테스트를 포함한 CI과정과
ec2에 연결 및 배포 관련된 CD 작업을 한방에 해주는 것을 말한다 !
도커를 통한 github Actions CI/CD를 구성해보았다.
1. Git push -> 개발자가 개발을 하고 깃허브에 푸쉬를 한다.
2. GitHub Actions -> 깃헙 액션이 이를 인식하고 아래 작성된 코드를 실행한다.
3. 2의 과정에서 생성된 Docker Image를 ECR에 푸쉬한다. ( aws ecr 권한설정 필요 )
4. 깃헙 액션이 ec2에 접속하여 도커를 실행 및 배포 명령 ( ec2 권한설정 필요)
5. 깃헙 액션 로그 확인
코드 예시
deploy.yml
name: Docker Deploy
on:
push:
branches-ignore:
- '' # 모든 브랜치에 대해 워크플로 실행
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Github Repository 파일 불러오기
uses: actions/checkout@v4
- name: JDK 17버전 설치
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- name: application.yml 파일 만들기
run: echo "${{ secrets.APPLICATION_PROPERTIES }}" > ./src/main/resources/application-secret.yml
- name: 테스트 및 빌드하기
run: ./gradlew clean build -x test
- name: AWS Resource에 접근할 수 있게 AWS credentials 설정
uses: aws-actions/configure-aws-credentials@v4
with:
aws-region: ap-northeast-2
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- name: ECR에 로그인하기
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
- name: Docker 이미지 생성
run: docker build --platform linux/amd64 -t weather-claus .
- name: Docker 이미지에 Tag 붙이기
run: docker tag weather-claus:latest 323280431927.dkr.ecr.ap-northeast-2.amazonaws.com/weather-claus:latest
- name: ECR에 Docker 이미지 Push하기
run: docker push 323280431927.dkr.ecr.ap-northeast-2.amazonaws.com/weather-claus:latest
- name: SCP로 EC2에 파일 전송하기1.
uses: appleboy/scp-action@v0.1.7 # 깃 액션 전송 라이브러리
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
source: docker-compose.prod.yml
target: ./
- name: SCP로 EC2에 파일 전송하기2.
uses: appleboy/scp-action@v0.1.7 # 깃 액션 전송 라이브러리
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
source: docker-compose.yml
target: ./
- name: SCP로 EC2에 파일 전송하기3.
uses: appleboy/scp-action@v0.1.7 # 깃 액션 전송 라이브러리
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
source: docker-compose.dev.yml
target: ./
- name: SSH로 EC2에 접속하기
uses: appleboy/ssh-action@v1.0.3
env:
DOCKER_PROPERTIES: ${{ secrets.DOCKER_ENV }}
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
envs: DOCKER_PROPERTIES
script_stop: true
script: |
docker compose down
docker compose down --remove-orphans
rm -rf ./.env
echo "$DOCKER_PROPERTIES" > ./.env
aws ecr get-login-password --region ap-northeast-2 | sudo docker login --username AWS --password-stdin 323280431927.dkr.ecr.ap-northeast-2.amazonaws.com
docker rmi -f 323280431927.dkr.ecr.ap-northeast-2.amazonaws.com/weather-claus:latest
docker rmi -f redis:latest
docker rmi -f mysql:8.0.32
sudo docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
- 수많은 실패 결과의 일부
위의 코드에는 정말 많은 개념들이 들어가 있다.
빌드경로, ec2, ecr , 도커, 도커 컴포즈, 깃헙 secret, 깃헙 액션에 대한 기본적인 지식 등등등...
개발 버킷리스트로 공부하면서 CI/CD과정이 너무 편해보이고 멋있어 보여서 꼭 해보고 싶었던 기능중에 하나이다 !!!
몇일동안 하면서 잘 안되고 스트레스 받는 경험도 많았지만 완성했을 때 너무 뿌듯했다
이제부터 진행하는 모든 프로젝트에 CI/CD를 할수있고, 좀 더 개발에 집중할수 있을 것이다.
'aws' 카테고리의 다른 글
내 db가 털렸을리 없어! (3탄) (1) | 2024.12.18 |
---|---|
내 db가 털렸을리 없어! (1탄) (1) | 2024.12.18 |
aws t3.small의 비용은 얼마일까? (0) | 2024.10.28 |