본문 바로가기
카테고리 없음

[Docker] CI/CD 기초 개념과 Github Action 활용하기

by 그리득 2024. 4. 11.
728x90

오늘은 온보딩 강의 세 번째 날로 CI/CD에 대해 간단히 배워보고 Github Action을 사용하여 실습해보겠습니다.

그러면 바로 시작하겠습니다!

CI / CD 기초 개념과 아키텍쳐

CI/CD

  • CI/CD는 소프트웨어 개발 과정에서의 효율성과 신속성을 극대화하는 자동화된 프레임워크를 제공한다. 이 접근 방식은 개발부터 운영까지의 소프트웨어 개발 라이프사이클의 모든 단계를 아우르며, 지속적 통합, 지속적 전달, 지속적 배포의 세 주요 구성 요소로 구분된다.

지속적 통합 (CI)

  • 개발자들이 작업한 코드를 주기적으로 공유 레포지토리에 병합함으로써, 코드의 통합을 자동화하는 과정이다.
  • 모든 변경사항은 자동 빌드 및 테스트를 거쳐 메인 브랜치에 통합된다.
  • 코드 충돌을 최소화하며, 소프트웨어의 품질을 유지하고, 배포 준비 상태를 지속적으로 유지할 수 있다.

지속적 전달 (CD - Continuous Delivery)

  • CI 과정을 한 단계 더 발전시켜, 코드 변경사항이 자동으로 빌드 및 테스트를 거쳐 실제 운영 환경에 배포될 준비가 된다.
  • 이 단계에서는 배포 과정을 완전히 자동화하지 않고, 실제 배포는 수동으로 트리거할 수 있는 옵션을 둔다.
  • 개발팀은 언제든지 안정적인 버전의 소프트웨어를 신속하게 배포할 준비가 되어 있으며, 비즈니스 요구에 따라 배포 시점을 선택할 수 있다.

지속적 배포 (CD - Continuous Deployment)

  • 모든 코드 변경사항이 자동 테스트를 통과하면 즉시 프로덕션 환경에 배포된다.
  • 이 과정은 개발팀이 소프트웨어를 빠르게 개선하고, 사용자에게 지속적으로 가치를 전달할 수 있도록 한다.
  • 지속적 배포를 통해, 소프트웨어의 릴리스 과정이 자동화되어, 신속하게 배포된다.
  • CI/CD 파이프라인의 도입은 개발 프로세스의 자동화뿐만 아니라, 코드 통합, 테스트, 배포 과정의 효율성을 극대화하여, 개발팀이 더 나은 소프트웨어를 더 빠르게 출시할 수 있도록 지원한다. 각 단계에서의 자동화와 통합은 코드 품질의 지속적인 개선, 개발 주기의 단축, 그리고 최종적으로는 사용자 만족도의 증대로 이어진다. CI/CD는 현대적인 소프트웨어 개발의 필수 요소로, 지속적인 개선과 경쟁력 유지를 위한 핵심 전략이다.
  • 예시
  • CI/ CD 파이프라인 도구들
    • 여러 CI/CD 파이프라인 도구들이 있으며, 각각의 도구는 고유의 특성과 장단점을 가지고 있습니다. 여기 몇 가지 주요 도구들을 소개하고, 각각에 대한 공식 문서 링크를 제공하겠습니다.
    • Jenkins
      • 장점: 매우 유연하며, 수많은 플러그인으로 확장 가능
      • 단점: 초기 설정이 복잡할 수 있음
      • Jenkins 공식 문서
    • GitHub Actions
    • GitLab CI/CD
      • 장점: 소스 코드 관리와 CI/CD가 하나의 플랫폼에 통합
      • 단점: 대규모 프로젝트에서는 자원 관리가 필요할 수 있음
      • GitLab CI/CD 공식 문서
    • CircleCI
      • 장점: 빠른 실행 속도와 좋은 확장성
      • 단점: 무료 플랜의 제한적인 리소스
      • CircleCI 공식 문서
  • Github action 을 Github Repository 사용할 때 편합니다. 무엇보다 깔끔한 공식문서. 사용자 생태계로 만들어진 수많은 자료가 있습니다.
  • https://docs.github.com/ko/actions
    • https://docs.github.com/ko/actions/guides
    • 장점
      • 깃허브 통합: GitHub 리포지토리와 긴밀하게 통합되어 있어, 추가적인 서비스나 툴 없이도 바로 CI/CD 파이프라인을 설정할 수 있다.
      • 간편한 설정: 워크플로우 파일을 리포지토리에 추가하는 것만으로 파이프라인을 구성할 수 있어, 사용하기 쉽다.
      • 유연성: 다양한 운영 체제에서 작업을 실행할 수 있으며, 컨테이너 내에서 작업을 실행할 수도 있다.
      • 마켓플레이스: 수많은 액션을 마켓플레이스에서 찾아서 사용할 수 있어, 파이프라인을 쉽게 확장할 수 있다.
    • 단점
      • 리소스 제한: 무료 플랜에서는 사용할 수 있는 리소스에 제한이 있어, 큰 프로젝트에서는 유료 플랜으로의 업그레이드가 필요할 수 있다.
      • 학습 곡선: GitHub Actions의 모든 기능을 활용하기 위해서는 YAML 문법과 GitHub Actions의 특정 개념을 익혀야 한다.
    • GitHub 리포지토리를 사용할 때 GitHub Actions가 유리한 이유는 리포지토리와의 긴밀한 통합 때문이다. 소스 코드 관리와 CI/CD 파이프라인을 같은 플랫폼에서 관리할 수 있어, 복잡성이 줄어들고 프로젝트의 효율성이 증가한다.
  • github action 자체에 대해 더 알고 싶다면 아래 공식 문서 예시를 참조

