Skip to content

Commit 42781a7

Browse files
authored
Merge pull request #124 from GDGoCINHA/develop
Update: 여러 프로젝트 실행 충돌을 방지하기 위한 CI/CD 스크립트 업데이트
2 parents fcf6538 + 4302a32 commit 42781a7

File tree

5 files changed

+130
-100
lines changed

5 files changed

+130
-100
lines changed

.github/workflows/deploy.yml

Lines changed: 52 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: Build Docker and Upload to S3
1+
name: Build and Deploy GDGOC WebPage FE App
22

33
on:
44
push:
@@ -10,52 +10,54 @@ jobs:
1010
runs-on: ubuntu-latest
1111

1212
steps:
13-
- name: Checkout Code
14-
uses: actions/checkout@v3
15-
16-
- name: Create .env file
17-
run: |
18-
echo "DOCKER_HUB_USERNAME=${{ secrets.DOCKER_HUB_USERNAME }}" > .env
19-
echo "NEXT_PUBLIC_GOOGLE_REDIRECT_CLIENT_ID=${{secrets.NEXT_PUBLIC_GOOGLE_REDIRECT_CLIENT_ID}}" >> .env
20-
echo "NEXT_PUBLIC_GOOGLE_REDIRECT_URI=${{secrets.NEXT_PUBLIC_GOOGLE_REDIRECT_URI}}" >> .env
21-
22-
- name: Login to DockerHub (Optional)
23-
uses: docker/login-action@v2
24-
with:
25-
username: ${{ secrets.DOCKER_HUB_USERNAME }}
26-
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
27-
28-
- name: Build and Push Docker Image
29-
run: |
30-
docker build -t ${{ secrets.DOCKER_HUB_USERNAME }}/gdgoc-fe-app:latest .
31-
docker run --rm ${{ secrets.DOCKER_HUB_USERNAME }}/gdgoc-fe-app:latest ls -la /app
32-
docker push ${{ secrets.DOCKER_HUB_USERNAME }}/gdgoc-fe-app:latest
33-
34-
- name: Create Deployment Package
35-
run: |
36-
cp scripts/deploy.sh ./deploy.sh
37-
zip -r deploy.zip .env docker-compose.yml deploy.sh appspec.yml \
38-
Dockerfile package.json package-lock.json next.config.mjs \
39-
pages public .next
40-
41-
- name: Configure AWS credentials
42-
run: |
43-
aws configure set aws_access_key_id ${{ secrets.AWS_ACCESS_KEY_ID }}
44-
aws configure set aws_secret_access_key ${{ secrets.AWS_SECRET_ACCESS_KEY }}
45-
aws configure set region ${{ secrets.AWS_REGION }}
46-
47-
- name: Upload Deployment Package to S3
48-
run: |
49-
aws s3 cp deploy.zip s3://${{ secrets.AWS_S3_BUCKET }}/deploy.zip
50-
51-
- name: Trigger CodeDeploy (CLI)
52-
env:
53-
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
54-
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
55-
AWS_REGION: ap-northeast-2
56-
run: |
57-
aws deploy create-deployment \
58-
--application-name ${{ secrets.AWS_CODEDEPLOY_APP }} \
59-
--deployment-group-name ${{ secrets.AWS_CODEDEPLOY_GROUP }} \
60-
--s3-location bucket=${{ secrets.S3_BUCKET }},bundleType=zip,key=deploy.zip \
61-
--file-exists-behavior OVERWRITE
13+
- name: Checkout Code
14+
uses: actions/checkout@v3
15+
16+
- name: Create .env file
17+
run: |
18+
mkdir -p gdgocinha-fe
19+
echo "DOCKER_HUB_USERNAME=${{ secrets.DOCKER_HUB_USERNAME }}" > .env
20+
echo "NEXT_PUBLIC_GOOGLE_REDIRECT_CLIENT_ID=${{ secrets.NEXT_PUBLIC_GOOGLE_REDIRECT_CLIENT_ID }}" >> .env
21+
echo "NEXT_PUBLIC_GOOGLE_REDIRECT_URI=${{ secrets.NEXT_PUBLIC_GOOGLE_REDIRECT_URI }}" >> .env
22+
23+
- name: Login to DockerHub
24+
uses: docker/login-action@v2
25+
with:
26+
username: ${{ secrets.DOCKER_HUB_USERNAME }}
27+
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
28+
29+
- name: Build and Push Docker Image
30+
run: |
31+
docker build -t ${{ secrets.DOCKER_HUB_USERNAME }}/gdgocinha-fe:latest .
32+
docker push ${{ secrets.DOCKER_HUB_USERNAME }}/gdgocinha-fe:latest
33+
34+
- name: Create Deployment Package
35+
run: |
36+
mkdir -p deploy-package
37+
cp scripts/deploy.sh deploy-package/
38+
cp docker-compose.yml deploy-package/
39+
cp appspec.yml deploy-package/
40+
cp .env deploy-package/
41+
zip -r deploy-gdgocinha-fe.zip deploy-package/
42+
43+
- name: Configure AWS credentials
44+
run: |
45+
aws configure set aws_access_key_id ${{ secrets.AWS_ACCESS_KEY_ID }}
46+
aws configure set aws_secret_access_key ${{ secrets.AWS_SECRET_ACCESS_KEY }}
47+
aws configure set region ${{ secrets.AWS_REGION }}
48+
49+
- name: Upload Deployment Package to S3
50+
run: |
51+
aws s3 cp deploy-gdgocinha-fe.zip s3://${{ secrets.AWS_S3_BUCKET }}/gdgocinha-fe/deploy-gdgocinha-fe.zip
52+
53+
- name: Trigger CodeDeploy
54+
env:
55+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
56+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
57+
AWS_REGION: ap-northeast-2
58+
run: |
59+
aws deploy create-deployment \
60+
--application-name ${{ secrets.AWS_CODEDEPLOY_APP }} \
61+
--deployment-group-name ${{ secrets.AWS_CODEDEPLOY_GROUP }} \
62+
--s3-location bucket=${{ secrets.AWS_S3_BUCKET }},bundleType=zip,key=gdgocinha-fe/deploy-gdgocinha-fe.zip \
63+
--file-exists-behavior OVERWRITE

