fix: 워크로드 실행 시간 null 이슈 해결 #146
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: Build and Deploy | |
| on: | |
| push: | |
| branches: ["main"] | |
| paths: | |
| - "backend/**" | |
| - "frontend/**" | |
| - "docker-compose.yml" | |
| - ".github/workflows/deploy.yml" | |
| - "loki-config.yaml" | |
| - "promtail-config.yaml" | |
| concurrency: | |
| group: deploy-${{ github.ref }} | |
| cancel-in-progress: true | |
| env: | |
| REGISTRY: ghcr.io | |
| ORG: capstone-design-quantimizer | |
| REPO: quantimizer-system | |
| BACKEND_IMAGE: ghcr.io/capstone-design-quantimizer/quantimizer-system/backend:latest | |
| FRONTEND_IMAGE: ghcr.io/capstone-design-quantimizer/quantimizer-system/frontend:latest | |
| jobs: | |
| build-and-push: | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| packages: write | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: docker/setup-qemu-action@v3 | |
| - uses: docker/setup-buildx-action@v3 | |
| - uses: docker/login-action@v3 | |
| with: | |
| registry: ${{ env.REGISTRY }} | |
| username: ${{ secrets.GHCR_USERNAME }} | |
| password: ${{ secrets.GHCR_TOKEN }} | |
| - name: Build and push backend | |
| uses: docker/build-push-action@v6 | |
| with: | |
| context: ./backend | |
| push: true | |
| tags: ${{ env.BACKEND_IMAGE }} | |
| - name: Build and push frontend | |
| uses: docker/build-push-action@v6 | |
| with: | |
| context: ./frontend | |
| push: true | |
| tags: ${{ env.FRONTEND_IMAGE }} | |
| deploy: | |
| runs-on: ubuntu-latest | |
| needs: build-and-push | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Normalize compose image refs | |
| run: | | |
| sed -i "s|ghcr.io/.*/.*/backend:latest|${BACKEND_IMAGE}|g" docker-compose.yml | |
| sed -i "s|ghcr.io/.*/.*/frontend:latest|${FRONTEND_IMAGE}|g" docker-compose.yml | |
| - name: Prepare SSH key | |
| env: | |
| SSH_KEY: ${{ secrets.AZURE_VM_SSH_KEY }} | |
| run: | | |
| mkdir -p ~/.ssh | |
| echo "$SSH_KEY" > ~/.ssh/id_ed25519 | |
| chmod 600 ~/.ssh/id_ed25519 | |
| - name: Generate backend .env dynamically | |
| run: | | |
| mkdir -p backend | |
| cat <<EOF > backend/.env | |
| DATABASE_URL=${{ secrets.DATABASE_URL }} | |
| AZURE_STORAGE_CONNECTION_STRING=${{ secrets.AZURE_STORAGE_CONNECTION }} | |
| JWT_SECRET_KEY=${{ secrets.JWT_SECRET_KEY }} | |
| EOF | |
| - name: Create workdir and copy files | |
| env: | |
| VM_HOST: ${{ secrets.AZURE_VM_HOST }} | |
| VM_USER: ${{ secrets.AZURE_VM_USERNAME }} | |
| VM_WORKDIR: ${{ secrets.AZURE_VM_WORKDIR }} | |
| run: | | |
| ssh -i ~/.ssh/id_ed25519 -o StrictHostKeyChecking=no ${VM_USER}@${VM_HOST} "mkdir -p ${VM_WORKDIR} && mkdir -p ${VM_WORKDIR}/backend" | |
| scp -i ~/.ssh/id_ed25519 -o StrictHostKeyChecking=no docker-compose.yml ${VM_USER}@${VM_HOST}:${VM_WORKDIR}/docker-compose.yml | |
| scp -i ~/.ssh/id_ed25519 -o StrictHostKeyChecking=no loki-config.yaml ${VM_USER}@${VM_HOST}:${VM_WORKDIR}/loki-config.yaml | |
| scp -i ~/.ssh/id_ed25519 -o StrictHostKeyChecking=no promtail-config.yaml ${VM_USER}@${VM_HOST}:${VM_WORKDIR}/promtail-config.yaml | |
| if [ -f backend/.env ]; then | |
| scp -i ~/.ssh/id_ed25519 -o StrictHostKeyChecking=no backend/.env ${VM_USER}@${VM_HOST}:${VM_WORKDIR}/backend/.env | |
| fi | |
| - name: Deploy on VM | |
| env: | |
| VM_HOST: ${{ secrets.AZURE_VM_HOST }} | |
| VM_USER: ${{ secrets.AZURE_VM_USERNAME }} | |
| VM_WORKDIR: ${{ secrets.AZURE_VM_WORKDIR }} | |
| GHCR_USERNAME: ${{ secrets.GHCR_USERNAME }} | |
| GHCR_TOKEN: ${{ secrets.GHCR_TOKEN }} | |
| run: | | |
| ssh -i ~/.ssh/id_ed25519 -o StrictHostKeyChecking=no ${VM_USER}@${VM_HOST} <<EOF | |
| set -euo pipefail | |
| GHCR_TOKEN="${GHCR_TOKEN}" | |
| GHCR_USERNAME="${GHCR_USERNAME}" | |
| VM_WORKDIR="${VM_WORKDIR}" | |
| if ! command -v docker >/dev/null 2>&1; then | |
| curl -fsSL https://get.docker.com | sh | |
| sudo usermod -aG docker \$USER || true | |
| fi | |
| if ! docker compose version >/dev/null 2>&1; then | |
| sudo apt-get update -y | |
| sudo apt-get install -y docker-compose-plugin || true | |
| fi | |
| printf "%s" "\$GHCR_TOKEN" | docker login ghcr.io -u "\$GHCR_USERNAME" --password-stdin | |
| cd "\$VM_WORKDIR" | |
| if grep -q "^version:" docker-compose.yml; then | |
| sed -i '/^version:/d' docker-compose.yml | |
| fi | |
| docker compose pull backend frontend | |
| docker compose up -d backend frontend | |
| docker compose up -d --force-recreate loki promtail grafana | |
| docker image prune -f || true | |
| EOF |