|
1 | | -name: CI/CD with Gradle, Docker Image & Docker Compose |
| 1 | +name: Deploy with Docker Compose |
2 | 2 |
|
3 | 3 | on: |
4 | 4 | push: |
5 | 5 | branches: [ "main" ] |
6 | | - pull_request: |
7 | | - branches: [ "main" ] |
8 | | - |
9 | | -permissions: |
10 | | - contents: read |
11 | | - |
12 | | -env: |
13 | | - # Docker Compose가 root 권한 필요할 수도 있어서 sudo 붙입니다. |
14 | | - DOCKER_COMPOSE_CMD: "sudo docker compose" |
15 | 6 |
|
16 | 7 | jobs: |
17 | | - build-and-push-image: |
18 | | - name: Build & Push Docker Image |
| 8 | + deploy: |
19 | 9 | runs-on: ubuntu-latest |
| 10 | + |
20 | 11 | steps: |
21 | | - # 1) Repository Checkout |
| 12 | + # 1. 레포지토리 체크아웃 |
22 | 13 | - name: Checkout repository |
23 | 14 | uses: actions/checkout@v3 |
24 | 15 |
|
25 | | - # 2) JDK 17 설치 |
26 | | - - name: Set up JDK 17 |
27 | | - uses: actions/setup-java@v3 |
28 | | - with: |
29 | | - java-version: '17' |
30 | | - distribution: 'temurin' |
31 | | - |
32 | | - # 3) Gradle 권한 부여 |
33 | | - - name: Grant execute permission for Gradle |
34 | | - run: chmod +x ./gradlew |
35 | | - |
36 | | - # 4) Gradle 빌드 (bootJar 생성) |
37 | | - - name: Build with Gradle |
38 | | - run: ./gradlew clean bootJar |
39 | | - |
40 | | - # 5) Docker 이미지 빌드 |
41 | | - - name: Build Docker Image |
42 | | - run: docker build -t ${{ secrets.DOCKER_USERNAME }}/fossistant:latest . |
43 | | - |
44 | | - # 6) Docker Hub 로그인 |
45 | | - - name: Docker Hub Login |
46 | | - uses: docker/login-action@v2 |
47 | | - with: |
48 | | - username: ${{ secrets.DOCKER_USERNAME }} |
49 | | - password: ${{ secrets.DOCKER_PASSWORD }} |
50 | | - |
51 | | - # 7) Docker 이미지 Push |
52 | | - - name: Push Docker Image to Docker Hub |
53 | | - run: docker push ${{ secrets.DOCKER_USERNAME }}/fossistant:latest |
54 | | - |
55 | | - deploy-with-compose: |
56 | | - name: Deploy to Azure VM via Docker Compose |
57 | | - runs-on: ubuntu-latest |
58 | | - needs: build-and-push-image |
59 | | - |
60 | | - steps: |
61 | | - # 1) SSH 키 세팅 |
62 | | - - name: Setup SSH private key |
| 16 | + # 2. SSH 키 설정 |
| 17 | + - name: Set up SSH private key |
63 | 18 | run: | |
64 | 19 | echo "${{ secrets.SSH_KEY }}" > private_key.pem |
65 | 20 | chmod 600 private_key.pem |
66 | 21 |
|
67 | | - # 2) SSH 접속 테스트 (디버그) |
68 | | - - name: Debug SSH connection |
69 | | - run: | |
70 | | - ssh -o StrictHostKeyChecking=no -i private_key.pem \ |
71 | | - ${{ secrets.AZURE_VM_USER }}@${{ secrets.AZURE_VM_HOST }} "echo ✅ SSH 접속 성공!" |
72 | | -
|
73 | | - # 3) .env 파일 생성 (GitHub Secrets → .env) |
| 22 | + # 3. .env 파일 생성 |
74 | 23 | - name: Generate .env for Docker Compose |
75 | 24 | run: | |
76 | | - cat <<EOF > .env |
77 | | - AZURE_DB_USERNAME=${{ secrets.AZURE_DB_USERNAME }} |
78 | | - AZURE_DB_PASSWORD=${{ secrets.AZURE_DB_PASSWORD }} |
79 | | - GEMINI_KEY=${{ secrets.GEMINI_KEY }} |
80 | | - GITHUB_TOKEN=${{ secrets.HUB_TOKEN }} |
81 | | - JWT_SECRET_KEY=${{ secrets.JWT_SECRET_KEY }} |
82 | | - JWT_ACCESS_TOKEN_TIME=${{ secrets.JWT_ACCESS_TOKEN_TIME }} |
83 | | - JWT_REFRESH_TOKEN_TIME=${{ secrets.JWT_REFRESH_TOKEN_TIME }} |
84 | | - GITHUB_CLIENT_ID=${{ secrets.GITHUB_CLIENT_ID }} |
85 | | - GITHUB_CLIENT_SECRET=${{ secrets.GITHUB_CLIENT_SECRET }} |
86 | | - EOF |
87 | | -
|
88 | | - # 4) docker-compose.yml 업로드 |
| 25 | + echo "AZURE_DB_USERNAME=${{ secrets.AZURE_DB_USERNAME }}" >> .env |
| 26 | + echo "AZURE_DB_PASSWORD=${{ secrets.AZURE_DB_PASSWORD }}" >> .env |
| 27 | + echo "GEMINI_KEY=${{ secrets.GEMINI_KEY }}" >> .env |
| 28 | + echo "GITHUB_TOKEN=${{ secrets.HUB_TOKEN }}" >> .env |
| 29 | + echo "JWT_SECRET_KEY=${{ secrets.JWT_SECRET_KEY }}" >> .env |
| 30 | + echo "JWT_ACCESS_TOKEN_TIME=${{ secrets.JWT_ACCESS_TOKEN_TIME }}" >> .env |
| 31 | + echo "JWT_REFRESH_TOKEN_TIME=${{ secrets.JWT_REFRESH_TOKEN_TIME }}" >> .env |
| 32 | + echo "GITHUB_CLIENT_ID=${{ secrets.CLIENT_ID }}" >> .env |
| 33 | + echo "GITHUB_CLIENT_SECRET=${{ secrets.CLIENT_SECRET }}" >> .env |
| 34 | +
|
| 35 | + # 4. docker-compose.yml 업로드 |
89 | 36 | - name: Upload docker-compose.yml to Azure VM |
90 | 37 | run: | |
91 | | - scp -i private_key.pem -o StrictHostKeyChecking=no \ |
92 | | - docker-compose.yml \ |
| 38 | + scp -i private_key.pem -o StrictHostKeyChecking=no docker-compose.yml \ |
93 | 39 | ${{ secrets.AZURE_VM_USER }}@${{ secrets.AZURE_VM_HOST }}:/home/ubuntu/fossistant/docker-compose.yml |
94 | 40 |
|
95 | | - # 5) .env 업로드 |
| 41 | + # 5. .env 업로드 |
96 | 42 | - name: Upload .env to Azure VM |
97 | 43 | run: | |
98 | | - scp -i private_key.pem -o StrictHostKeyChecking=no \ |
99 | | - .env \ |
| 44 | + scp -i private_key.pem -o StrictHostKeyChecking=no .env \ |
100 | 45 | ${{ secrets.AZURE_VM_USER }}@${{ secrets.AZURE_VM_HOST }}:/home/ubuntu/fossistant/.env |
101 | 46 |
|
102 | | - # 6) SSH로 접속하여 배포 (포트 충돌 및 컨테이너 정리 포함) |
103 | | - - name: SSH to Azure VM and Deploy with Compose |
| 47 | + # 6. SSH로 접속하여 배포 |
| 48 | + - name: SSH to Azure VM and Deploy |
104 | 49 | |
105 | 50 | with: |
106 | 51 | host: ${{ secrets.AZURE_VM_HOST }} |
107 | 52 | username: ${{ secrets.AZURE_VM_USER }} |
108 | 53 | key: ${{ secrets.SSH_KEY }} |
109 | 54 | port: 22 |
110 | 55 | script: | |
111 | | - set -eux |
112 | | -
|
113 | 56 | cd /home/ubuntu/fossistant |
114 | 57 |
|
115 | 58 | echo "🧼 Killing any process listening on port 6379..." |
| 59 | + # (선택 사항) Redis가 사용 중인 포트를 잡고 있는 프로세스 강제 종료 |
116 | 60 | sudo fuser -k 6379/tcp || true |
117 | 61 |
|
118 | | - echo "🧼 Forcibly removing any existing containers named 'redis' or 'fossistant'..." |
| 62 | + echo "🧼 Forcibly removing existing containers (redis, fossistant) if they exist..." |
119 | 63 | docker rm -f redis fossistant || true |
120 | 64 |
|
121 | | - echo "🧹 Stopping containers defined by docker-compose and removing orphans..." |
122 | | - $DOCKER_COMPOSE_CMD down --remove-orphans || true |
123 | | - $DOCKER_COMPOSE_CMD rm -f || true |
| 65 | + echo "🧹 Stopping old containers and removing orphans..." |
| 66 | + docker compose down --remove-orphans || true |
| 67 | + docker compose rm -f || true |
124 | 68 |
|
125 | | - echo "✅ Pulling latest images from Docker Hub..." |
126 | | - $DOCKER_COMPOSE_CMD pull |
| 69 | + echo "✅ Pulling latest images..." |
| 70 | + docker compose pull |
127 | 71 |
|
128 | | - echo "🚀 Starting new containers with Docker Compose..." |
129 | | - $DOCKER_COMPOSE_CMD up -d --build |
| 72 | + echo "🚀 Starting new containers..." |
| 73 | + docker compose up -d --build |
130 | 74 |
|
131 | | - echo "🎉 Deployment complete! Current containers:" |
132 | | - docker ps |
| 75 | + echo "🎉 Deployment complete! Containers are up and running." |
0 commit comments