Dockerfile

Lines changed: 16 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -4,51 +4,36 @@ FROM node:18 AS builder
44
WORKDIR /app
55

66
# package.json과 package-lock.json을 먼저 복사하고, npm install 실행
7-
COPY package.json package-lock.json ./
8-
RUN npm install
9-
10-
# .env 파일을 먼저 복사
11-
COPY .env ./
7+
COPY package*.json ./
8+
RUN npm ci
129

13-
# 이후 전체 파일 복사
10+
# 소스 코드 복사
1411
COPY . .
1512

16-
# next.config.mjs 확인
17-
RUN cat next.config.mjs
18-
19-
# 빌드 실행 (output: export가 있는지 확인)
20-
# 명시적으로 next build 명령 사용
21-
RUN npx next build
22-
23-
# 빌드 결과 확인
24-
RUN ls -la /app
25-
RUN ls -la /app/.next || echo ".next 디렉토리가 없습니다"
26-
RUN ls -la /app/out || echo "out 디렉토리가 없습니다"
13+
# 빌드 실행
14+
RUN npm run build
2715

2816
# 2단계: 실행 환경
29-
FROM node:18
17+
FROM node:18-slim
3018

3119
WORKDIR /app
3220

33-
# 프로덕션 의존성만 가져오기
21+
# 프로덕션 의존성만 설치
3422
COPY package*.json ./
35-
RUN npm install --omit=dev
23+
RUN npm ci --only=production
3624

37-
# .env 파일 복사
38-
COPY .env ./
39-
40-
# 빌드된 결과물 가져오기
25+
# 빌드된 결과물과 필요한 파일들 복사
4126
COPY --from=builder /app/.next ./.next
4227
COPY --from=builder /app/public ./public
43-
COPY --from=builder /app/node_modules ./node_modules
44-
COPY --from=builder /app/package.json ./package.json
45-
COPY --from=builder /app/next.config.mjs ./next.config.mjs
46-
47-
# 실행환경 확인
48-
RUN ls -la /app
49-
RUN ls -la /app/.next || echo ".next 디렉토리가 없습니다"
28+
COPY --from=builder /app/next.config.mjs ./
29+
COPY --from=builder /app/.env ./
5030

31+
# 헬스체크를 위한 포트 노출
5132
EXPOSE 3000
5233

34+
# 컨테이너 헬스체크 설정
35+
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
36+
CMD curl -f http://localhost:3000/ || exit 1
37+
5338
# Next.js 서버 시작
5439
CMD ["npm", "run", "start"]

