Docker + Git Actions

Hong Kyu Chu (Mr. Chu)·2024년 2월 12일

CI/CD

목록 보기
2/2

깃 허브에서 Actions를 누른다.

docker-image.yml 파일을 작성합니다.

배포할 브랜치 정하기

name: Deploy Next.js App

on:
  push:
    branches:
      - main

JOBS

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
  1. jobs: 작업(job), 작업은 하나 이상의 단계steps로 구성됩니다.

  2. build-and-deploy: 작업의 이름!

  3. runs-on:: 이 작업이 실행될 환경, ubuntu-latest 제 서버는 Oracle Ubuntu 입니다.

  4. uses: actions/checkout@v3: 이 단계는 GitHub 리포지토리를 체크아웃하여 작업을 실행하는데 필요한 파일들을 가져옵니다. actions/checkout 라이브러리를 사용하고 있습니다.

    • actions/checkout@v1 를 하면 아래와 같은 경고 정도 받을 수 있습니다.

      Node.js 16 actions are deprecated. Please update the following actions to use Node.js 20:

    • 라이브러리의 최신을 여기서 확인할 수 있습니다.

    https://github.com/actions/checkout

env 파일 설정

  1. .env 파일을 만들어줍니다.
    • secrets는 Settings ⇒ Actions secrets and variables 에서 환경변수처럼 만들 수 있습니다.
    • .env 파일을 만들고 변수를 설정합니다.
- name: Create .env file
  run: |
     touch .env
     echo "NEXT_PUBLIC_API_KEY=${{ secrets.NEXT_PUBLIC_API_KEY }}" >> .env
     echo "NEXTAUTH_SECRET=${{ secrets.NEXTAUTH_SECRET }}" >> .env
     echo "NEXTAUTH_URL=${{ secrets.NEXTAUTH_URL }}" >> .env
     echo "GOOGLE_CLIENT_ID=${{ secrets.GOOGLE_CLIENT_ID }}" >> .env
     echo "GOOGLE_CLIENT_SECRET=${{ secrets.GOOGLE_CLIENT_SECRET }}" >> .env

Docker 설정

  1. Set up Docker: Docker를 설정, docker/setup-buildx-action@v3 액션을 사용하여 Docker를 설정. 이것은 Docker 빌드를 위한 도구인 Buildx를 설정하는 데 사용됩니다.

    • 최신 릴리즈가 v3인 것으로 보입니다.

    https://github.com/docker/setup-buildx-action

        - name: Set up Docker
          uses: docker/setup-buildx-action@v3
  2. Login to DockerHub: Docker Hub에 로그인, docker/login-action@v3 액션을 사용하여 Docker Hub에 로그인합니다. 이 때 사용자 이름과 비밀번호가 필요하며, 여기서는 GitHub Secrets에 저장된 값들을 사용합니다.

    • 최신 역시나 v3이다.
    • DOCKER_USERNAME = “이 값은 Docker 허브에 가입했을때 프로필에 username 입니다.”
    • DOCKER_PASSWORD = “이 값은 Docker 허브에서 토큰을 설정해서 나온 토큰값입니다.”

    https://github.com/docker/login-action

        - name: Login to DockerHub
          uses: docker/login-action@v3
          with:
            username: ${{ secrets.DOCKER_USERNAME }}
            password: ${{ secrets.DOCKER_PASSWORD }}
  3. Build and push Docker image: Docker 이미지를 빌드하고 Docker Hub에 푸시(push)하는 단계입니다. docker/build-push-action@v3 액션을 사용하여 이미지를 빌드하고, 푸시합니다. 여기서 사용되는 옵션들은 다음과 같습니다:

    • context: Docker 빌드 컨텍스트를 지정합니다. 보통 현재 디렉토리를 의미하는 .을 사용합니다.
    • file: 사용할 Dockerfile의 경로를 지정합니다.
    • push: 이미지를 푸시할 것인지 여부를 나타내는 부울 값입니다. 여기서는 true로 설정되어 있으므로 이미지를 푸시합니다.
    • tags: 빌드한 이미지에 지정할 태그를 지정합니다. 여기서는 GitHub Secrets에 저장된 Docker 사용자 이름을 포함한 태그를 사용합니다. 보통은 username/repository:tag 형식으로 사용됩니다.
    • DOCKER_USERNAME = “이 값은 Docker 허브에 가입했을때 프로필에 username 입니다.”
        - name: Build and push Docker image
          uses: docker/build-push-action@v3
          with:
            context: .
            file: ./Dockerfile
            push: true
            tags: ${{ secrets.DOCKER_USERNAME }}/nextjs-app:latest

Docker Login - GitHub Marketplace

Deploy to Server

서버에 배포하는 단계입니다. appleboy/ssh-action@master 액션을 사용하여 SSH를 통해 서버에 접속하고, 배포 스크립트를 실행합니다. 이 때 사용되는 옵션들은 다음과 같습니다

- name: Deploy to Server
  uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.SERVER_IP }}
        username: ${{ secrets.SERVER_USER }}
        key: ${{ secrets.SERVER_SSH_KEY }}
        script: |
          cd 경로
          docker pull ${{ secrets.DOCKER_USERNAME }}/nextjs-app:latest
          docker stop nextjs-app || true
          docker rm nextjs-app || true
          docker run -d --name nextjs-app -p 80:3000 ${{ secrets.DOCKER_USERNAME }}/nextjs-app:latest
  • host: 서버의 IP 주소를 지정합니다.
    • SERVER_IP = “이 값은 서버 ip 입니다.”
  • username: 서버에 접속할 때 사용할 사용자 이름입니다.
    • SERVER_USER = “서버 만들 때 사용했던 이름”
  • key: SSH 키를 지정합니다. 이것은 서버에 접속하기 위한 인증에 사용됩니다. 보통은 SSH 키의 내용을 secrets에 저장합니다.
    • SERVER_SSH_KEY = “-----BEGIN OPENSSH PRIVATE KEY----- 부터 -----END OPENSSH PRIVATE" (개인 키 열어보시면 요런 형태)
  • script: 서버에 실행할 스크립트를 정의합니다. 이 스크립트는 서버에서 실행됩니다. 여기서는 다음과 같은 작업들이 수행됩니다:
    • cd 프로젝트 위치
    • docker pull ${{ secrets.DOCKER_USERNAME }}/nextjs-app:latest: Docker Hub에서 최신 이미지를 다운로드합니다.
    • docker stop nextjs-app || true: 실행 중인 Docker 컨테이너를 중지합니다. 만약 해당 컨테이너가 실행 중이지 않다면 에러가 발생하지 않도록 true를 추가하여 무시합니다.
    • docker rm nextjs-app || true: 중지된 Docker 컨테이너를 제거합니다. 마찬가지로 에러를 무시합니다.
    • docker run -d --name nextjs-app -p 80:3000 ${{ secrets.DOCKER_USERNAME }}/nextjs-app:latest: 새로운 Docker 컨테이너를 실행합니다. 여기서는 포트 80으로 외부와 통신할 수 있도록 설정되어 있습니다.

빌드 과정 확인

파일을 업데이트 되면 빌드 배포 과정을 아래 그림처럼

vercel, 젠킨스, 넷틀리파이처럼 실패 한 부분을 확인 할 수있다.

0개의 댓글