CI/CD 과정 대략적으로 복기해보았다

JP·2022년 1월 9일
0

이전에 실제 도메인을 사서 웹 사이트를 배포해보고 싶다는 마음에 만든 사이트가 있다.
오늘의 역사

css가...pc에서만 볼 수 있을 것이다....
내용과 css나 그런걸 떠나서 내가 하고자 했던건 실제 배포 환경 구축이였다.

그런데 이 과정이 시간이 지나면서 다 까먹었기 때문에 지금 간략하게나마 정리하려고 한다.

  1. EC2에 깃을 설치
sudo yum install git
  1. git clone으로 프로젝트를 저장할 디렉터리 생성 & 깃 클론
mkdir ~/app && mkdir ~/app/저장할디렉터리이름
cd ~/app/저장할디렉터리이름
git clone 깃주소

와 같은 방식으로 깃 프로젝트를 클론 했었다.

이러한 깃 클론을 이용하여 서버에 프로젝트를 받고, 새로운 코드들을 pull 하고 재 빌드하고 다시 프로젝트를 런하고... 이러한 과정들을 배포 라고 한다.

하지만 매번 작성한 코드들을 직접 명령어를 치면서 실행하는 것은 불편함이 많다.

그래서 우리는 script를 짜서 위의 명령들을 자동화 할 것이다.
예컨데,
1. 프로젝트로 이동
2. git pull
3. 빌드
4. jar파일 복사/이동
5. 현재 프로젝트 종료
6. 실행한 jar파일을 찾아 실행

이 과정을 script화 하여 편리하게 배포를 할 수 있다.

CI&CD?

하지만 우리가 script를 실행할 필요도 없이 자동화 할 수 있다.
git에 소스코드가 반영되면 자동으로 빌드가 수행되면서 배포할 jar파일을 만드는 과정,
이 결과물을 운영 서버에 무중단 배포까지 하며 진행하는 것
이 둘을 CI(Continuous Integeration) & CD(Continuous Deployment), 지속적 통합과 배포라고 부른다.

소스코드를 CI해주는 툴로는 젠킨스, Travis와 같은 것들이 있는 것 같은데
나는 제3의 툴을 더 이상 사용하기 싫어서 github에서 제공해주는 git actions를 사용하였다.

name: Git Actions

on:
  push:
    branches: 
      - master
  pull_request:
    branches: 
      - master

env:
  S3_BUCKET_NAME: S3버켓네임

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Set up JDK 11
        uses: actions/setup-java@v1
        with:
          java-version: 11

      - name: Grant execute permission for gradlew
        run: chmod +x ./gradlew
        shell: bash

      - name: Grant execute permission for .sh
        run: chmod +x scripts/*.sh
        shell: bash

      - name: Build with Gradle
        run: ./gradlew build
        shell: bash

      - name: Make zip file
        run: zip -r ./$GITHUB_SHA.zip .
        shell: bash
      
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_S3_ACCESS_KEY}}
          aws-secret-access-key: ${{ secrets.AWS_S3_SECRET_KEY }}
          aws-region: ${{ secrets.AWS_REGION }}
          
      - name: Upload to S3
        run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip
        
      - name: Code Deploy
        run: aws deploy create-deployment --application-name 어플리케이션네임 --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name 배포그룹네임 --s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=$GITHUB_SHA.zip

위의 script를 보면 깃에 master브랜치에 push, pull request 될 때마다 반영 되게 해놓았고,
build잡을 통해 jar파일을 .zip 형태로 만들어 S3 Bucket에 올리는 것을 확인 할 수 있다.

jar파일을 저장할 S3 저장소를 만들어준다. S3에 올라간 jar 파일은 다시 AWS내에서 code deploy라는 서비스를 통해 EC2에 배포하게 된다.
code deploy 를 이용하기 전에 배포 대상인 EC2code deploy를 연동 받을 수 있게 IAM 역할을 생성했다.
그리고 EC2에서 code deploy를 이용할 수 있게 code deploy 에이전트를 설치했다.


위의 과정들은 단순히 과정을 복기하고자 쓴 내용이고
이 과정안에 이루어졌던 많은 일들은 아직도 나에겐 너무 어렵다.
nginx를 이용하여 무중단 배포를 해보았고, https를 적용하기 위해 CA에서 인증서를 발급받고..
여러 일들이 있었는데 고작 한번 해본거로는 잘 정리가 안된다.

프로젝트를 진행할 때 정리를 해놨어야 조금은 기억이 날텐데 그 때는 급한 마음에 우선 빨리 만들어보자라는 식으로 여러 블로그나 책을 뒤져가며 코드만 급급하게 썻었다. 다시 한번 반성....

아무튼 위의 과정들을 시간이 되면 꼭 꼭 다시 한번 해보면서 모든 과정들을 기록하고 복기하자!!!!!

profile
to Infinity and b

0개의 댓글