appspec.yml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,19 @@ version: 0.0
22
os: linux
33
files:
44
- source: /
5-
destination: /home/ubuntu/gdgoc-fe-app
5+
destination: /home/ubuntu/gdgocinha-fe
6+
overwrite: true
67

78
hooks:
9+
BeforeInstall:
10+
- location: deploy.sh
11+
timeout: 300
12+
runas: root
813
AfterInstall:
914
- location: deploy.sh
1015
timeout: 300
1116
runas: root
17+
ApplicationStart:
18+
- location: deploy.sh
19+
timeout: 300
20+
runas: root

docker-compose.yml

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,19 @@ version: "3.8"
22

33
services:
44
frontend:
5-
image: "${DOCKER_HUB_USERNAME}/gdgoc-fe-app:latest"
6-
container_name: gdgoc-fe-app
5+
image: "${DOCKER_HUB_USERNAME}/gdgocinha-fe:latest"
6+
container_name: gdgocinha-fe
77
restart: always
88
ports:
99
- "3000:3000"
1010
environment:
11-
NODE_ENV: production
11+
- NODE_ENV=production
1212
working_dir: /app
1313
command: "npm run start"
14+
networks:
15+
- gdgocinha-network
16+
17+
networks:
18+
gdgocinha-network:
19+
driver: bridge
1420

scripts/deploy.sh

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,63 @@
11
#!/bin/bash
2-
cd /home/ubuntu/gdgoc-fe-app
32

4-
# Docker & Docker Compose가 설치되어 있는지 확인
3+
# Set the application directory
4+
APP_DIR="/home/ubuntu/gdgocinha-fe"
5+
6+
# Create application directory if it doesn't exist
7+
mkdir -p $APP_DIR
8+
9+
# Move to application directory
10+
cd $APP_DIR
11+
12+
# Docker & Docker Compose installation check and setup
513
if ! [ -x "$(command -v docker)" ]; then
6-
echo "Docker가 설치되어 있지 않습니다. 설치 중..."
14+
echo "Installing Docker..."
715
sudo apt update
816
sudo apt install -y docker.io
917
sudo systemctl start docker
1018
sudo systemctl enable docker
11-
echo "Docker 설치 완료"
19+
sudo usermod -aG docker ubuntu
20+
echo "Docker installation completed"
1221
fi
1322

1423
if ! [ -x "$(command -v docker-compose)" ]; then
15-
echo "Docker Compose가 설치되어 있지 않습니다. 설치 중..."
24+
echo "Installing Docker Compose..."
1625
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
1726
sudo chmod +x /usr/local/bin/docker-compose
18-
echo "Docker Compose 설치 완료"
27+
echo "Docker Compose installation completed"
1928
fi
2029

21-
# 기존 컨테이너 중지 및 삭제
22-
docker-compose down
30+
# Stop and remove existing containers
31+
echo "Stopping existing containers..."
32+
docker-compose down || true
2333

24-
# 사용되지 않는 컨테이너, 이미지, 네트워크, 볼륨 정리
34+
# Clean up unused Docker resources
35+
echo "Cleaning up Docker resources..."
2536
docker system prune -af
26-
27-
# 불필요한 Docker 볼륨도 정리 (옵션)
2837
docker volume prune -f
2938

30-
# 최신 이미지 가져오기
31-
export $(grep -v '^#' .env | xargs)
32-
docker pull ${DOCKER_HUB_USERNAME}/gdgoc-fe-app:latest
39+
# Load environment variables
40+
if [ -f .env ]; then
41+
echo "Loading environment variables..."
42+
export $(grep -v '^#' .env | xargs)
43+
else
44+
echo "Error: .env file not found"
45+
exit 1
46+
fi
47+
48+
# Pull latest image
49+
echo "Pulling latest Docker image..."
50+
docker pull ${DOCKER_HUB_USERNAME}/gdgocinha-fe:latest
3351

34-
# 컨테이너 실행
52+
# Start containers
53+
echo "Starting containers..."
3554
docker-compose --env-file .env up -d
55+
56+
# Verify deployment
57+
echo "Verifying deployment..."
58+
if [ $(docker ps -q -f name=gdgocinha-fe | wc -l) -eq 1 ]; then
59+
echo "Deployment successful!"
60+
else
61+
echo "Deployment failed!"
62+
exit 1
63+
fi

0 commit comments

Comments
 (0)