본문 바로가기

카테고리 없음

[사이드프로젝트] 프로젝트 설정 - CI/CD

728x90

2022.09.28 - [분류 전체보기] - [사이드프로젝트] 사전 준비

 

[사이드프로젝트] 사전 준비

사이드 프로젝트를 곧 시작할 것 같아, 인프라 환경을 어떤 것을 사용하고 구축해야할 지 사전 조사를 해보았다. 내가 조사를 하면서 가장 중요하게 생각했던 것은 과하지 않을 것이었다. 물론

juna-dev.tistory.com

어느정도 조사를 하고 나서 프로젝트 세팅을 시작했다. 우선 git에서 사용할 CI/CD를 구축하기로 했다. 이를 위해 먼저 s3, RDS를 먼저 생성하고, CI가 완료된 후에는 EC2, CodeDeploy를 만들었다.

CI

git action

참고자료 :

GitHub-Actions로 CI/CD 구축하기(AWS, Docker, SpringBoot)

회사에서 스프링 개발을 할 때, CI를 젠킨스로 했었는데, 젠킨스 서버를 띄우고 구축하는데도 시간이 걸려서 git에서 제공하는 git action을 사용했다. secret들은 github repo에 저장해두고 CI/CD 시 가져갈 수 있도록 구성했다.

git action을 사용한 김에, pr 날릴 때 빌드 및 테스트 검사까지 실행하여, 머지 전에 컴파일 에러나 테스트 통과 여부를 확인할 수 있게 하였다.

name: On feature

on:
  pull_request:    
    branches: [ master ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'

      - name: Gradle Caching
        uses: actions/cache@v3
        with:
          path: |
            ~/.gradle/caches
            ~/.gradle/wrapper
          key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
          restore-keys: |
            ${{ runner.os }}-gradle-
      - name: Setup ENV
        run: echo "ENV Setup"
        env:
              db_user: ${{ secrets.DB_USER }}
              password: ${{ secrets.DB_PASSWORD }}
              kakao_client_id: ${{ secrets.KAKAO_CLIENT_ID }}
              kakao_client_secret: ${{ secrets.KAKAO_CLIENT_SECRET }}
              kakao_redirect_url: ${{ secrets.KAKAO_REDIRECT_URL }}

      - name: Grant execute permission for gradlew
        run: chmod +x gradlew

      - name: Build with Gradle
        uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
        with:
          arguments: build -x test

      - name: Test with Gradle
        run: SPRING_PROFILES_ACTIVE=[dev] ./gradlew test

      - name: Publish Unit Test Results
        uses: EnricoMi/publish-unit-test-result-action@v1
        if: ${{ always() }}
        with:
          files: build/test-results/**/*.xml
  1. 현재 사용중인 자바 버전에 맞게 17을 세팅
  2. gradle 캐싱
  3. 환경 변수 세팅
  4. gradle 실행 권한 부여
  5. 빌드 (테스트 제외)
  6. 테스트 실행
  7. 테스트 결과 기록

여기까지는 pr 에만 적용되는 action이었고, 이제 정말 CI를 할 수 있는 action을 따로 작성했다.

name: On master

on:
  push:
    branches: [ master ]
...
- name: Make zip file
  run: zip -qq -r ./$GITHUB_SHA.zip .
  shell: bash

- name: Configure AWS credentials
  uses: aws-actions/configure-aws-credentials@v1
  with:
    aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
    aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
    aws-region: ap-northeast-2

- name: Upload to S3
  run: aws s3 cp --acl private --region ap-northeast-2 ./$GITHUB_SHA.zip s3://{{bucket_name}}/build/$GITHUB_SHA.zip

pr이 머지되어 master 브랜치로 푸시가 일어났을 경우,

  1. 빌드 파일을 $GITHUB_SHA.zip 으로 압축 ($GITHUB_SHA는 git action built in env variable임. 값 충돌이 거의 없음)
  2. aws에서 IAM 사용자의 access_key와 secret을 세팅
  3. s3 버킷에 업로드

순으로 빌드 파일을 s3에 올렸다.

S3

s3 만드는 것 자체는 어렵지 않으니 패스. IAM 권한 설정이 처음에 약간 어려웠다.

1. 우선 IAM에 들어가서 사용자 추가

2. 액세스 키로 자격 증명 선택

3. 권한 설정에서 기존 정책 직접 연결에서 AmazonS3FullAccess 추가

4. 생성된 사용자 액세스 키 다운 및 저장 (꼭 필요하니 저장해둬야함)

5. 해당 값들로 env 세팅

CD

RDS

1. Amazon Aurora는 프리티어 불가능 → MySQL 선택

2. db user, password 설정

3. 생성된 EC2가 있으면 EC2 컴퓨팅 리소스에 연결 을 선택. 안해도 나중에 직접 추가 가능

4. 추가 구성에서 초기 데이터베이스 이름 설정 및 백업 비활성화 → db이름 설정 안하면 나중에 직접 들어가서 생성해야되는 귀찮은 일 발생. 백업 활성화 하면 잘못하면 프리티어 이상 사용으로 과금 청구 가능성

5. 보안 그룹 - 인바운드 규칙 편집에서 내 IP 및 ec2 IP or ec2에서 사용하고 있는 vpc 그룹추가

EC2 & code deploy

ec2 생성은 어렵지 않으니 패스.

code deploy는 git action에서 트리거를 주면 code deploy가 s3에 접근하여 빌드 파일을 가져와 해당 파일을 배포하는 시스템 (ec2에 배포하면 무료라고 함)

우선 이놈도 IAM 권한이 필요함.. 이번엔 사용자에게 권한을 주는게 아니라 ec2, code deploy에게 권한을 줘야함.

먼저 code deploy부터

1. IAM 역할에 들어가서 역할 만들기

2. code deploy에게 권한을 줄 것이기에, 사용 사례에서 CodeDeploy 선택

3. 권한 추가에서 AWSCodeDeployRole 추가

4. 역할 생성

5. Code Deploy 서비스에 들어가서 애플리케이션 생성

6. 애플리케이션에 들어가 배포 그룹 생성 (역할은 아까 만들어 둔 역할을 하면 권한이 부여됨)

7. 환경 구성은 ec2에 배포할 것이기에 ec2 인스턴스 선택

8. 로드밸런서가 없기에 활성화 안함

ec2에 code deploy agent 설치가 필요

sudo apt update
sudo apt install ruby-full
wget <https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install>
chmod +x ./install
sudo ./install auto

ruby 3.0이 설치되면 안됨 → code deploy agent가 2.x로 이루어져 있음

sudo service codedeploy-agent start && sudo service codedeploy-agent status 로 설치 및 동작 확인

또한, ec2에서 code deploy가 동작할 수 있게 권한 부여 필요.

1. IAM - 역할에 들어가서 사용 사례를 EC2 선택

2. AWSCodeDeployFullAccess AWSCodeDeployRole AmazonEC2RoleforAWSCodeDeploy 추가 (나는 ClouldWatch까지 사용할 계획이었기 때문에 CloudWatchFullAccess 도 추가

3. 역할 생성한 후, ec2 서비스에서 IAM 역할 수정 클릭 및 만든 역할로 업데이트

4. 업데이트 하고 나서 ec2에 접속하여 sudo service codedeploy-agent restart

git action 추가

master push가 일어나고, 해당 빌드파일을 배포하기 위한 명령어 추가

- name: Code Deploy
        run: aws deploy create-deployment --application-name {{name}} --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name {{groupName}} --s3-location bucket={{bucketName}},bundleType=zip,key=build/$GITHUB_SHA.zip

 

728x90