1. 태그
워크플로우는 여러 개의 작업(Job)으로 구성될 수 있으며, 각 작업은 여러 단계(Steps)로 이루어진다. 이 때 해당 부분이 어느 항목에 해당하는지 보여주기 위해서 태그를 사용한다.
태그 설명
| name | 워크플로우의 이름. 명시하지 않으면 파일의 이름을 사용 |
| on | 워크플로우를 트리거하는 이벤트를 정의하는 부분. |
| jobs | 워크플로우에서 실행될 작업을 정의. 각 작업 안에는 여러 단계(steps)가 포함됨. 병렬로 실행하거나, 순차적으로 실행할 수 있음. |
| build | 개별 작업(job)의 이름을 정의함. jobs 섹션 안에서만 유효함. |
| runs-on | 작업(job)을 실행할 가상 환경을 지정 |
| steps | 작업(job) 안에서 실행되는 개별 단계를 정의. 명령어 실행 혹은 특정 액션 호출. 단계는 순차적으로 실행됨 |
| uses, run | 외부 액션을 사용하여 특정 작업을 수행 |
2. 작성한 내용 부분별로 뜯어보기
1. name과 on
name: CI/CD Pipeline with Docker
on:
push:
branches:
- main
- 워크플로우의 이름을 정의
- main 브랜치에 푸시될 때만 워크플로우가 동작
2. build
jobs:
build:
runs-on: ubuntu-latest
- 빌드 작업을 수행할 때 가상 환경은 ubuntu-latest
3. steps
3-1. checkout
steps:
- name: Checkout code
uses: actions/checkout@v4
- Github 저장소의 코드를 가져옴.
- 빌드와 테스트를 위해서 가장 먼저 필요한 단계.
- 코드를 체크아웃하여 작업이 최신 상태에서 수행되게 함.
3-2. setup-node
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- Node.js 환경을 설정함.
- 버전을 설정하여 빌드 및 의존성 설치가 가능하도록 함.
3-3. npm install/build
- name: Install dependencies
run: npm install
- name: Build project
run: npm run build
- 프로젝트에 필요한 Node.js 의존성 설치.
- 프로젝트를 빌드하여 최종 실행 파일을 생성
3-4. Docker Buildx
# Docker Buildx 설정: 멀티 플랫폼 빌드를 위해서 사용.
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- 나의 배포 환경이 라즈베리파이 데비안 aarch64 기반이어서, 멀티 플랫폼 빌드가 요구되었다.
- 멀티 플랫폼 도커 이미지 빌드를 위해서 buildx라는 도구를 사용.
3-5. DockerHub 로그인
- name: Log in to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN }}
- 도커 허브에 로그인하 빌드한 이미지를 푸시하기 위한 준비를 한다.
3-6. Build and Push Docker Image
- name: Build and Push Docker image
uses: docker/build-push-action@v3
with:
context: .
push: true
tags: ${{ secrets.DOCKERHUB_USERNAME }}/folio-backend:latest
platforms: linux/amd64,linux/arm64
- 도커 이미지를 빌드 및 푸시함.
- 단, 플랫폼에 linux/amd64와 linux/arm64을 명기하여 멀티 플랫폼용 이미지를 빌드하도록 함.
4. deploy
- name: SSH to Deploy Server
uses: appleboy/ssh-action@v0.1.7
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: ${{ secrets.SSH_PORT }}
script: |
echo "SSH 연결 테스트 완료."
docker --version
echo "${{ secrets.DOCKERHUB_ACCESS_TOKEN }}" | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin
docker pull ${{ secrets.DOCKERHUB_USERNAME }}/folio-backend:latest
docker stop folio-backend || true
docker rm folio-backend || true
docker run -d --name folio-backend -p 8080:3000 ${{ secrets.DOCKERHUB_USERNAME }}/folio-backend:latest
pm2 restart all || pm2 start folio-backend:latest
- 배포 서버에 SSH를 통해 접속
- docker pull 명령어를 실행하여 DockerHub에서 최신 이미지를 가져옴
- 기존 컨테이터 중지 및 제거 후 새로운 컨테이너를 실행함
- pm2를 사용하여 프로세스 관리를 함.
- 8080:3000은 외부 접속은 8080으로 하되, 컨테이너 내부에서는 3000번 포트를 이용하겠다는 말.
'Git' 카테고리의 다른 글
| PC 로컬의 git repo를 github에 연결하기 (0) | 2023.11.03 |
|---|