GitHub Actions은 GitHub에서 제공하는 CI/CD(Continuous Integration/Continuous Deployment) 플랫폼이다. GitHub Actions를 사용하면 코드 저장소에서 발생하는 이벤트에 따라 자동으로 워크플로우를 설정하고 실행할 수 있다. 이를 통해 코드 테스트, 빌드, 배포와 같은 반복적인 작업을 자동화 할수 있다.
GitHub Actions는 다양한 이벤트(예: 코드 푸시, 풀 리퀘스트, 이슈 생성 등)에 반응하여 워크플로우를 트리거할 수 있다.
예를 들어, 특정 브랜치에 코드가 푸시될 때마다 테스트와 빌드를 자동으로 실행하도록 설정 할 수 있다.
워크플로우는 YAML 파일로 정의된다. 이 파일은 저장소의 .github/workflows
디렉토리에 위치한다.
YAML 파일을 통해 어떤 이벤트에 반응할지, 어떤 작업을 수행할지, 어떤 환경에서 실행할지를 정의할 수 있다.
GitHub Actions는 미리 정의된 수많은 액션을 제공하며, 이를 통해 코드 체크아웃, 테스트 실행, 빌드, 배포 등의 작업을 쉽게 수행할 수 있다.
커뮤니티에서 제작한 액션도 사용할 수 있으며, 직접 사용자 정의 액션을 만들어 사용할 수도 있다.
여러 작업을 직렬 또는 병렬로 실행할 수 있다.
이를 통해 복잡한 CI/CD 파이프라인을 유연하게 구성할 수 있다.
Nest.js 애플리케이션을 위한 Dockerfile을 작성한다.
# 공식 Node.js 이미지를 베이스로 사용한다.
FROM node:16-alpine
# 작업 디렉토리 설정
WORKDIR /app
# package.json과 package-lock.json 복사
COPY package*.json ./
# 종속성 설치
RUN npm install
# 나머지 애플리케이션 코드 복사
COPY . .
# 포트 노출
EXPOSE 3000
# 애플리케이션 실행 명령
CMD ["npm", "run", "start:prod"]
GitHub 저장소의
.github/workflows
디렉토리에 CI/CD 워크플로우를 설정한다.
name: CI/CD
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push Docker image
uses: docker/build-push-action@v2
with:
context: .
file: ./Dockerfile
push: true
tags: your-dockerhub-username/your-image-name:latest
- name: SSH Deploy to Synology NAS
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SYN_NAS_HOST }}
username: ${{ secrets.SYN_NAS_USERNAME }}
password: ${{ secrets.SYN_NAS_PASSWORD }}
port: ${{ secrets.SYN_NAS_PORT }}
script: |
docker-compose -f /path/to/docker-compose.yml pull
docker-compose -f /path/to/docker-compose.yml up -d
name: CI/CD
on:
push:
branches:
- main
name
: CI/CD: 워크플로우의 이름이다.on: push: branches: - main
: main 브랜치에 푸시될 때마다 이 워크플로우가 실행된다.jobs:
build:
runs-on: ubuntu-latest
jobs
: 워크플로우에서 실행될 작업들을 정의한다.runs-on: ubuntu-latest
: 작업이 실행될 가상 머신 환경을 지정한다. 여기서는 최신 Ubuntu를 사용한다.steps:
- name: Checkout code
uses: actions/checkout@v2
name
: Set up Docker Buildx: 단계의 이름이다.uses: actions/checkout@v2
: GitHub의 공식 액션을 사용하여 저장소의 코드를 체크아웃한다.- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
uses: docker/setup-buildx-action@v1
: Docker Buildx를 설정하는 GitHub 액션을 사용한다. Docker Buildx는 다양한 플랫폼을 대상으로 이미지를 빌드할 수 있는 도구이다.- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
uses
: docker/login-action@v2: Docker Hub에 로그인하는 GitHub 액션을 사용한다.with
: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }}: Docker Hub 로그인에 필요한 사용자 이름과 비밀번호를 GitHub Secrets에서 가져온다. Secrets는 민감한 정보를 안전하게 저장하고 사용할 수 있도록 도와준다.- name: Build and push Docker image
uses: docker/build-push-action@v2
with:
context: .
file: ./Dockerfile
push: true
tags: your-dockerhub-username/your-image-name:latest
uses: docker/build-push-action@v2
: Docker 이미지를 빌드하고 푸시하는 GitHub 액션을 사용합니다.
with: context: . file: ./Dockerfile push: true tags: your-dockerhub-username/your-image-name:latest
:
`context`: .: Docker 빌드를 위한 컨텍스트 디렉토리이다. 여기서는 현재 디렉토리를 사용한다.
`file`: ./Dockerfile: Dockerfile의 경로이다.
`push`: true: 빌드된 이미지를 Docker Hub에 푸시할지 여부를 나타낸다.
`tags`: your-dockerhub-username/your-image-name:latest: Docker 이미지의 태그를 지정한다. your-dockerhub-username과 your-image-name을 실제 Docker Hub 사용자 이름과 이미지 이름으로 대체해야 한다.
- name: SSH Deploy to Synology NAS
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SYN_NAS_HOST }}
username: ${{ secrets.SYN_NAS_USERNAME }}
password: ${{ secrets.SYN_NAS_PASSWORD }}
port: ${{ secrets.SYN_NAS_PORT }}
script: |
docker-compose -f /path/to/docker-compose.yml pull
docker-compose -f /path/to/docker-compose.yml up -d
uses: appleboy/ssh-action@master
: SSH를 통해 원격 서버에 명령을 실행할 수 있는 GitHub 액션을 사용한다.
with: host: ${{ secrets.SYN_NAS_HOST }} username: ${{ secrets.SYN_NAS_USERNAME }} password: ${{ secrets.SYN_NAS_PASSWORD }} port: ${{ secrets.SYN_NAS_PORT }} script: | docker-compose -f /path/to/docker-compose.yml pull docker-compose -f /path/to/docker-compose.yml up -d
:
`host`: Synology NAS의 호스트 주소를 GitHub Secrets에서 가져온다.
`username`: Synology NAS의 사용자 이름을 GitHub Secrets에서 가져온다.
`password`: Synology NAS의 비밀번호를 GitHub Secrets에서 가져온다.
`port`: Synology NAS의 SSH 포트를 GitHub Secrets에서 가져온다.
`script`: 실행할 스크립트를 정의한다. 여기서는 Docker Compose를 사용하여 최신 이미지를 가져오고(pull), 애플리케이션을 실행(up -d)한다. docker-compose.yml 파일의 실제 경로로 /path/to/docker-compose.yml을 대체해야 한다.
main 브랜치에 코드가 푸시되면 워크플로우가 시작된다.
GitHub Actions는 코드를 체크아웃한다.
Docker Buildx가 설정된다.
Docker Hub에 로그인한다.
Docker 이미지를 빌드하고 Docker Hub에 푸시한다.
SSH를 통해 Synology NAS에 접속하여 Docker Compose를 실행, 애플리케이션을 배포한다.