Skip to content

fix: 워크로드 실행 시간 null 이슈 해결 #146

fix: 워크로드 실행 시간 null 이슈 해결

fix: 워크로드 실행 시간 null 이슈 해결 #146

Workflow file for this run

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