163 lines
4.9 KiB
Go
163 lines
4.9 KiB
Go
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, version string, 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], version = %s, ,workdir = %s", vendor, version, 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)
|
|
_ = os.RemoveAll(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)
|
|
defer os.RemoveAll(filepath.Join(workdir, "oem"))
|
|
|
|
// 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 <image_name> -f <workdir/Dockerfile> <workdir>
|
|
_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)
|
|
defer os.RemoveAll(filepath.Join(workdir, "Dockerfile"))
|
|
defer os.RemoveAll(filepath.Join(workdir, "nginx.conf"))
|
|
|
|
if err = exec.CommandContext(ctx, "docker", "save", "-o", filepath.Join(workdir, "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 写入成功")
|
|
|
|
if err = os.WriteFile(filepath.Join(workdir, "version.txt"), []byte(version), 0644); err != nil {
|
|
logger.Debug("❌ maker.AppOEM: 写入 version.txt 失败: %v", err)
|
|
return err
|
|
}
|
|
|
|
logger.Info("✅ maker.AppOEM: 开始构建 oem[%s] 成功!!! version = %s", vendor, version)
|
|
|
|
return nil
|
|
}
|