Deploy Proposed Stack #5
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Deploy Proposed Stack | |
| # 제안 시스템 실험 스택(ailab-noprobe / ailab-full)을 띄우거나 내린다. 수동 실행 전용이다. | |
| # 코드는 CSID-DGU/admin_infra-proposed에서 가져오고, 배포 시크릿은 이 레포의 것을 쓴다. | |
| # 운영 배포(deploy-config-server.yaml)와 트리거, 이미지 이름(config-server-exp), 배포 서버의 차트 | |
| # 복사 경로(~/deploy-temp-exp), helm 릴리스명(config-server-<stack>)이 모두 달라 운영에 닿지 않는다. | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| stack: | |
| description: "스택" | |
| type: choice | |
| options: [noprobe, full] | |
| required: true | |
| ref: | |
| description: "admin_infra-proposed의 브랜치·태그·커밋 (두 스택에 같은 코드를 올릴 때는 같은 커밋을 준다)" | |
| default: develop | |
| required: true | |
| fe_ref: | |
| description: "CSID-DGU/admin_fe의 브랜치·태그·커밋 (스택 프론트엔드)" | |
| default: main | |
| required: true | |
| action: | |
| description: "up: 띄우기(이미 있으면 재배포) / down: 테스트 계정 정리 후 내리기" | |
| type: choice | |
| options: [up, down] | |
| default: up | |
| concurrency: | |
| group: proposed-stack-${{ inputs.stack }} | |
| cancel-in-progress: false | |
| jobs: | |
| run: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: 제안 시스템 코드 체크아웃 | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: CSID-DGU/admin_infra-proposed | |
| ref: ${{ inputs.ref }} | |
| path: proposed | |
| - name: 배포할 커밋 | |
| id: src | |
| run: | | |
| SHA=$(git -C proposed rev-parse HEAD) | |
| echo "sha=$SHA" >> "$GITHUB_OUTPUT" | |
| echo "admin_infra-proposed @ $SHA" | |
| - name: Docker Hub 로그인 | |
| if: inputs.action == 'up' | |
| uses: docker/login-action@v3 | |
| with: | |
| username: ${{ secrets.DOCKER_USERNAME }} | |
| password: ${{ secrets.DOCKER_PASSWORD }} | |
| - name: config-server 이미지 빌드 | |
| if: inputs.action == 'up' | |
| uses: docker/build-push-action@v5 | |
| with: | |
| context: ./proposed/config-server | |
| file: ./proposed/config-server/Dockerfile | |
| push: true | |
| tags: ${{ secrets.DOCKER_USERNAME }}/config-server-exp:${{ steps.src.outputs.sha }} | |
| - name: 프론트엔드 코드 체크아웃 | |
| if: inputs.action == 'up' | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: CSID-DGU/admin_fe | |
| ref: ${{ inputs.fe_ref }} | |
| path: fe | |
| # admin_fe의 nginx.conf는 /api/와 /pod-status/ 대상이 운영으로 고정돼 있다. 이 두 줄만 스택 주소로 | |
| # 바꿔 스택 전용 이미지를 만든다(운영 프론트엔드 이미지·배포는 건드리지 않음). | |
| - name: 프론트엔드 nginx 대상을 스택으로 변경 | |
| id: fe | |
| if: inputs.action == 'up' | |
| run: | | |
| NS=ailab-${{ inputs.stack }} | |
| F=fe/nginx.conf | |
| grep -q "admin-prod.default.svc.cluster.local" $F && grep -q "containerssh-config-service.ailab-infra.svc.cluster.local" $F \ | |
| || { echo "admin_fe nginx.conf의 프록시 대상이 예상과 달라 중단"; exit 1; } | |
| sed -i -e "s#admin-prod.default.svc.cluster.local#admin-prod.$NS.svc.cluster.local#" \ | |
| -e "s#containerssh-config-service.ailab-infra.svc.cluster.local#containerssh-config-service.$NS.svc.cluster.local#" $F | |
| grep -n "proxy_pass" $F | |
| if grep -q "ailab-infra\|admin-prod.default" $F; then echo "운영 대상이 남아 있어 중단"; exit 1; fi | |
| echo "sha=$(git -C fe rev-parse --short=12 HEAD)" >> "$GITHUB_OUTPUT" | |
| - name: 프론트엔드 이미지 빌드 | |
| if: inputs.action == 'up' | |
| uses: docker/build-push-action@v5 | |
| with: | |
| context: ./fe | |
| file: ./fe/Dockerfile | |
| push: true | |
| tags: ${{ secrets.DOCKER_USERNAME }}/ailab-frontend-exp:${{ steps.fe.outputs.sha }}-${{ inputs.stack }} | |
| - name: 배포 서버의 이전 복사본 정리 | |
| uses: appleboy/ssh-action@master | |
| with: | |
| host: ${{ secrets.K8S_HOST }} | |
| username: ${{ secrets.K8S_USERNAME }} | |
| key: ${{ secrets.K8S_PRIVATE_KEY }} | |
| port: ${{ secrets.K8S_PORT }} | |
| script: rm -rf ~/deploy-temp-exp/${{ inputs.stack }} && mkdir -p ~/deploy-temp-exp/${{ inputs.stack }} | |
| - name: 차트와 설치 스크립트 복사 | |
| uses: appleboy/scp-action@master | |
| with: | |
| host: ${{ secrets.K8S_HOST }} | |
| username: ${{ secrets.K8S_USERNAME }} | |
| key: ${{ secrets.K8S_PRIVATE_KEY }} | |
| port: ${{ secrets.K8S_PORT }} | |
| source: "proposed/config-server/Chart,proposed/pvc-image-chart,proposed/infra-sql,proposed/ops/proposed-stack" | |
| target: "~/deploy-temp-exp/${{ inputs.stack }}" | |
| strip_components: 1 | |
| - name: 실행 | |
| uses: appleboy/ssh-action@master | |
| with: | |
| host: ${{ secrets.K8S_HOST }} | |
| username: ${{ secrets.K8S_USERNAME }} | |
| key: ${{ secrets.K8S_PRIVATE_KEY }} | |
| port: ${{ secrets.K8S_PORT }} | |
| command_timeout: 40m | |
| script: | | |
| cd ~/deploy-temp-exp/${{ inputs.stack }} | |
| if [ "${{ inputs.action }}" = "up" ]; then | |
| bash ops/proposed-stack/stack-up.sh ${{ inputs.stack }} ${{ secrets.DOCKER_USERNAME }}/config-server-exp:${{ steps.src.outputs.sha }} ${{ secrets.DOCKER_USERNAME }}/ailab-frontend-exp:${{ steps.fe.outputs.sha }}-${{ inputs.stack }} | |
| else | |
| bash ops/proposed-stack/stack-down.sh ${{ inputs.stack }} | |
| fi |