Github Action 의 동작원리

  • GitHub Actions는 GitHub 리포지토리의 이벤트(예: 푸시, 풀 리퀘스트)에 반응하여 자동화된 워크플로우를 실행하는 시스템.
  • 워크플로우는 .github/workflows 디렉토리 내 YAML 파일로 정의되며, 이 파일 내에서 작업(jobs), 단계(steps), 액션(actions) 등을 설정할 수 있음.
  • 워크플로우는 이벤트 발생 시 지정된 환경(예: Ubuntu, Windows)에서 컨테이너 또는 가상 머신 위에서 실행. 작업은 서로 독립적으로 또는 병렬로 실행될 수 있으며, 각 단계에서는 소프트웨어 빌드, 테스트, 배포 등의 작업을 수행이 가능해짐.
  • https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions
  • Workflow(작업) 은 GitHub Actions에서 실행되는 자동화 프로세스를 정의하는 단위. 각 작업은 독립적으로 실행되며, 여러 개의 단계로 구성될 수 있음.
  • Step(단계)는 각 작업 내에서 수행되는 단일 명령어 또는 액션의 연속. 작업 내에서 단계는 순차적으로 실행되며, 성공적으로 완료되어야 작업이 성공적으로 완료됨.
  • Action(액션)은 GitHub Marketplace에서 가져온 또는 직접 작성한 재사용 가능한 코드 조각. 이러한 액션은 다양한 용도로 사용될 수 있으며, CI/CD, 테스트, 배포 등과 같은 다양한 작업을 자동화하는 데 사용됨.
  • secretes:
    - https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions
    - GitHub Actions에서 secrets는 리포지토리의 중요한 데이터를 안전하게 저장하고 관리하는 데 사용. 이러한 데이터는 API 토큰, 암호, SSH 키 등과 같이 민감한 정보를 포함할 수 있음. Secrets는 보안을 유지하기 위해 암호화되어 저장되며, 워크플로우 실행 중에만 필요할 때만 복호화되어 사용됨.
    - 워크플로우에서 Secrets를 사용하려면 리포지토리 설정에서 Secrets를 설정해야 함. Secrets는 보통 환경 변수로 사용되며, 워크플로우 실행 중에 워크플로우 스크립트나 액션에서 참조됨. Secrets는 워크플로우 로그에서 안전하게 숨겨지며, 민감한 정보가 외부로 노출되지 않도록 함.
    - 보안성을 유지하기 위해, 일반적으로 Secrets는 코드와 함께 리포지토리에 직접 포함되지 않음. 대신, 안전한 방식으로 관리되고 워크플로우에서 필요한 경우에만 사용됩니다. 이를 통해 보안을 강화하고 민감한 정보가 외부로 유출되는 것을 방지할 수 있습니다.
steps:
  - name: Hello world action
    with: # Set the secret as an input
      super_secret: ${{ secrets.SuperSecret }}
    env: # Or as an environment variable
      super_secret: ${{ secrets.SuperSecret }}
  • 이러한 구성 요소들을 조합하여 GitHub Actions를 사용하면 소프트웨어 개발 및 배포 프로세스를 자동화할 수 있음.

Github Action 사용하기 실습

  • [실습1] repository 만들기 - action 들어가기 - 클릭 후 만들기(commit & push)

