본문 바로가기

Docker

도커(docker)와 Github action(깃헙 액션)으로 CI/CD 구현하기

 

1. CI/CD란? 

 

1) 정의

CI(Continuous Integration, 지속적 통합)

여러 개발자들이 함께 개발하는 과정에서 코드가 잘 작동하는지 확인하는 것

 

CD(Continuous Deployment, 지속적 배포)

소스코드가 실제 서비스에 자동으로 반영되도록 배포하는 것

 

2) 필요성

- 개발은 혼자하지 않고 여러명의 개발자가 함께 하기 때문에 서로의 작업 영역이 충돌이 발생할 가능성이 존재함

- 정상적인 자동 배포(CD)를 하기 위해서 필요한 과정(CI)

 

3) 방법

테스트 코드를 작성하여 자동화된 테스트 실행하여 통합하고 테스트가 정상 완료되면 배포

 

 

 

자동화 툴 종류로는 github action, Travis, Circle CI, Jenkins 등이 있고 github action을 이용한 CI/CD구현을 해봄

 

2. github action 기본 문법

 

1) workflows

한개 또는 여러개의 job으로 구성되며 event에 의해서 시작되는 자동화 과정으로 빌드, 테스트, 릴리즈, 배포 등의 작업으로 보면 됨

 

2) Events

workflow를 trigger하는 push, pull request, cronjob 등의 행동들

 

3) Jobs

동일한 runner에서 실행하려고하는 여러개 step의 모임

 

4) Steps

job을 구성하는 한개의 커맨드로 action이거나 shell command로 구성됨

 

5) Actions

다른 곳에서 정의된 커맨드 모음

 

6) Runner

Job이 실행되는 환경(Ubuntu, mac OS, windows 제공)

 

 

3. yaml로 Workflows 정의

# 워크플로우 이름          
name: ci-cd-pipeline
# on: 어떤 events로 워크플로우를 실행할지 정하는 키워드, main branch에 Push 되는 경우 워크플로우 실행
on:
  push:
    branches:
      - main
jobs:
  # job1: run-test-code
  run-test-code:
    runs-on: ubuntu-latest
    steps:
      # uses 키워드: 작성자/액션명, 다른 사람들이 만든 액션을 사용할 수 있는것이 깃헙 액션의 특징   
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2
        with:
          python-version: "3.8"
      - run: pip install -r requirements.dev.txt
      - run: pytest
  # job2: build-image
  build-image:
    # needs 키워드: run-test-code를 dependeny함(run-test-code 수행 완료 후 실행)
    needs: run-test-code
    runs-on: ubuntu-latest
    steps:
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v1
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1
      - name: Login to DockerHub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      - name: Build and push
        id: docker_build
        uses: docker/build-push-action@v2
        with:
          push: true
          tags: ${{ secrets.DOCKERHUB_USERNAME }}/docker-memo:latest
      - name: Image digest
        run: echo ${{ steps.docker_build.outputs.digest }}
  # job3: cd-pipiline
  cd-pipeline:
    # needs 키워드: build-image를 dependeny함(build-image 수행 완료 후 실행) 
    needs: build-image
    name: continuos deploy
    runs-on: ubuntu-latest
    steps:
      # 스텝1, master 브랜치로 체크아웃  
      - uses: actions/checkout@master
      # 스텝2, docker-compose.yaml을 서버로 올림
      - name: copy file via ssh password
        uses: appleboy/scp-action@master
        with:
          host: ${{ secrets.HOST }}
          username: ec2-user
          key: ${{ secrets.PRIVATE_KEY }}
          port: 22
          source: "docker-compose.yaml"
          target: "/home/ec2-user/"
      # 스텝3, docker compose up
      - name: executing remote ssh commands using password
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST }}
          username: ec2-user
          key: ${{ secrets.PRIVATE_KEY }}
          port: 22
          script: "docker-compose pull && docker-compose up -d"

 

파일 위치: .github-workflows-ci-pipeline.yaml

 

 

4. job2: build-image를 실행하기 위한 준비

1) docker hub에 접속하여 docker hub access token 생성

- docker registry에 image를 push하기 위해 docker registry 인증 정보 필요

 

 

3) Git Hub 설정,키 추가

- 경로: 깃헙 리포지토리- settings - secrets-actions-new repository secret

- yaml 파일에 작성한 대로 키 이름 작성할 것! DOCKERHUB_USERNAME, DOCKERHUB_TOKEN

 

5. job3: cd-pipeline 실행을 위한 준비

1) 서버에 docker-compose.yaml을 업로드 하는 과정에 필요한 키 넣기

- HOST: 서버 IP

- PRIVATE_KEY: EC2 인스턴스 생성하고 받은 키(서버 접속에 필요한 ssh key)

(.pem 키를 깃헙 키 넣는데 끌어다 넣는 것도 안되고.. 복붙도 안되고 그래서 한참 시간 잡아먹음🥲 터미널에 cat명령어로 pem키 확인하면 되는 거 였음,

그리고 --BIGIN-- ~ --END--도 같이 넣어줘야함, 그리고 내 터미널에 저 마지막에 '%'가 왜 찍힌건지... 저것 때문에도 에러나서 뭐가 문젠지 한참 찾음😂)

 

 

2) Git Hub 설정,키 추가

 

6. 확인