-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmagefile.go
158 lines (137 loc) · 3.53 KB
/
magefile.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
//go:build mage
// +build mage
package main
import (
"fmt"
"os"
"os/exec"
)
// List of services
var services = []string{
"auth-service",
"user-service",
"quiz-service",
"question-bank-service",
"live-quiz-service",
"leaderboard-service",
"gamification-service",
"results-report-service",
"notification-service",
"payment-service",
"ai-service",
"grpc-gateway",
}
// Create the entire directory structure
func InitProject() error {
fmt.Println("Initializing project structure...")
dirs := []string{
"apps",
"services",
"shared-libs/proto",
"shared-libs/common",
"shared-libs/database",
"shared-libs/logger",
"deployment/k8s",
"deployment/terraform",
"docs",
}
// Create directories
for _, dir := range dirs {
if err := os.MkdirAll(dir, os.ModePerm); err != nil {
return err
}
}
// Create microservices directories
for _, service := range services {
servicePath := fmt.Sprintf("services/%s", service)
subDirs := []string{"models", "controllers", "routes", "utils"}
for _, subDir := range subDirs {
if err := os.MkdirAll(fmt.Sprintf("%s/%s", servicePath, subDir), os.ModePerm); err != nil {
return err
}
}
files := []string{"main.go", ".env", "Dockerfile"}
for _, file := range files {
f, err := os.Create(fmt.Sprintf("%s/%s", servicePath, file))
if err != nil {
return err
}
f.Close()
}
}
// Create necessary files
files := []string{
".gitignore", "package.json", "go.mod", "README.md",
"deployment/docker-compose.yml",
"docs/README.md", "docs/API.md",
"shared-libs/proto/auth.proto",
"shared-libs/proto/quiz.proto",
}
for _, file := range files {
f, err := os.Create(file)
if err != nil {
return err
}
f.Close()
}
fmt.Println("Project structure initialized successfully!")
return nil
}
// Initialize Go modules for each service
func InitGoModules() error {
fmt.Println("Initializing Go modules for all microservices...")
for _, service := range services {
servicePath := fmt.Sprintf("services/%s", service)
cmd := exec.Command("go", "mod", "init", fmt.Sprintf("neet-quiz-monorepo/%s", service))
cmd.Dir = servicePath
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
return err
}
}
fmt.Println("Go modules initialized successfully!")
return nil
}
// Build all services
func Build() error {
fmt.Println("Building all microservices...")
for _, service := range services {
fmt.Printf("🚀 Building %s...\n", service)
cmd := exec.Command("go", "build", "-o", fmt.Sprintf("bin/%s", service), "./main.go")
cmd.Dir = fmt.Sprintf("services/%s", service)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
return err
}
}
fmt.Println("Build completed successfully!")
return nil
}
// Run all services using Docker Compose
func Run() error {
fmt.Println("Starting all services using Docker Compose...")
return exec.Command("docker-compose", "up", "--build").Run()
}
// Run tests for all services
func Test() error {
fmt.Println("Running tests for all microservices...")
for _, service := range services {
fmt.Printf("🔍 Testing %s...\n", service)
cmd := exec.Command("go", "test", "./...")
cmd.Dir = fmt.Sprintf("services/%s", service)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
return err
}
}
fmt.Println("All tests completed successfully!")
return nil
}
// Deploy to Kubernetes
func Deploy() error {
fmt.Println("🚀 Deploying to Kubernetes...")
return exec.Command("kubectl", "apply", "-f", "deployment/k8s/").Run()
}