Docker와 Github Action 을 이용해 CI/CD

JungSungHo·2023년 5월 31일
0

Docker

목록 보기
3/6

Docker 란?

Github 란?

  • 깃허브GitHub는 분산 버전 컨트롤 소프트웨어 깃Git을 기반으로 소스 코드를 호스팅 하고, 협업 지원 기능들을 지원하는 마이크로소프트Microsoft의 웹서비스입니다. 2020년 현재 가장 인기 있는 소스 코드 호스팅 서비스이자 소프트웨어 개발 플랫폼이다.

CI / CD 란?

  • CI/CD (Continuous Integration/Continuous Delivery)는 애플리케이션 개발 단계를 자동화하여 애플리케이션을 더욱 짧은 주기로 고객에게 제공하는 방법입니다. CI/CD의 기본 개념은 지속적인 통합, 지속적인 서비스 제공, 지속적인 배포입니다. CI/CD는 새로운 코드 통합으로 인해 개발 및 운영팀에 발생하는 문제(일명 "통합 지옥(integration hell)")를 해결하기 위한 솔루션입니다.
    특히, CI/CD는 애플리케이션의 통합 및 테스트 단계에서부터 제공 및 배포에 이르는 애플리케이션의 라이프사이클 전체에 걸쳐 지속적인 자동화와 지속적인 모니터링을 제공합니다. 이러한 구축 사례를 일반적으로 “CI/CD 파이프라인”이라 부르며, 개발 및 운영팀의 애자일 방식 협력을 통해 DevOps 또는 SRE(사이트 신뢰성 엔지니어링) 방식으로 지원됩니다.
  • CI/CD란 무엇입니까? - RedHat 공식문서

Github Action 이란?

  • GitHub Actions는 GitHub에서 제공하는 서비스로, 빌드, 테스트, 배포 파이프라인을 자동화할 수 있는 CI(Continuous Integration, 지속 통합)와 CD(Continuous Deployment, 지속 배포) 플랫폼입니다.

위 네가지 요소에 AWS 를 결합하여 간단한 CI/CD 파이프라인을 구성해볼 수 있다.

파이프라인

파이프라인은 아래 그림과 같다.

-> 사용자가 visual code studio를 통해서 코드를 작성하고 이를 Github에 올리면,
-> 이를 AWS Elastic Computing Registry에 올리고
-> Github Action 을 통하여 CI/CD를 구현하는 것이다.


1. 배포할 서비스 dockerfile 작성

#dockerfile   -> dockerfile의 경우 확장자가 없습니다.

FROM ubuntu:latest
LABEL MAINTAINER="leosunghojung"

RUN apt-get update
RUN apt-get install -y nginx
RUN echo "nginx container"
WORKDIR /desktop/study
CMD [ "nginx", "-g", "daemon off;" ]
EXPOSE  80

2. dockerfile로 이미지 build, container run 해보기

docker build -t asc:v1 .  # 맨 마지막에 있는 . 빠트리지 않을 것
docker run -p 8080:80 --name practice -d --rm asc:v1
  • docker run: Docker 컨테이너를 실행하는 명령어입니다.
  • -p 8080:80: 호스트의 8080 포트를 컨테이너의 80 포트에 매핑합니다. 이렇게 함으로써 호스트의 8080 포트를 통해 컨테이너 내부의 웹 서버에 접근할 수 있습니다.
  • --name practice: 컨테이너에 practice라는 이름을 지정합니다.
  • -d: 컨테이너를 백그라운드에서 실행합니다.
  • --rm: 컨테이너가 종료될 때 컨테이너 자체를 자동으로 삭제합니다.
  • asc:v1: 실행할 Docker 이미지의 이름과 태그입니다. asc:v1 이미지를 실행합니다.

3. 도커허브에 이미지 업로드하기

도커 허브에 업로드하기 위해선 도커허브에 가입을 우선적으로 해야합니다.

# 도커허브의 계정으로 로그인
docker login

# 가입할때 지정한 username을 넣고 태그를 바꿔줘야합니다.
# username이 leo라면 이때는 leo/asc:v1입니다.
docker tag asc:v1 username/asc:v1

