Docker CI 구축하기 (GitHub Actions)

문린이·2023년 3월 24일
0

지속적 통합(CI, Continuous Integration)

소프트웨어 개발 과정에서 코드 변경 사항이 발생할 때마다 자동으로 빌드 및 테스트를 실행하는 것을 말한다.
이를 통해 개발자는 코드 변경에 대한 피드백을 빠르게 받을 수 있고, 품질이 높은 안정적인 소프트웨어를 개발할 수 있다.
CI를 사용하면 개발자는 코드를 버전 관리 시스템에 커밋할 때마다 빌드 및 테스트가 자동으로 실행되어, 문제가 있는 코드 변경 사항을 빠르게 확인할 수 있다.
이는 개발자들이 더욱 자주 코드를 변경할 수 있게 하고, 코드 변경에 대한 위험을 줄이며, 안정적인 소프트웨어를 더욱 신속하게 개발할 수 있게 한다.

GitHub Actions

GitHub ActionsGitHub에서 제공하는 지속적인 통합(CI) 및 배포(CD) 서비스이다.
GitHub Actions를 사용하면 GitHub저장소에서 코드 변경 사항이 발생할 때마다 자동으로 작업을 실행하고, 이를 통해 코드 빌드, 테스트, 릴리스 등의 과정을 자동화할 수 있다.
Actions는 다양한 언어 및 프레임워크를 지원하며, 커뮤니티에서 제공하는 다양한 작업(Action)도 활용할 수 있다.

Docker 자동 빌드하기

세팅

자신의 Repository에서 Actions를 선택하고 Docker image를 선택한다. (set up a workflow yourself 로 처음부터 작성해도 된다.)

나의 코드 (GitHub Actions)

name: Docker CI

on:
  push:
    branches: ['main']
  pull_request:
    branches: ['main']

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Login to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Build the Docker image
        run: docker build --file Dockerfile --tag {test1}/{test2}:{test3} .

      - name: Push Docker image to Docker Hub
        run: docker push {test1}/{test2}:{test3}

on : 언제 작업을 실행할지 정의

push, pull_request : main 브랜치로 push, pull_request 이벤트가 발생하면 작업을 실행

jobs : workflow에서 수행할 작업을 정의

build-and-deploy : 작업의 이름을 정의

runs-on : 운영 체제 환경을 정의

steps : 하나의 job 안에서 실행되는 단계들을 정의

uses : Actions에서 제공하는 미리 만들어진 액션을 사용하기 위한 필드

actions/checkout@v3 : GitHub 리포지토리에서 코드를 체크아웃하는 액션 (현재 작업 디렉토리에 GitHub 리포지토리의 최신 소스 코드를 복제)

  1. 작업 디렉토리에서 git init 실행
  2. 현재 리포지토리의 최신 커밋을 가져오기 위해 git fetch 실행
  3. git checkout 명령을 실행하여 선택한 브랜치나 태그로 작업 디렉토리를 업데이트

docker/login-action@v2, with : with 키워드를 사용하여 Docker Hub 계정 정보를 전달

PASSWORD에 토큰을 넣는 것이 보안상 더 좋습니다. personal access token

run : jobs 안의 steps에서 실행되는 셸 명령어를 정의

docker build --file Dockerfile --tag {test1}/{test2}:{test3} .

  • docker build : Docker 이미지를 빌드하기 위한 명령어
  • --file 또는 -f: 사용할 Dockerfile 경로를 지정
  • --tag 또는 -t: 이미지에 태그를 지정
  • {test1}은 이미지의 레지스트리, {test2}는 이미지의 이름, {test3}은 이미지의 버전
  • . : Dockerfile을 실행하는 데 사용할 현재 디렉토리를 지정

docker push {test1}/{test2}:{test3}

  • {test1}이라는 Docker Hub 사용자 계정에 {test2}라는 이름의 이미지가 {test3} 태그로 업로드

Dockerfile

FROM node:18.15.0

WORKDIR /usr/src/app

COPY package*json ./

RUN yarn

COPY . ./

EXPOSE 8000

FROM : 기반이 될 이미지를 정의 (Dockerfile에서 생성할 이미지의 기반이 될 베이스 이미지)

WORKDIR : 컨테이너 내부에서 작업 디렉토리를 설정 (이후에 실행되는 명령어는 모두 /usr/src/app 디렉토리 내에서 실행)

COPY : 호스트 파일 시스템에서 Docker 이미지로 파일이나 디렉토리를 복사 (COPY <소스 경로> <대상 경로>)

RUN : 새로운 레이어에서 명령어를 실행하는 지시자

PORT : Docker 컨테이너가 실행될 때 해당 컨테이너에서 사용될 포트를 호스트와 연결하도록 지정하는 역할 (docker run 명령어의 -p 옵션과 함께 사용)

결과

main에 push 하고 성공 (블로그 Test는 commit message)

Docker Hub에도 정상적으로 push 되었다.

다음에는 CD(지속적 배포) 구축하기를 포스팅하겠습니다.

profile
Software Developer

0개의 댓글