name: Multi-App CI/CD Pipeline on: push: branches: [ main, develop ] pull_request: branches: [ main ] env: REGISTRY: ghcr.io IMAGE_NAME: cqa-test-app jobs: # 변경 감지 detect-changes: runs-on: ubuntu-latest outputs: flask-changed: ${{ steps.changes.outputs.flask }} mcp-changed: ${{ steps.changes.outputs.mcp }} shared-changed: ${{ steps.changes.outputs.shared }} steps: - uses: actions/checkout@v4 - uses: dorny/paths-filter@v2 id: changes with: filters: | flask: - 'run_cqa_test_app.py' - 'functions/**' - 'products/**' - 'templates/**' mcp: - 'mcp_server.py' shared: - 'lib/**' - 'common/**' - 'requirements.txt' - 'Dockerfile*' # Flask App 빌드 build-flask: needs: detect-changes if: needs.detect-changes.outputs.flask-changed == 'true' || needs.detect-changes.outputs.shared-changed == 'true' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Log in to Container Registry uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push Flask app uses: docker/build-push-action@v5 with: context: . file: ./Dockerfile.multi target: flask-app push: true tags: | ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/flask-app:latest ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/flask-app:${{ github.sha }} cache-from: type=gha cache-to: type=gha,mode=max # MCP Server 빌드 build-mcp: needs: detect-changes if: needs.detect-changes.outputs.mcp-changed == 'true' || needs.detect-changes.outputs.shared-changed == 'true' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Log in to Container Registry uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push MCP server uses: docker/build-push-action@v5 with: context: . file: ./Dockerfile.multi target: mcp-server push: true tags: | ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/mcp-server:latest ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/mcp-server:${{ github.sha }} cache-from: type=gha cache-to: type=gha,mode=max # 통합 테스트 integration-test: needs: [build-flask, build-mcp] if: always() && (needs.build-flask.result == 'success' || needs.build-mcp.result == 'success') runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Run integration tests run: | docker-compose -f docker-compose.multi.yml up -d sleep 30 # Flask app 테스트 curl -f http://localhost:10345/test || exit 1 # MCP server 테스트 curl -f http://localhost:8001/mcp || exit 1 # MCP 프로토콜 테스트 curl -X POST http://localhost:8001/mcp \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' || exit 1 docker-compose -f docker-compose.multi.yml down # 배포 deploy: needs: [integration-test] if: github.ref == 'refs/heads/main' runs-on: ubuntu-latest steps: - name: Deploy to production run: | echo "Deploying to production..." # kubectl, helm, or other deployment tools