package maker import ( "context" "fmt" "os" "os/exec" "path/filepath" "gitea.loveuer.com/yizhisec/pkg3/logger" "yizhisec.com/hsv2/forge/pkg/archiver" "yizhisec.com/hsv2/forge/pkg/model" "yizhisec.com/hsv2/forge/pkg/resource" ) func (m *maker) AppOEM(ctx context.Context, vendor string, replica int) error { const ( _nginx = `user root; worker_processes auto; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 512; } http { include /etc/nginx/mime.types; default_type application/octet-stream; access_log /var/log/nginx/access.log; sendfile on; keepalive_timeout 65; client_max_body_size 10M; server { listen 80; root /data; location / { try_files \$uri \$uri/ =404; } } }` _dockerfile = `FROM hub.yizhisec.com/external/nginx:1.29.1-alpine3.22 WORKDIR /data COPY oem /data/oem COPY nginx.conf /etc/nginx/nginx.conf CMD ["nginx", "-g", "daemon off;"]` _image = "hub.yizhisec.com/hybridscope/v2/oem-%s:latest" ) var ( err error _vendor = model.GetVendor(vendor) workdir = filepath.Join(m.workdir, "app", "oem") output []byte ) logger.Info("☑️ maker.AppOEM: 开始构建 oem[%s], workdir = %s", vendor, workdir) if _vendor == nil { supported := model.GetVendorNames() logger.Debug("❌ maker.AppOEM: vendor not supported, 支持的 vendor 有: %v", supported) return fmt.Errorf("请检查 vendor 是否正确, 支持的 vendor 有: %v", supported) } // 1. make workdir logger.Debug("☑️ maker.AppOEM: 开始创建 workdir = %s", workdir) if err = os.MkdirAll(workdir, 0o755); err != nil { return err } logger.Debug("✅ maker.AppOEM: workdir 创建成功 = %s", workdir) // 2. download oem.tar.gz logger.Debug("☑️ maker.AppOEM: 开始下载 oem[%s] url = %s", vendor, _vendor) if err = archiver.DownloadAndExtract(ctx, _vendor.OEMUrl, workdir); err != nil { logger.Debug("❌ maker.AppOEM: oem[%s] tar 下载失败, url = %s, err = %v", vendor, _vendor.OEMUrl, err) return err } if _vendor.OEMDir != "oem" { if err = os.Rename( filepath.Join(workdir, _vendor.OEMDir), filepath.Join(workdir, "oem"), ); err != nil { logger.Debug("❌ maker.AppOEM: oem[%s] tar 重命名失败, err = %v", vendor, err) return err } } logger.Debug("✅ maker.AppOEM: oem[%s] tar 下载成功", vendor) // 3. write nginx.conf logger.Debug("☑️ maker.AppOEM: 开始写入 nginx.conf") if err = os.WriteFile( filepath.Join(workdir, "nginx.conf"), []byte(_nginx), 0o644, ); err != nil { logger.Debug("❌ maker.AppOEM: nginx.conf 写入失败, err = %v", err) return err } logger.Debug("✅ maker.AppOEM: nginx.conf 写入成功") // 4. write Dockerfile logger.Debug("☑️ maker.AppOEM: 开始写入 Dockerfile") if err = os.WriteFile( filepath.Join(workdir, "Dockerfile"), []byte(_dockerfile), 0o644, ); err != nil { logger.Debug("❌ maker.AppOEM: Dockerfile 写入失败, err = %v", err) return err } logger.Debug("✅ maker.AppOEM: Dockerfile 写入成功") // 5. build docker image imageName := fmt.Sprintf(_image, vendor) logger.Debug("☑️ maker.AppOEM: 开始构建 docker image = %s", imageName) // docker build -t -f _cmd := exec.CommandContext(ctx, "docker", "build", "-t", imageName, "-f", filepath.Join(workdir, "Dockerfile"), workdir) if output, err = _cmd.CombinedOutput(); err != nil { logger.Debug("❌ maker.AppOEM: docker image 构建失败, err = %v, output = %s", err, string(output)) return err } logger.Debug("✅ maker.AppOEM: docker image 构建成功, image = %s", imageName) // 6. save docker image to image dir logger.Debug("☑️ maker.AppOEM: 开始保存 docker image = %s 到 %s", imageName, filepath.Join(m.workdir, "image", imageName)) if err = os.MkdirAll(filepath.Join(m.workdir, "dependency", "image"), 0o755); err != nil { logger.Debug("❌ maker.AppOEM: image 目录创建失败, err = %v", err) return err } if err = exec.CommandContext(ctx, "docker", "save", "-o", filepath.Join(m.workdir, "dependency", "image", "app.oem.tar"), imageName).Run(); err != nil { logger.Debug("❌ maker.AppOEM: docker image 保存失败, err = %v", err) return err } logger.Debug("✅ maker.AppOEM: docker image 保存成功, image = %s", imageName) // 7. render oem.yaml logger.Debug("☑️ maker.AppOEM: 开始渲染 deployment.yaml") oemYAML := fmt.Sprintf(resource.YAMLAppOEM, replica, imageName) if err = os.WriteFile( filepath.Join(workdir, "deployment.yaml"), []byte(oemYAML), 0o644, ); err != nil { logger.Debug("❌ maker.AppOEM: deployment.yaml 写入失败, err = %v", err) return err } logger.Debug("✅ maker.AppOEM: deployment.yaml 写入成功") logger.Info("✅ maker.AppOEM: 开始构建 oem[%s] 成功!!!", vendor) return nil }