깃허브 로그인 후 Top Repositories - New 클릭

레파지토리명 입력 후 Create repository 클릭

생성된 레파지토리에 접속해서 Actions - Simple workflow - Configure 클릭

 

# 이것은 Actions를 시작하는 데 도움이 되는 기본 워크플로우입니다

name: CI

# 워크플로우가 실행될 시점을 제어합니다
on:
  # "main" 브랜치에 대한 push 또는 pull request 이벤트가 발생했을 때 워크플로우를 트리거합니다
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

  # Actions 탭에서 이 워크플로우를 수동으로 실행할 수 있습니다
  workflow_dispatch:

# 워크플로우 실행은 하나 이상의 작업으로 구성되며, 이러한 작업은 순차적으로 또는 병렬로 실행될 수 있습니다
jobs:
  # 이 워크플로우는 "build"라고 불리는 단일 작업을 포함합니다
  build:
    # 작업이 실행될 러너의 유형
    runs-on: ubuntu-latest

    # 단계는 작업의 일부로 실행될 일련의 작업을 나타냅니다
    steps:
      # $GITHUB_WORKSPACE 아래에서 리포지토리를 체크아웃하여 작업이 이에 접근할 수 있도록 합니다
      - uses: actions/checkout@v3
      # https://github.com/actions/checkout 을 사용함.

      # 러너의 셸을 사용하여 단일 명령을 실행합니다
      - 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.

 

  1. .gihub / workflows / blank.yml 입력
  2. 위에 글을 복사하여 Edit 칸에 붙여넣기
  3. 해당 사항들 변경 후 Commit changes... 클릭

워크플로우가 정상적으로 작동하는 지 확인하기 위해 README 글 작성 후 Commti changes... 클릭

 Actions에 들어가 workflow의 초록불이 뜨는 지 확인.

초록불이 뜬다면 정상적으로 작동중인 것!

 

Docker와 Github Action 함께 사용하기

  • [실습1] GitHub Actions과 Docker를 함께 사용하여 간단한 Node.js 애플리케이션을 빌드하고 테스트
    (해당 실습을 위해 docker hub의 본인 계정을 준비해주시기 바랍니다.) 

https://github.com/siyoungoh/node-github-action-docker 에 접속하여 본인 레파지토리에 추가하기 위해 Fork 클릭

Create fork 클릭(이제 본인 레파지토리에 복사가 됩니다.)

github 본인 프로필 - Repositories를 클릭 후 fork된 nodejs-dockerhub 클릭

.github/workflows를 클릭 후 docker-image.yml의 설정을 변경해줍니다.

Edit을 클릭하여 설정 변경

 tags의 명을 본인의 docker hub의 프로필명으로 수정 후 Commit changes... 클릭

Settings의 Secrets and variables > Actions 클릭 후 New repository secret을 통해 시크릿 키를 설정해줍니다.

docker hub과 연동을 위해 docker hub 아이디와 패스워드 입력.

docker-image.yml의 jobs: build-and-push: with: username: , password: 의 값과 동일

DOCKER_USERNAME, DOCKER_PASSWORD 각각의 시크릿 키를 입력하고 Add secret으로 생성.

연동이 완료 됐다면 새로운 실습을 통해 docker hub에 새 이미지가 실시간으로 업데이트되는 지 확인해봅시다.

 

  • [실습2] Github Action 을 사용해 push 가 되면 docker hub 에 새 이미지가 업데이트 되는지 확인하기
 

트리거 실행을 위해 README의 내용을 변경해서 Commit changes...를 클릭

 

Actions의 Update README.md의 초록불이 뜬다면 정상.

build-and-push를 클릭하여 설정들을 확인해줍니다.

 

설정(job, actions, Docker image)들 하나하나 확인할 수 있습니다.

dockerhub 사이트로 접속 후 본인 계정으로 로그인하고 Repositories에 추가가 됐는 지 확인.

정상적으로 연동이 돼 있다면 Tags에 새로운 이미지가 추가된 것을 확인할 수 있다.

 

마무리

다음 시간엔 CI / CD를 사용하는 클라우드 서비스들에 대해 배우고, AWS ECR를 사용해 Docker 이미지를 배포하는 것을 배우는데 벌써 마지막 시간이라는 게 아쉽기도 하고 Docker에 대해 조금은 배워가는 거 같아서 굉장히 좋았다.

자세한 설정들에 대해선 조금 더 공부해야겠지만 이정도면 아주 기본은 맛 본 느낌...?