aws

GitHub Actions CI/CD

Jr.고래 2024. 11. 1. 08:14

 

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