# docker image를 dockerhub에 업로드
docker push username/asc:v1

# dockerhub에 올라간 내 이미지 검색 
docker search username/asc:v1

잘 올라갔다면 아래와 같이 확인 가능합니다.

5. docker-compose 를 통한 서비스 구성

# docker-compose.yml

services:
  manager:
    image: leosunghojung/asc:v1
    ports:
      - "8002:80"

6. Github Repository 생성후 만든 파일들 commit, push

  • dockerfile, docker-compose.yml 파일이 존재하는 폴더를 깃허브와 연결하고,
  • 해당 파일들을 레포지토리에 push 합니다.
git status 
git add . 
git commit -m "add files for CI/CD"
git status
git push

7. AWS IAM 권한설정 및 ECR Repository 생성

AWS 의 IAM 서비스에서 권한을 설정해줘야합니다.

계정의 보안 자격 증명 탭에서 권한 및 정책을 설정해줄 수 있습니다. 여기서는
-> AmazonEC2ContainerRegistryFullAccess
-> AmazonElasticContainerRegistryPublicAccess
위 두가지를 포함해주어야합니다.

이제 Elastic Container Registry 서비스를 찾아서 들어갑니다.

레포지토리 생성하기를 선택하고, 레포지토리 이름만 채워주고 생성해줍니다.

8. Github Action 환경변수 설정

AWS_ACCESS_KEY
AWS_SECRET_ACCESS_KEY
AWS_REGION
위 세개는 사람마다 다르기때문에 따로 환경변수로 설정해주어야 합니다.

(3) New repository secret 를 선택하면 아래 존재하는 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY를 설정할 수 있습니다.


Variables 탭으로 바꿔주고 (2) New repository secret 를 선택하면 AWS_REGION을 설정할 수 있습니다.
각자의 REGION은 AWS 각자의 계정마다 다를 수 있습니다.

내 보안자격 증명에 들어가 엑세스 키 만들기를 통해 엑세스 키를 발급받을 수 있습니다.

9. 이제 Github Action을 통해서 Workflow를 구성합니다.

이전에 생성한 Repository의 Action 탭에 들어가서 (2) Set up a workflow yourself 를 선택해줍니다.

workflow는 대부분 yml 파일로 정의됩니다.

ecr.yml

# This is a basic workflow to help you get started with Actions

name: Image push Amazon ECR

# Controls when the workflow will run
on:
  # Triggers the workflow on push or pull request events but only for the "main" branch
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:
  
env:
  AWS_REGION: us-east-1
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  deploy:
    name: Deploy image
    # The type of runner that the job will run on
    runs-on: ubuntu-latest
    environment: production

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - name: Checkout
        uses: actions/checkout@v3
        
      - name: Config AWS credentials
        uses: aws-actions/configure-aws-credentials@v2
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ env.AWS_REGION }}
          
      - name: Login to Amazon ECR
        id: login-ecr-public
        uses: aws-actions/amazon-ecr-login@v1
        with:
          registry-type: public
          
      - name: Build, tag, and push image to Amazon ECR
        id: build-image
        env:
          REGISTRY: ${{ steps.login-ecr-public.outputs.registry }}
          REGISTRY_ALIAS: u2b2c2k9
          REPOSITORY: asc_github_action
          IMAGE_TAG: ${{ github.sha }}
        run: |
          # Build a docker container and
          # push it to ECR so that it can
          # be deployed to ECS.
          docker build -t $REGISTRY/$REGISTRY_ALIAS/$REPOSITORY:$IMAGE_TAG .
          docker push $REGISTRY/$REGISTRY_ALIAS/$REPOSITORY:$IMAGE_TAG
          echo "::set-output name=image::$REGISTRY/$REGISTRY_ALIAS/$REPOSITORY:$IMAGE_TAG"

10 Github Action 지켜보기


이제 빨간색 오류가 안뜨길 기도하면서 기다립니다.

소리를 질러봅니다!! 나이스!!

0개의 댓글