[CICD] 근데 이제 ECR과 ECS를 곁들인...

Hocaron·2021년 12월 9일
3

DevOps

목록 보기
1/5
post-custom-banner

CICD 환경을 구축하는 방법은 정말 다양하다.
그래서 처음 시도해볼때, 더 어려웠다. 눈물같던 80커밋 절대 잊지 못해

내가 본 방법은 크게 3가지였다.

Github Action이란?

  • 소프트웨어 workflow를 자동화할 수 있도록 도와주는 도구
  • Workflow의 대표적인 예
    • Test Code
    • 배포
    • 기타 자동화하고 싶은 스크립트
    • 다양한 프레임워크 버전에서 실행되는지 확인

작성에 들어가기 전에

1) Workflow

  • 여러 Job으로 구성되고, Event에 의해 트리거될 수 있는 자동화된 프로세스
    최상위 개념
  • Workflow 파일은 YAML으로 작성되고, Github Repository의 .github/workflows 폴더 아래에 저장

2) Event

  • Workflow를 Trigger(실행)하는 특정 활동이나 규칙
  • Webhook을 사용해 외부 이벤트를 통해 실행

3) Job

  • Job은 여러 Step으로 구성되고, 가상 환경의 인스턴스에서 실행
  • 다른 Job에 의존 관계를 가질 수 있고, 독립적으로 병렬 실행도 가능

4) Step

  • Task들의 집합으로, 커맨드를 날리거나 action을 실행할 수 있다.

5) Action

  • Workflow의 가장 작은 블럭(smallest portable building block)
  • Job을 만들기 위해 Step들을 연결
  • 재사용이 가능한 컴포넌트
  • 개인적으로 만든 Action을 사용할 수도 있고, Marketplace에 있는 공용 Action을 사용할 수도 있다(찾아보면 기능이 정말 많다)

6) Runner

  • Gitbub Action Runner 어플리케이션이 설치된 머신으로, Workflow가 실행될 인스턴스
  • Github에서 호스팅해주는 Github-hosted runner와 직접 호스팅하는 Self-hosted runner로 나뉨

yml 파일 예시

  name: CI
	
  on: // 어떤 조건에 Workflow를 Trigger 시킬지 작성
    push:
      branches: [ master ] // 단일 Event를 사용할 수도 있고, array로 작성가능
    pull_request:
      branches: [ master ]
	
  jobs: // 여러 Job이 있을 경우, Default로 병렬 실행
    build:
      runs-on: ubuntu-latest
	
      steps:
      - uses: actions/checkout@v2
	
      - name: Run a one-line script
        run: echo Hello, world!
	
      - name: Run a multi-line script
        run: |
          echo Add other actions to build,
          echo test, and deploy your project.

AWS ECR 푸시 & AWS ECS 배포

CICD 아키텍쳐

CI.yml

  • 라이브러리 설치 후에 린트 에러, 테스트 진행
name: CI

on:
  pull_request:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    
    strategy:
      matrix:
        node-version: [14.x]
        
    steps:
    - uses: actions/checkout@v2
    - name: Install packages
    run: npm ci
    - name: Lint
    run: npm run lint
   	- name: Test
    run: npm run test

CD.yml

  • AWS 자격증명
  • ECR 이미지 빌드 후 푸시
  • ECS task definition 다운로드
  • task definition에 따라 ECS에 배포
  • 환경변수도 task definition container 부분에 넣으면 인식 가능
on:
  push:
    branches:
      - main

name: Deploy to Amazon ECS

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest

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

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

      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v1

      - name: Build, tag, and push image to Amazon ECR
        id: build-image
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          ECR_REPOSITORY: <ecr-repository>
          IMAGE_TAG: latest
        run: |
          # Build a docker container and
          # push it to ECR so that it can
          # be deployed to ECS.
          docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
          echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"
      - name: Download task definition
        run: |
          aws ecs describe-task-definition --task-definition taskdef --query taskDefinition > task-definition.json
      - name: Fill in the new image ID in the Amazon ECS task definition
        id: task-def
        uses: aws-actions/amazon-ecs-render-task-definition@v1
        with:
          task-definition: task-definition.json
          container-name: <container-name>
          image: ${{ steps.build-image.outputs.image }}

      - name: Deploy Amazon ECS task definition
        uses: aws-actions/amazon-ecs-deploy-task-definition@v1
        with:
          task-definition: ${{ steps.task-def.outputs.task-definition }}
          service: <service-name>
          cluster: <cluster-name>
          wait-for-service-stability: true

AWS 설정

이번 프로젝트에서 위 방식으로 CICD를 붙일 예정이기 때문에, 캡처에서 올려야지.

마지막 한마디

🌷컨테이너 관리에 대해 공부해야겠다. 궁금해져버렸어.🌷

profile
기록을 통한 성장을
post-custom-banner

0개의 댓글