1- # Self-Hosted 환경 자동 배포 워크플로우
2- # main 브랜치에 push가 발생하면 자동으로 실행됩니다
31name : Deploy to Self-Hosted
42
5- # 워크플로우 실행 조건: main 브랜치에 push될 때
63on :
74 push :
85 branches : [ main ]
96
107jobs :
11- # 빌드 작업
128 build :
139 runs-on : [self-hosted, client]
1410 outputs :
1511 image-tag : ${{ steps.build.outputs.image-tag }}
16-
12+
1713 steps :
1814 # 1. 코드 체크아웃
1915 - name : Checkout code
2016 uses : actions/checkout@v4
21-
17+
2218 # 2. Node.js 환경 설정 (버전 20)
2319 - name : Set up Node.js
2420 uses : actions/setup-node@v4
2521 with :
2622 node-version : ' 20'
27-
28- # 3. pnpm 패키지 매니저 설치
23+
24+ # 3. pnpm 설치
2925 - name : Install pnpm
3026 uses : pnpm/action-setup@v2
3127 with :
3228 version : latest
33-
34- # 4. pnpm 캐시 디렉토리 경로 가져오기 (캐싱 최적화용)
29+
30+ # 4. pnpm 캐시 경로
3531 - name : Get pnpm store directory
3632 shell : bash
3733 run : |
3834 echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
39-
40- # 5. pnpm 캐시 설정 (빌드 속도 향상을 위해)
35+
36+ # 5. pnpm 캐시 설정
4137 - name : Setup pnpm cache
4238 uses : actions/cache@v3
4339 with :
4440 path : ${{ env.STORE_PATH }}
4541 key : ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
4642 restore-keys : |
4743 ${{ runner.os }}-pnpm-store-
48-
44+
4945 # 6. 프로젝트 의존성 설치
5046 - name : Install dependencies
5147 run : pnpm install --frozen-lockfile
52-
53- # 7. 환경변수 파일 생성 (GitHub Secrets의 PROD_CONFIG 사용)
48+
49+ # 7. 환경변수 파일 생성
5450 - name : Create .env file
5551 run : |
5652 echo "${{ secrets.PROD_CONFIG }}" > .env.local
57-
58- # 8. Docker 설정 및 로그인
53+
54+ # 8. Docker Hub 로그인 (Keychain-Free)
5955 - name : Docker Hub Login
56+ env :
57+ DOCKER_CONFIG : $HOME/.docker # 홈 디렉토리 기반 Docker 설정
6058 run : |
61- # macOS에서 keychain 사용 비활성화
62- mkdir -p ~/.docker
63- echo '{"credsStore":"","auths":{}}' > ~/.docker/config.json
64- # Docker Hub 로그인
59+ mkdir -p $DOCKER_CONFIG
60+ echo '{"credsStore":""}' > $DOCKER_CONFIG/config.json
6561 echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
66-
62+
6763 # 9. Docker 이미지 빌드
6864 - name : Build Docker image
6965 id : build
7066 run : |
7167 docker build -t sols-client:${{ github.sha }} .
7268 echo "image-tag=${{ github.sha }}" >> $GITHUB_OUTPUT
73-
74- # 9 . 빌드 결과 확인
69+
70+ # 10 . 빌드 결과 확인
7571 - name : Verify build
7672 run : docker images | grep sols-client
7773
78- # 배포 작업 (빌드 완료 후 실행)
7974 deploy :
8075 needs : build
8176 runs-on : [self-hosted, client]
82-
77+
8378 steps :
8479 # 1. 기존 컨테이너 정리
8580 - name : Stop and remove existing container
8681 run : |
8782 docker stop sols-client || true
8883 docker rm sols-client || true
89-
84+
9085 # 2. 새로운 Docker 컨테이너 실행
9186 - name : Run new container
9287 run : |
@@ -96,19 +91,19 @@ jobs:
9691 -p 3000:3000 \
9792 --env-file .env.local \
9893 sols-client:${{ needs.build.outputs.image-tag }}
99-
94+
10095 # 3. 컨테이너 상태 확인
10196 - name : Verify container status
10297 run : |
10398 sleep 5
10499 docker ps | grep sols-client
105-
100+
106101 # 4. 헬스체크
107102 - name : Health check
108103 run : |
109104 sleep 10
110105 curl -f http://localhost:3000 > /dev/null 2>&1
111-
112- # 5. 정리 작업
106+
107+ # 5. 정리 작업 (불필요한 이미지 삭제)
113108 - name : Clean up old images
114109 run : docker image prune -f
0 commit comments