docker-image.yml 파일을 작성합니다.
name: Deploy Next.js App
on:
push:
branches:
- main
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
jobs: 작업(job), 작업은 하나 이상의 단계steps로 구성됩니다.
build-and-deploy: 작업의 이름!
runs-on:: 이 작업이 실행될 환경, ubuntu-latest 제 서버는 Oracle Ubuntu 입니다.
uses: actions/checkout@v3: 이 단계는 GitHub 리포지토리를 체크아웃하여 작업을 실행하는데 필요한 파일들을 가져옵니다. actions/checkout 라이브러리를 사용하고 있습니다.
Node.js 16 actions are deprecated. Please update the following actions to use Node.js 20:
- 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
Set up Docker: Docker를 설정, docker/setup-buildx-action@v3 액션을 사용하여 Docker를 설정. 이것은 Docker 빌드를 위한 도구인 Buildx를 설정하는 데 사용됩니다.
https://github.com/docker/setup-buildx-action
- name: Set up Docker
uses: docker/setup-buildx-action@v3
Login to DockerHub: Docker Hub에 로그인, docker/login-action@v3 액션을 사용하여 Docker Hub에 로그인합니다. 이 때 사용자 이름과 비밀번호가 필요하며, 여기서는 GitHub Secrets에 저장된 값들을 사용합니다.
https://github.com/docker/login-action
- name: Login to DockerHub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
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 형식으로 사용됩니다. - 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
서버에 배포하는 단계입니다. 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 주소를 지정합니다.username: 서버에 접속할 때 사용할 사용자 이름입니다.key: SSH 키를 지정합니다. 이것은 서버에 접속하기 위한 인증에 사용됩니다. 보통은 SSH 키의 내용을 secrets에 저장합니다.-----BEGIN OPENSSH PRIVATE KEY----- 부터 -----END OPENSSH PRIVATE" (개인 키 열어보시면 요런 형태)script: 서버에 실행할 스크립트를 정의합니다. 이 스크립트는 서버에서 실행됩니다. 여기서는 다음과 같은 작업들이 수행됩니다: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, 젠킨스, 넷틀리파이처럼 실패 한 부분을 확인 할 수있다.

