1- name : auto Workflow
1+ name : OctoDocs CD Pipeline
22
33on :
44 push :
55 branches :
6- - main
6+ - refactor-be-#47
77 workflow_dispatch :
88jobs :
99 image-build-and-push :
@@ -27,28 +27,52 @@ jobs:
2727 username : ${{ secrets.DOCKER_USERNAME }}
2828 password : ${{ secrets.DOCKER_PASSWORD }}
2929
30+ # 패키지 이미지부터 빌드 후 푸시
31+ # 이 이미지를 base로 backend와 websocket 이미지를 만들기 때문
32+ # 만약 octodocs-modules 이미지가 존재하면 그 이미지를 base로 하고
33+ # 그렇지 않으면 node:20-alpine 버전 사용
34+ # 그리고 layer 수가 너무 많으면 node:20-alpine 버전 사용 (50개 이상)
35+ - name : package docker image build and push
36+ run : |
37+ STATUS=$(curl -s -o /dev/null -w "%{http_code}" https://hub.docker.com/v2/repositories/summersummerwhy/octodocs-modules)
38+ if [ "$STATUS" -eq 404 ]; then
39+ echo "octodocs-modules not found"
40+ docker build -f ./services/module/Dockerfile.init -t summersummerwhy/octodocs-modules .
41+
42+ else
43+ echo "octodocs-modules found"
44+ docker build -f ./services/module/Dockerfile -t summersummerwhy/octodocs-modules .
45+ LAYERS=$(docker inspect --format '{{len .RootFS.Layers}}' summersummerwhy/octodocs-modules)
46+ if [ $LAYERS -gt 50 ]; then
47+ echo "too many layers"
48+ docker build -f ./services/module/Dockerfile.init -t summersummerwhy/octodocs-modules .
49+ fi
50+ fi
3051 # Docker 이미지 빌드
3152 - name : docker image build
3253 run : |
33- docker build -f ./services/module /Dockerfile -t summersummerwhy/octodocs-modules .
34- docker build -f ./services/backend /Dockerfile.prod -t summersummerwhy/octodocs-backend .
35- docker build -f ./services/nginx /Dockerfile.prod -t summersummerwhy/octodocs-nginx .
36- docker build -f ./services/websocket/Dockerfile.prod -t summersummerwhy/octodocs-websocket .
54+ docker build -f ./services/backend /Dockerfile.prod -t summersummerwhy/octodocs-backend . &
55+ docker build -f ./services/nginx /Dockerfile.prod -t summersummerwhy/octodocs-nginx . &
56+ docker build -f ./services/websocket /Dockerfile.prod -t summersummerwhy/octodocs-websocket . &
57+ wait
3758
3859 # Docker 이미지 푸시
3960 - name : docker image push
4061 run : |
41- docker push summersummerwhy/octodocs-modules
42- docker push summersummerwhy/octodocs-backend
43- docker push summersummerwhy/octodocs-nginx
44- docker push summersummerwhy/octodocs-websocket
62+ docker push summersummerwhy/octodocs-modules &
63+ docker push summersummerwhy/octodocs-backend &
64+ docker push summersummerwhy/octodocs-nginx &
65+ docker push summersummerwhy/octodocs-websocket &
66+ wait
4567
4668 deploy :
4769 needs : image-build-and-push
4870 runs-on : ubuntu-latest
4971
5072 steps :
51- - name : deploy
73+ # octodocs-modules먼저 pull 한 뒤 나머지 이미지 pull
74+ # octodocs-modules를 base로 하는 이미지가 있기 때문
75+ - name : image-pulling
5276 env :
5377 REMOTE_HOST : ${{ secrets.REMOTE_SERVER_IP }}
5478 REMOTE_USER : ${{ secrets.REMOTE_SERVER_USER }}
6185
6286 ssh -o StrictHostKeyChecking=no $REMOTE_USER@$REMOTE_HOST << 'EOF'
6387 cd /root/octodocs
64- docker-compose -f compose.prod.yml down
88+ docker pull summersummerwhy/octodocs-modules
6589 docker-compose -f compose.prod.yml pull
90+ - name : deploy
91+ env :
92+ REMOTE_HOST : ${{ secrets.REMOTE_SERVER_IP }}
93+ REMOTE_USER : ${{ secrets.REMOTE_SERVER_USER }}
94+ run : |
95+ ssh -o StrictHostKeyChecking=no $REMOTE_USER@$REMOTE_HOST << 'EOF'
96+ cd /root/octodocs
97+ docker-compose -f compose.prod.yml down
6698 docker-compose -f compose.prod.yml up -d
99+ # 사용하지 않는 도커 리소스를 정리한다.
100+ - name : cleanup
101+ env :
102+ REMOTE_HOST : ${{ secrets.REMOTE_SERVER_IP }}
103+ REMOTE_USER : ${{ secrets.REMOTE_SERVER_USER }}
104+ run : |
105+ ssh -o StrictHostKeyChecking=no $REMOTE_USER@$REMOTE_HOST << 'EOF'
106+ docker system prune -f --all
0 commit comments