chore: 完善个模块打包
This commit is contained in:
@@ -10,7 +10,7 @@ import (
|
||||
"yizhisec.com/hsv2/forge/pkg/resource"
|
||||
)
|
||||
|
||||
func (m *maker) AppClient(ctx context.Context, replica int) error {
|
||||
func (m *maker) AppClient(ctx context.Context, version string, replica int) error {
|
||||
const (
|
||||
_config = `Version: "3"
|
||||
APNs: /yizhisec/hs_nginx/data/443/oem/data.json
|
||||
@@ -206,7 +206,8 @@ kubectl rollout restart deployment client-deployment -n hsv2`
|
||||
workdir = filepath.Join(m.workdir, "app", "client")
|
||||
)
|
||||
|
||||
logger.Info("☑️ maker.AppClient: 开始构建 client 应用..., dir = %s", workdir)
|
||||
logger.Info("☑️ maker.AppClient: 开始构建 client 应用..., version = %s, dir = %s", version, workdir)
|
||||
_ = os.RemoveAll(workdir)
|
||||
logger.Debug("☑️ maker.AppClient: 开始创建工作目录 = %s", workdir)
|
||||
if err = os.MkdirAll(workdir, 0755); err != nil {
|
||||
logger.Debug("❌ maker.AppClient: 创建目录失败: %v", err)
|
||||
@@ -214,6 +215,17 @@ kubectl rollout restart deployment client-deployment -n hsv2`
|
||||
}
|
||||
logger.Debug("✅ maker.AppClient: 创建工作目录成功 = %s", workdir)
|
||||
|
||||
imgName := "hub.yizhisec.com/hybridscope/client_server:latest"
|
||||
logger.Debug("☑️ maker.AppClient: start pull image = %s", imgName)
|
||||
if err = m.Image(ctx, imgName,
|
||||
WithImageForcePull(true),
|
||||
WithImageSave(filepath.Join(workdir, "client.tar")),
|
||||
); err != nil {
|
||||
logger.Debug("❌ maker.AppClient: 拉取镜像失败: %v", err)
|
||||
return err
|
||||
}
|
||||
logger.Debug("✅ maker.AppClient: pull image success = %s", imgName)
|
||||
|
||||
if replica < 1 {
|
||||
replica = 1
|
||||
}
|
||||
@@ -240,6 +252,11 @@ kubectl rollout restart deployment client-deployment -n hsv2`
|
||||
}
|
||||
logger.Debug("✅ maker.AppClient: 构建 upsert.sh 脚本成功")
|
||||
|
||||
logger.Info("✅ maker.AppClient: 构建 client 应用成功!!!")
|
||||
if err = os.WriteFile(filepath.Join(workdir, "version.txt"), []byte(version), 0644); err != nil {
|
||||
logger.Debug("❌ maker.AppClient: 写入 version.txt 失败: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
logger.Info("✅ maker.AppClient: 构建 client 应用成功!!! version = %s", version)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
"yizhisec.com/hsv2/forge/pkg/resource"
|
||||
)
|
||||
|
||||
func (m *maker) AppFront(ctx context.Context, vendor string, replica int) error {
|
||||
func (m *maker) AppFront(ctx context.Context, version string, vendor string, replica int) error {
|
||||
var (
|
||||
err error
|
||||
location = filepath.Join(m.workdir, "app", "front")
|
||||
@@ -19,55 +19,53 @@ func (m *maker) AppFront(ctx context.Context, vendor string, replica int) error
|
||||
_vendor = model.GetVendor(vendor)
|
||||
)
|
||||
|
||||
logger.Info("☑️ maker.Front: 开始构建 front app..., workdir = %s", location)
|
||||
logger.Info("☑️ maker.Front: 开始构建 front app[%s]..., version = %s, vendor = %s, workdir = %s", vendor, version, location)
|
||||
|
||||
if _vendor == nil {
|
||||
logger.Debug("❌ maker.Front: vendor not supported, vendor = %s", vendor)
|
||||
return fmt.Errorf("vendor not supported: %s", vendor)
|
||||
}
|
||||
|
||||
_ = os.RemoveAll(location)
|
||||
if err = os.MkdirAll(location, 0755); err != nil {
|
||||
logger.Debug("❌ maker.Front: 创建目录失败: path = %s, err = %v", location, err)
|
||||
return err
|
||||
}
|
||||
|
||||
path := filepath.Join(location, "front.user.yaml")
|
||||
logger.Debug("☑️ maker.Front: writing front.user.yaml, path = %s", path)
|
||||
path := filepath.Join(location, "deployment.user.yaml")
|
||||
logger.Debug("☑️ maker.Front: writing deployment.user.yaml, path = %s", path)
|
||||
bs = []byte(fmt.Sprintf(resource.YAMLAppFrontUser, replica))
|
||||
if err = os.WriteFile(path, bs, 0644); err != nil {
|
||||
logger.Debug("❌ maker.Front: 写入 front.user.yaml 失败: path = %s, err = %v", path, err)
|
||||
logger.Debug("❌ maker.Front: 写入 deployment.user.yaml 失败: path = %s, err = %v", path, err)
|
||||
return err
|
||||
}
|
||||
logger.Debug("✅ maker.Front: write front.user.yaml success, path = %s", path)
|
||||
logger.Debug("✅ maker.Front: write deployment.user.yaml success, path = %s", path)
|
||||
|
||||
path = filepath.Join(location, "front.admin.yaml")
|
||||
logger.Debug("☑️ maker.Front: writing front.admin.yaml, path = %s", path)
|
||||
path = filepath.Join(location, "deployment.admin.yaml")
|
||||
logger.Debug("☑️ maker.Front: writing deployment.admin.yaml, path = %s", path)
|
||||
bs = []byte(fmt.Sprintf(resource.YAMLAppFrontAdmin, replica))
|
||||
if err = os.WriteFile(path, bs, 0644); err != nil {
|
||||
logger.Debug("❌ maker.Front: 写入 front.admin.yaml 失败: path = %s, err = %v", path, err)
|
||||
return err
|
||||
}
|
||||
logger.Debug("✅ maker.Front: write front.admin.yaml success, path = %s", path)
|
||||
|
||||
// todo, pull front images
|
||||
// 1. make image dir
|
||||
imgDir := filepath.Join(m.workdir, "dependency", "image")
|
||||
if err = os.MkdirAll(imgDir, 0755); err != nil {
|
||||
logger.Debug("❌ maker.Front: 创建目录失败: path = %s, err = %v", imgDir, err)
|
||||
logger.Debug("❌ maker.Front: 写入 deployment.admin.yaml 失败: path = %s, err = %v", path, err)
|
||||
return err
|
||||
}
|
||||
logger.Debug("✅ maker.Front: write deployment.admin.yaml success, path = %s", path)
|
||||
|
||||
logger.Debug("☑️ maker.Front: pulling front images, vendor = %s", vendor)
|
||||
if err = m.Image(ctx, _vendor.AppFrontUserImageName, WithImageSave(filepath.Join(imgDir, "app.front.user.tar")), WithImageForcePull(true)); err != nil {
|
||||
if err = m.Image(ctx, _vendor.AppFrontUserImageName, WithImageSave(filepath.Join(location, "front.user.tar")), WithImageForcePull(true)); err != nil {
|
||||
logger.Debug("❌ maker.Front: 拉取 front 用户镜像失败: %s, err = %v", _vendor.AppFrontUserImageName, err)
|
||||
return err
|
||||
}
|
||||
if err = m.Image(ctx, _vendor.AppFrontAdminImageName, WithImageSave(filepath.Join(imgDir, "app.front.admin.tar")), WithImageForcePull(true)); err != nil {
|
||||
if err = m.Image(ctx, _vendor.AppFrontAdminImageName, WithImageSave(filepath.Join(location, "front.admin.tar")), WithImageForcePull(true)); err != nil {
|
||||
logger.Debug("❌ maker.Front: 拉取 front 管理镜像失败: %s, err = %v", _vendor.AppFrontAdminImageName, err)
|
||||
return err
|
||||
}
|
||||
|
||||
logger.Info("✅ maker.Front: 构建 front app 完成")
|
||||
if err = os.WriteFile(filepath.Join(location, "version.txt"), []byte(version), 0644); err != nil {
|
||||
logger.Debug("❌ maker.Front: 写入 version.txt 失败: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
logger.Info("✅ maker.Front: 构建 front app[%s] 完成, version = %s", vendor, version)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ import (
|
||||
"yizhisec.com/hsv2/forge/pkg/resource"
|
||||
)
|
||||
|
||||
func (m *maker) AppGateway(ctx context.Context, replica int) error {
|
||||
func (m *maker) AppGateway(ctx context.Context, version string, replica int) error {
|
||||
const (
|
||||
_config = `Version: "3"
|
||||
Database:
|
||||
@@ -59,7 +59,8 @@ kubectl rollout restart deployment gateway-deployment -n hsv2`
|
||||
workdir = filepath.Join(m.workdir, "app", "gateway")
|
||||
)
|
||||
|
||||
logger.Info("☑️ maker.AppGateway: 开始构建 gateway 应用..., dir = %s", workdir)
|
||||
logger.Info("☑️ maker.AppGateway: 开始构建 gateway 应用..., version = %s, dir = %s", version, workdir)
|
||||
_ = os.RemoveAll(workdir)
|
||||
logger.Debug("☑️ maker.AppGateway: 开始创建工作目录 = %s", workdir)
|
||||
if err = os.MkdirAll(workdir, 0755); err != nil {
|
||||
logger.Debug("❌ maker.AppGateway: 创建目录失败: %v", err)
|
||||
@@ -67,6 +68,17 @@ kubectl rollout restart deployment gateway-deployment -n hsv2`
|
||||
}
|
||||
logger.Debug("✅ maker.AppGateway: 创建工作目录成功 = %s", workdir)
|
||||
|
||||
imgName := "hub.yizhisec.com/hybridscope/gateway_controller:latest"
|
||||
logger.Debug("☑️ maker.AppGateway: start pull image = %s", imgName)
|
||||
if err = m.Image(ctx, imgName,
|
||||
WithImageForcePull(true),
|
||||
WithImageSave(filepath.Join(workdir, "gateway.tar")),
|
||||
); err != nil {
|
||||
logger.Debug("❌ maker.AppGateway: 拉取镜像失败: %v", err)
|
||||
return err
|
||||
}
|
||||
logger.Debug("✅ maker.AppGateway: pull image success = %s", imgName)
|
||||
|
||||
if replica < 1 {
|
||||
replica = 1
|
||||
}
|
||||
@@ -93,6 +105,16 @@ kubectl rollout restart deployment gateway-deployment -n hsv2`
|
||||
}
|
||||
logger.Debug("✅ maker.AppGateway: 构建 upsert.sh 脚本成功")
|
||||
|
||||
logger.Info("✅ maker.AppGateway: 构建 gateway 应用成功!!!")
|
||||
if err = os.WriteFile(filepath.Join(workdir, "version.txt"), []byte(version), 0644); err != nil {
|
||||
logger.Debug("❌ maker.AppGateway: 写入 version.txt 失败: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
if err = os.WriteFile(filepath.Join(workdir, "version.txt"), []byte(version), 0644); err != nil {
|
||||
logger.Debug("❌ maker.AppGateway: 写入 version.txt 失败: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
logger.Info("✅ maker.AppGateway: 构建 gateway 应用成功!!! version = %s", version)
|
||||
return nil
|
||||
}
|
||||
|
||||
73
internal/controller/maker/app.helper.go
Normal file
73
internal/controller/maker/app.helper.go
Normal file
@@ -0,0 +1,73 @@
|
||||
package maker
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"gitea.loveuer.com/yizhisec/pkg3/logger"
|
||||
"yizhisec.com/hsv2/forge/pkg/resource"
|
||||
)
|
||||
|
||||
// AppHelper
|
||||
func (m *maker) AppHelper(ctx context.Context, version string, vendor string, replica int) error {
|
||||
const (
|
||||
// _config = ``
|
||||
_upsert = `#!/bin/bash
|
||||
|
||||
kubectl apply -f deployment.yaml
|
||||
kubectl rollout restart deployment app-helper-deployment -n hsv2`
|
||||
)
|
||||
var (
|
||||
err error
|
||||
workdir = filepath.Join(m.workdir, "app", "helper")
|
||||
)
|
||||
|
||||
logger.Info("☑️ maker.AppHelper: 开始构建 helper 应用..., version = %s, vendor = %s, dir = %s", version, vendor, workdir)
|
||||
_ = os.RemoveAll(workdir)
|
||||
logger.Debug("☑️ maker.AppHelper: 开始创建工作目录 = %s", workdir)
|
||||
if err = os.MkdirAll(workdir, 0755); err != nil {
|
||||
logger.Debug("❌ maker.AppHelper: 创建目录失败: %v", err)
|
||||
return err
|
||||
}
|
||||
logger.Debug("✅ maker.AppHelper: 创建工作目录成功 = %s", workdir)
|
||||
|
||||
imgName := "hub.yizhisec.com/hsv2/app/helper:latest"
|
||||
logger.Debug("☑️ maker.AppHelper: start pull image = %s", imgName)
|
||||
if err = m.Image(ctx, imgName,
|
||||
WithImageForcePull(true),
|
||||
WithImageSave(filepath.Join(workdir, "helper.tar")),
|
||||
); err != nil {
|
||||
logger.Debug("❌ maker.AppHelper: 拉取镜像失败: %v", err)
|
||||
return err
|
||||
}
|
||||
logger.Debug("✅ maker.AppHelper: pull image success = %s", imgName)
|
||||
|
||||
if replica < 1 {
|
||||
replica = 1
|
||||
}
|
||||
|
||||
logger.Debug("☑️ maker.AppHelper: 开始构建 yaml 资源文件")
|
||||
content := []byte(fmt.Sprintf(resource.YAMLAppHelper, replica, version))
|
||||
if err = os.WriteFile(filepath.Join(workdir, "deployment.yaml"), content, 0644); err != nil {
|
||||
logger.Debug("❌ maker.AppHelper: 写入 deployment.yaml 失败: %v", err)
|
||||
return err
|
||||
}
|
||||
logger.Debug("✅ maker.AppHelper: 开始 yaml 资源文件成功")
|
||||
|
||||
logger.Debug("☑️ maker.AppHelper: 开始构建 upsert.sh 脚本")
|
||||
if err = os.WriteFile(filepath.Join(workdir, "upsert.sh"), []byte(_upsert), 0755); err != nil {
|
||||
logger.Debug("❌ maker.AppHelper: 写入 upsert.sh 失败: %v", err)
|
||||
return err
|
||||
}
|
||||
logger.Debug("✅ maker.AppHelper: 构建 upsert.sh 脚本成功")
|
||||
|
||||
if err = os.WriteFile(filepath.Join(workdir, "version.txt"), []byte(version), 0644); err != nil {
|
||||
logger.Debug("❌ maker.AppHelper: 写入 version.txt 失败: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
logger.Info("✅ maker.AppHelper: 构建 helper 应用成功!!! version = %s", version)
|
||||
return nil
|
||||
}
|
||||
@@ -10,7 +10,7 @@ import (
|
||||
"yizhisec.com/hsv2/forge/pkg/resource"
|
||||
)
|
||||
|
||||
func (m *maker) AppMie(ctx context.Context, replica int) error {
|
||||
func (m *maker) AppMie(ctx context.Context, version string, replica int) error {
|
||||
const (
|
||||
_config = `Version: "3"
|
||||
BackupSeafile:
|
||||
@@ -136,7 +136,8 @@ kubectl rollout restart deployment api-deployment -n hsv2`
|
||||
workdir = filepath.Join(m.workdir, "app", "mie")
|
||||
)
|
||||
|
||||
logger.Info("☑️ maker.AppMie: 开始构建 mie ... workdir = %s", workdir)
|
||||
logger.Info("☑️ maker.AppMie: 开始构建 mie ... version = %s, workdir = %s", version, workdir)
|
||||
_ = os.RemoveAll(workdir)
|
||||
logger.Debug("☑️ maker.AppMie: 开始创建工作目录 = %s", workdir)
|
||||
if err = os.MkdirAll(workdir, 0755); err != nil {
|
||||
logger.Debug("❌ maker.AppMie: 创建目录失败: %v", err)
|
||||
@@ -144,6 +145,17 @@ kubectl rollout restart deployment api-deployment -n hsv2`
|
||||
}
|
||||
logger.Debug("✅ maker.AppMie: 创建工作目录成功 = %s", workdir)
|
||||
|
||||
imgName := "hub.yizhisec.com/hybridscope/mie-server:latest"
|
||||
logger.Debug("☑️ maker.AppMie: start pull image = %s", imgName)
|
||||
if err = m.Image(ctx, imgName,
|
||||
WithImageForcePull(true),
|
||||
WithImageSave(filepath.Join(workdir, "mie.tar")),
|
||||
); err != nil {
|
||||
logger.Debug("❌ maker.AppMie: 拉取镜像失败: %v", err)
|
||||
return err
|
||||
}
|
||||
logger.Debug("✅ maker.AppMie: pull image success = %s", imgName)
|
||||
|
||||
if replica < 1 {
|
||||
replica = 1
|
||||
}
|
||||
@@ -191,6 +203,11 @@ kubectl rollout restart deployment api-deployment -n hsv2`
|
||||
}
|
||||
logger.Debug("✅ maker.AppMie: 写入 upsert.sh 文件成功, dest = %s", filepath.Join(workdir, "upsert.sh"))
|
||||
|
||||
logger.Info("✅ maker.AppMie: 构建 mie 成功!!! workdir = %s", workdir)
|
||||
if err = os.WriteFile(filepath.Join(workdir, "version.txt"), []byte(version), 0644); err != nil {
|
||||
logger.Debug("❌ maker.AppMie: 写入 version.txt 失败: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
logger.Info("✅ maker.AppMie: 构建 mie 成功!!! version = %s, workdir = %s", version, workdir)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -5,34 +5,14 @@ import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"gitea.loveuer.com/yizhisec/pkg3/logger"
|
||||
"github.com/samber/lo"
|
||||
"yizhisec.com/hsv2/forge/internal/opt"
|
||||
"yizhisec.com/hsv2/forge/pkg/resource"
|
||||
)
|
||||
|
||||
type NginxOpt func(*nginxOpt)
|
||||
|
||||
type nginxOpt struct {
|
||||
WithoutSeafile bool
|
||||
Replica int
|
||||
}
|
||||
|
||||
func WithNginxReplica(replica int) NginxOpt {
|
||||
return func(o *nginxOpt) {
|
||||
if replica >= 0 {
|
||||
o.Replica = replica
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func WithoutNginxSeafile() NginxOpt {
|
||||
return func(o *nginxOpt) {
|
||||
o.WithoutSeafile = true
|
||||
}
|
||||
}
|
||||
|
||||
func (m *maker) AppNginx(ctx context.Context, opts ...NginxOpt) error {
|
||||
func (m *maker) AppNginx(ctx context.Context, version string, vendor string, replica int, inlcudeImage bool) error {
|
||||
const (
|
||||
_upsert = `#!/bin/bash
|
||||
|
||||
@@ -59,31 +39,40 @@ kubectl create configmap ssl-client-server-key --namespace hsv2 --from-file=clie
|
||||
kubectl create configmap ssl-web-server-crt --namespace hsv2 --from-file=web.server.crt=./ssl/web.server.crt --dry-run=client -o yaml | kubectl apply -f -
|
||||
kubectl create configmap ssl-web-server-key --namespace hsv2 --from-file=web.server.key=./ssl/web.server.key --dry-run=client -o yaml | kubectl apply -f -
|
||||
|
||||
kubectl apply -f nginx.yaml
|
||||
kubectl apply -f deployment.yaml
|
||||
kubectl rollout restart deployment nginx-deployment -n hsv2`
|
||||
)
|
||||
var (
|
||||
err error
|
||||
workdir = filepath.Join(m.workdir, "app", "nginx")
|
||||
o = nginxOpt{
|
||||
WithoutSeafile: false,
|
||||
Replica: 2,
|
||||
}
|
||||
err error
|
||||
workdir = filepath.Join(m.workdir, "app", "nginx")
|
||||
applySeafile = "kubectl create configmap nginx-seafile --namespace hsv2 --from-file=seafile.conf=./conf/seafile.conf --dry-run=client -o yaml | kubectl apply -f -"
|
||||
)
|
||||
|
||||
logger.Info(" ☑️ maker.AppNginx: 开始构建 nginx, workdir = %s", workdir)
|
||||
logger.Info("☑️ maker.AppNginx: 开始构建 nginx, version = %s, vendor = %s, workdir = %s", version, vendor, workdir)
|
||||
|
||||
for _, fn := range opts {
|
||||
fn(&o)
|
||||
}
|
||||
|
||||
logger.Debug(" ☑️ maker.AppNginx: 创建工作目录 = %s", workdir)
|
||||
logger.Debug("☑️ maker.AppNginx: 创建工作目录 = %s", workdir)
|
||||
_ = os.RemoveAll(workdir)
|
||||
if err = os.MkdirAll(workdir, 0755); err != nil {
|
||||
return err
|
||||
}
|
||||
logger.Debug("✅ maker.AppNginx: 创建工作目录成功 = %s", workdir)
|
||||
|
||||
if inlcudeImage {
|
||||
logger.Debug("☑️ maker.AppNginx: start pull image = %s", opt.IMAGE_NGINX)
|
||||
if err = m.Image(ctx, opt.IMAGE_NGINX, WithImageSave(filepath.Join(workdir, "nginx.tar"))); err != nil {
|
||||
logger.Debug("❌ maker.AppNginx: 拉取镜像失败: %v", err)
|
||||
return err
|
||||
}
|
||||
logger.Debug("✅ maker.AppNginx: pull image success = %s", opt.IMAGE_NGINX)
|
||||
|
||||
tag := strings.Split(opt.IMAGE_NGINX, ":")[1]
|
||||
logger.Debug("☑️ maker.AppNginx: write tag.txt = %s", tag)
|
||||
if err = os.WriteFile(filepath.Join(workdir, "tag.txt"), []byte(tag), 0644); err != nil {
|
||||
logger.Debug("❌ maker.AppNginx: 写入 tag.txt 失败: %v", err)
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// 子目录: conf 与 ssl
|
||||
confDir := filepath.Join(workdir, "conf")
|
||||
sslDir := filepath.Join(workdir, "ssl")
|
||||
@@ -113,8 +102,8 @@ kubectl rollout restart deployment nginx-deployment -n hsv2`
|
||||
{"common.conf", resource.NGINXCommon},
|
||||
}
|
||||
|
||||
// 过滤 seafile.conf 文件
|
||||
if !o.WithoutSeafile {
|
||||
// vendor != elink, append seafile conf
|
||||
if vendor != "elink" {
|
||||
confFiles = append(confFiles, struct {
|
||||
name string
|
||||
content []byte
|
||||
@@ -157,23 +146,31 @@ kubectl rollout restart deployment nginx-deployment -n hsv2`
|
||||
}
|
||||
|
||||
// write nginx deployment yaml
|
||||
dest := filepath.Join(workdir, "nginx.yaml")
|
||||
content := []byte(fmt.Sprintf(resource.YAMLAppNGINX, o.Replica))
|
||||
dest := filepath.Join(workdir, "deployment.yaml")
|
||||
content := []byte(fmt.Sprintf(resource.YAMLAppNGINX, replica))
|
||||
if err = os.WriteFile(dest, content, 0644); err != nil {
|
||||
logger.Debug("❌ maker.AppNginx: 写入 nginx.yaml 失败: %v", err)
|
||||
logger.Debug("❌ maker.AppNginx: 写入 deployment.yaml 失败: %v", err)
|
||||
return err
|
||||
}
|
||||
logger.Debug("✅ maker.AppNginx: 写入 nginx.yaml 成功, dest = %s", dest)
|
||||
logger.Debug("✅ maker.AppNginx: 写入 deployment.yaml 成功, dest = %s", dest)
|
||||
|
||||
// write nginx upsert script
|
||||
dest = filepath.Join(workdir, "upsert.sh")
|
||||
content = []byte(fmt.Sprintf(_upsert, lo.If(o.WithoutSeafile, "").Else(applySeafile)))
|
||||
if vendor == "elink" {
|
||||
applySeafile = ""
|
||||
}
|
||||
content = []byte(fmt.Sprintf(_upsert, applySeafile))
|
||||
if err = os.WriteFile(dest, content, 0755); err != nil {
|
||||
logger.Debug("❌ maker.AppNginx: 写入 upsert.sh 失败: %v", err)
|
||||
return err
|
||||
}
|
||||
logger.Debug("✅ maker.AppNginx: 写入 upsert.sh 成功, dest = %s", dest)
|
||||
|
||||
logger.Info("✅ maker.AppNginx: nginx 构建完成")
|
||||
if err = os.WriteFile(filepath.Join(workdir, "version.txt"), []byte(version), 0644); err != nil {
|
||||
logger.Debug("❌ maker.AppNginx: 写入 version.txt 失败: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
logger.Info("✅ maker.AppNginx: nginx 构建完成, version = %s, vendor = %s", version, vendor)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ import (
|
||||
"yizhisec.com/hsv2/forge/pkg/resource"
|
||||
)
|
||||
|
||||
func (m *maker) AppOEM(ctx context.Context, vendor string, replica int) error {
|
||||
func (m *maker) AppOEM(ctx context.Context, version string, vendor string, replica int) error {
|
||||
const (
|
||||
_nginx = `user root;
|
||||
worker_processes auto;
|
||||
@@ -61,7 +61,7 @@ CMD ["nginx", "-g", "daemon off;"]`
|
||||
output []byte
|
||||
)
|
||||
|
||||
logger.Info("☑️ maker.AppOEM: 开始构建 oem[%s], workdir = %s", vendor, workdir)
|
||||
logger.Info("☑️ maker.AppOEM: 开始构建 oem[%s], version = %s, ,workdir = %s", vendor, version, workdir)
|
||||
|
||||
if _vendor == nil {
|
||||
supported := model.GetVendorNames()
|
||||
@@ -71,6 +71,7 @@ CMD ["nginx", "-g", "daemon off;"]`
|
||||
|
||||
// 1. make workdir
|
||||
logger.Debug("☑️ maker.AppOEM: 开始创建 workdir = %s", workdir)
|
||||
_ = os.RemoveAll(workdir)
|
||||
if err = os.MkdirAll(workdir, 0o755); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -92,6 +93,7 @@ CMD ["nginx", "-g", "daemon off;"]`
|
||||
}
|
||||
}
|
||||
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")
|
||||
@@ -127,14 +129,10 @@ CMD ["nginx", "-g", "daemon off;"]`
|
||||
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"))
|
||||
|
||||
// 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 {
|
||||
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
|
||||
}
|
||||
@@ -153,7 +151,12 @@ CMD ["nginx", "-g", "daemon off;"]`
|
||||
}
|
||||
logger.Debug("✅ maker.AppOEM: deployment.yaml 写入成功")
|
||||
|
||||
logger.Info("✅ maker.AppOEM: 开始构建 oem[%s] 成功!!!", vendor)
|
||||
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
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ import (
|
||||
"yizhisec.com/hsv2/forge/pkg/resource"
|
||||
)
|
||||
|
||||
func (m *maker) AppUser(ctx context.Context, replica int) error {
|
||||
func (m *maker) AppUser(ctx context.Context, version string, replica int) error {
|
||||
const (
|
||||
_config = `Version: "3"
|
||||
Database:
|
||||
@@ -87,15 +87,27 @@ kubectl rollout restart deployment user-deployment -n hsv2`
|
||||
workdir = filepath.Join(m.workdir, "app", "user")
|
||||
)
|
||||
|
||||
logger.Info("☑️ maker.AppUser: 开始构建 user 应用..., dir = %s", workdir)
|
||||
logger.Info("☑️ maker.AppUser: 开始构建 user 应用..., version = %s, dir = %s", version, workdir)
|
||||
|
||||
logger.Debug("☑️ maker.AppUser: 开始创建工作目录 = %s", workdir)
|
||||
_ = os.RemoveAll(workdir)
|
||||
if err = os.MkdirAll(workdir, 0755); err != nil {
|
||||
logger.Debug("❌ maker.AppUser: 创建目录失败: %v", err)
|
||||
return err
|
||||
}
|
||||
logger.Debug("✅ maker.AppUser: 创建工作目录成功 = %s", workdir)
|
||||
|
||||
imgName := "hub.yizhisec.com/hybridscope/user_management:latest"
|
||||
logger.Debug("☑️ maker.AppUser: start pull image = %s", imgName)
|
||||
if err = m.Image(ctx, imgName,
|
||||
WithImageForcePull(true),
|
||||
WithImageSave(filepath.Join(workdir, "user.tar")),
|
||||
); err != nil {
|
||||
logger.Debug("❌ maker.AppUser: 拉取镜像失败: %v", err)
|
||||
return err
|
||||
}
|
||||
logger.Debug("✅ maker.AppUser: pull image success = %s", imgName)
|
||||
|
||||
if replica < 1 {
|
||||
replica = 1
|
||||
}
|
||||
@@ -123,6 +135,11 @@ kubectl rollout restart deployment user-deployment -n hsv2`
|
||||
}
|
||||
logger.Debug("✅ maker.AppUser: 构建 upsert.sh 脚本成功")
|
||||
|
||||
logger.Info("✅ maker.AppUser: 构建 user 应用成功!!!")
|
||||
if err = os.WriteFile(filepath.Join(workdir, "version.txt"), []byte(version), 0644); err != nil {
|
||||
logger.Debug("❌ maker.AppUser: 写入 version.txt 失败: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
logger.Info("✅ maker.AppUser: 构建 user 应用成功!!! version = %s", version)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package maker
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
@@ -21,6 +22,13 @@ type ClientPKGOption func(*clientPKGOption)
|
||||
type clientPKGOption struct {
|
||||
Downloads []*clientPKGDownload
|
||||
CMDs []string
|
||||
MakePkg bool
|
||||
}
|
||||
|
||||
func WithClientPkgMakePkg(pkg bool) ClientPKGOption {
|
||||
return func(o *clientPKGOption) {
|
||||
o.MakePkg = pkg
|
||||
}
|
||||
}
|
||||
|
||||
func WithClientPKGDownload(url, location string) ClientPKGOption {
|
||||
@@ -36,22 +44,21 @@ func WithClientPKGDownload(url, location string) ClientPKGOption {
|
||||
}
|
||||
}
|
||||
|
||||
func WithClientPKGCMD(cmd string) ClientPKGOption {
|
||||
func WithClientPKGCMDs(cmds ...string) ClientPKGOption {
|
||||
return func(o *clientPKGOption) {
|
||||
if cmd == "" {
|
||||
return
|
||||
}
|
||||
o.CMDs = append(o.CMDs, cmd)
|
||||
adds := lo.Filter(cmds, func(cmd string, _ int) bool { return cmd != "" })
|
||||
o.CMDs = append(o.CMDs, adds...)
|
||||
}
|
||||
}
|
||||
|
||||
func (m *maker) ClientPKG(ctx context.Context, _os string, _version string, api string, opts ...ClientPKGOption) error {
|
||||
const (
|
||||
Dockerfile = `
|
||||
FROM hub.yizhisec.com/external/nginx:1.29.4-alpine3.23
|
||||
FROM hub.yizhisec.com/hsv2/base/nginx:latest
|
||||
|
||||
RUN mkdir -p /data
|
||||
%s
|
||||
COPY version.json /data/version.json
|
||||
|
||||
%s
|
||||
|
||||
COPY nginx.conf /etc/nginx/nginx.conf
|
||||
@@ -71,7 +78,6 @@ COPY nginx.conf /etc/nginx/nginx.conf
|
||||
location = filepath.Join(m.workdir, "client", _os)
|
||||
_file string
|
||||
_content string
|
||||
_cmds = ""
|
||||
)
|
||||
|
||||
for _, fn := range opts {
|
||||
@@ -80,16 +86,31 @@ COPY nginx.conf /etc/nginx/nginx.conf
|
||||
|
||||
logger.Info("☑️ maker.ClientPKG: start build client pkg, os = %s, version = %s, location = %s", _os, _version, location)
|
||||
|
||||
if err = os.RemoveAll(location); err != nil {
|
||||
logger.Debug("❌ maker.ClientPKG: remove directory failed, directory = %s, err = %s", location, err.Error())
|
||||
return err
|
||||
}
|
||||
|
||||
if err = os.MkdirAll(location, 0755); err != nil {
|
||||
logger.Debug("❌ maker.ClientPKG: create directory failed, directory = %s, err = %s", location, err.Error())
|
||||
return err
|
||||
}
|
||||
|
||||
vd := map[string]string{
|
||||
"version": _version,
|
||||
}
|
||||
vbs, _ := json.Marshal(vd)
|
||||
|
||||
if err = os.WriteFile(filepath.Join(location, "version.txt"), []byte(_version), 0644); err != nil {
|
||||
logger.Debug("❌ maker.ClientPKG: write file failed, file = %s, err = %s", filepath.Join(location, "version.txt"), err.Error())
|
||||
return err
|
||||
}
|
||||
|
||||
if err = os.WriteFile(filepath.Join(location, "version.json"), []byte(vbs), 0644); err != nil {
|
||||
logger.Debug("❌ maker.ClientPKG: write file failed, file = %s, err = %s", filepath.Join(location, "version.json"), err.Error())
|
||||
return err
|
||||
}
|
||||
|
||||
_file = filepath.Join(location, "nginx.conf")
|
||||
_content = fmt.Sprintf(resource.NGINXClientPKG, api)
|
||||
logger.Debug("☑️ maker.ClientPKG: start write file = %s", _file)
|
||||
@@ -100,15 +121,15 @@ COPY nginx.conf /etc/nginx/nginx.conf
|
||||
logger.Debug("✅ maker.ClientPKG: write file success, file = %s", _file)
|
||||
|
||||
lines := lo.Map(o.Downloads, func(d *clientPKGDownload, index int) string {
|
||||
return fmt.Sprintf("RUN wget -O /data/%s %s", d.Name, d.URL)
|
||||
return fmt.Sprintf("wget -O /data/%s %s", d.Name, d.URL)
|
||||
})
|
||||
|
||||
if len(o.CMDs) > 0 {
|
||||
_cmds = fmt.Sprintf("RUN %s", strings.Join(o.CMDs, " && "))
|
||||
lines = append(lines, o.CMDs...)
|
||||
}
|
||||
|
||||
_file = filepath.Join(location, "Dockerfile")
|
||||
_content = fmt.Sprintf(Dockerfile, strings.Join(lines, "\n"), _cmds)
|
||||
_content = fmt.Sprintf(Dockerfile, "RUN "+strings.Join(lines, " && "))
|
||||
logger.Debug("☑️ maker.ClientPKG: start write file = %s", _file)
|
||||
if os.WriteFile(_file, []byte(_content), 0644); err != nil {
|
||||
logger.Debug("❌ maker.ClientPKG: write file failed, file = %s, err = %s", _file, err.Error())
|
||||
@@ -148,6 +169,15 @@ COPY nginx.conf /etc/nginx/nginx.conf
|
||||
return err
|
||||
}
|
||||
|
||||
if o.MakePkg {
|
||||
_cmd := fmt.Sprintf("7za a -pRrPt7Uo9WM1dkXOJmHps56T8BZY2qA4g -mhe=on client.%s.pkg *", _os)
|
||||
logger.Debug("☑️ maker.ClientPKG: start create client.%s.pkg by 7zip(7za), cmd = '%s'", _os, _cmd)
|
||||
if err = m.RunCommand(ctx, location, _cmd); err != nil {
|
||||
logger.Debug("❌ maker.ClientPKG: run command failed, cmd = %s, err = %s", _cmd, err.Error())
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
logger.Info("️✅ maker.ClientPKG: build client pkg success, os = %s, version = %s, location = %s", _os, _version, location)
|
||||
|
||||
return nil
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package maker
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"os/exec"
|
||||
@@ -18,9 +19,13 @@ func (m *maker) RunCommand(ctx context.Context, dir string, _cmds ...string) err
|
||||
cmd.Dir = dir
|
||||
}
|
||||
|
||||
var buf bytes.Buffer
|
||||
cmd.Stdout = &buf
|
||||
cmd.Stderr = &buf
|
||||
|
||||
// Execute the command
|
||||
if err := cmd.Run(); err != nil {
|
||||
return fmt.Errorf("failed to run command '%s' in directory '%s': %w", cmdStr, dir, err)
|
||||
return fmt.Errorf("failed to run command '%s' in directory '%s': %w, output = %s", cmdStr, dir, err, buf.String())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ After=network.target containerd.service
|
||||
|
||||
[Service]
|
||||
# 启动前清理旧容器
|
||||
# ExecStartPre=-/usr/local/bin/k0s ctr -n hs-net task kill hs-net
|
||||
ExecStartPre=-/usr/local/bin/k0s ctr -n hs-net task kill hs-net
|
||||
ExecStartPre=-/usr/local/bin/k0s ctr namespace create hs-net
|
||||
ExecStartPre=-/usr/local/bin/k0s ctr -n hs-net container rm hs-net
|
||||
|
||||
@@ -59,7 +59,7 @@ StandardError=journal
|
||||
SyslogIdentifier=hs-net
|
||||
|
||||
# 清理退出的容器
|
||||
# ExecStop=/usr/local/bin/k0s ctr -n hs-net task kill hs-net
|
||||
ExecStop=/usr/local/bin/k0s ctr -n hs-net task kill hs-net
|
||||
ExecStopPost=/usr/local/bin/k0s ctr -n hs-net container rm hs-net
|
||||
|
||||
[Install]
|
||||
@@ -166,11 +166,35 @@ tcp_mode_disable: false
|
||||
|
||||
logger.Info("☑️ MakeHSNet: 开始构建 hs-net, workdir = %s", workdir)
|
||||
|
||||
_ = os.RemoveAll(workdir)
|
||||
if err = os.MkdirAll(workdir, 0755); err != nil {
|
||||
logger.Debug("❌ MakeHSNet: 创建目录失败: %s", err.Error())
|
||||
return err
|
||||
}
|
||||
|
||||
// {Name: "", Fallback: "", Save: "app.less_dns.tar", Force: true},
|
||||
imgName := "hub.yizhisec.com/hybridscope/hsnet:release_2.1.0-std"
|
||||
logger.Debug("☑️ maker.HSNet: start pull image = %s", imgName)
|
||||
if err = m.Image(ctx, imgName,
|
||||
WithImageForcePull(true),
|
||||
WithImageSave(filepath.Join(workdir, "hsnet.tar")),
|
||||
); err != nil {
|
||||
logger.Debug("❌ maker.HSNet: 拉取镜像失败: %v", err)
|
||||
return err
|
||||
}
|
||||
logger.Debug("✅ maker.HSNet: pull image success = %s", imgName)
|
||||
|
||||
imgName = "hub.yizhisec.com/hybridscope/less_dns_service:latest"
|
||||
logger.Debug("☑️ maker.HSNet: start pull image = %s", imgName)
|
||||
if err = m.Image(ctx, imgName,
|
||||
WithImageForcePull(true),
|
||||
WithImageSave(filepath.Join(workdir, "less-dns.tar")),
|
||||
); err != nil {
|
||||
logger.Debug("❌ maker.HSNet: 拉取镜像失败: %v", err)
|
||||
return err
|
||||
}
|
||||
logger.Debug("✅ maker.HSNet: pull image success = %s", imgName)
|
||||
|
||||
if err = archiver.DownloadAndExtract(ctx, _url, workdir); err != nil {
|
||||
logger.Debug("❌ MakeHSNet: 下载和解压失败: %s", err.Error())
|
||||
return err
|
||||
@@ -225,15 +249,6 @@ tcp_mode_disable: false
|
||||
return err
|
||||
}
|
||||
|
||||
imgName := "hub.yizhisec.com/hybridscope/hsnet:release_2.1.0-std"
|
||||
imgPath := filepath.Join(workdir, "hs-net.tar")
|
||||
logger.Debug("☑️ MakeHSNet: 构建镜像 %s 到 %s", imgName, imgPath)
|
||||
if err = m.Image(ctx, imgName, WithImageSave(imgPath), WithImageForcePull(true)); err != nil {
|
||||
logger.Debug("❌ MakeHSNet: 构建镜像失败: %s", err.Error())
|
||||
return err
|
||||
}
|
||||
logger.Debug("✅ MakeHSNet: 构建镜像 %s 到 %s 成功", imgName, imgPath)
|
||||
|
||||
// write hs-net.service
|
||||
if err = os.WriteFile(filepath.Join(workdir, "hs-net.service"), []byte(_service), 0644); err != nil {
|
||||
logger.Debug("❌ MakeHSNet: 写入服务文件失败: %s", err.Error())
|
||||
|
||||
@@ -112,14 +112,6 @@ func (m *maker) Images(ctx context.Context) error {
|
||||
|
||||
var images = []*model.Image{
|
||||
{Name: "hub.yizhisec.com/external/alpine:3.22.2", Fallback: "", Save: "alpine.tar", Force: true},
|
||||
{Name: "hub.yizhisec.com/external/nginx:1.29.1-alpine3.22", Fallback: "", Save: "nginx.1.29.1-alpine3.22.tar"},
|
||||
|
||||
{Name: "hub.yizhisec.com/hybridscope/user_management:latest", Fallback: "", Save: "app.user.tar", Force: true},
|
||||
{Name: "hub.yizhisec.com/hybridscope/gateway_controller:latest", Fallback: "", Save: "app.gateway.tar", Force: true},
|
||||
{Name: "hub.yizhisec.com/hybridscope/client_server:latest", Fallback: "", Save: "app.client.tar", Force: true},
|
||||
{Name: "hub.yizhisec.com/hybridscope/mie-server:latest", Fallback: "", Save: "app.mie.tar", Force: true},
|
||||
{Name: "hub.yizhisec.com/hybridscope/less_dns_service:latest", Fallback: "", Save: "app.less_dns.tar", Force: true},
|
||||
{Name: "hub.yizhisec.com/hybridscope/hsnet:release_2.1.0-std", Fallback: "", Save: "app.hsnet.tar", Force: true},
|
||||
}
|
||||
|
||||
for _, image := range images {
|
||||
|
||||
@@ -2,6 +2,7 @@ package maker
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
@@ -12,24 +13,27 @@ import (
|
||||
|
||||
type YosguardOpt func(*yosguardOpt)
|
||||
|
||||
type yosguardOpt struct{}
|
||||
type yosguardOpt struct {
|
||||
Pkg bool
|
||||
}
|
||||
|
||||
func WithYosguardPkg(makePkg bool) YosguardOpt {
|
||||
return func(o *yosguardOpt) {
|
||||
o.Pkg = makePkg
|
||||
}
|
||||
}
|
||||
|
||||
func (m *maker) Yosguard(ctx context.Context, opts ...YosguardOpt) error {
|
||||
const (
|
||||
_config = `
|
||||
AsController: true
|
||||
AsGateway: false
|
||||
ControllerServer:
|
||||
Host: dasheng.zhsftech.debug
|
||||
Port: 443
|
||||
Web:
|
||||
Host: __ip__
|
||||
Port: 7788
|
||||
Database:
|
||||
SQLite:
|
||||
DBPath: /etc/yosguard/db/yosguard.db
|
||||
HeartbeatDuration: 5
|
||||
UUIDFilePath: /etc/yosguard/uuid
|
||||
Web:
|
||||
Host: __ip__
|
||||
Port: 7788
|
||||
`
|
||||
|
||||
systemdService = `
|
||||
@@ -52,10 +56,23 @@ WantedBy=multi-user.target`
|
||||
binURL = "https://artifactory.yizhisec.com:443/artifactory/filestore/hsv2/bin/yosguard"
|
||||
)
|
||||
|
||||
location := filepath.Join(m.workdir, "dependency", "yosguard")
|
||||
var (
|
||||
location = filepath.Join(m.workdir, "dependency", "yosguard")
|
||||
o = &yosguardOpt{}
|
||||
)
|
||||
|
||||
for _, fn := range opts {
|
||||
fn(o)
|
||||
}
|
||||
|
||||
logger.Info("☑️ maker.Yosguard: 开始构建 yosguard...")
|
||||
logger.Debug("☑️ maker.Yosguard: 创建目录 %s", location)
|
||||
|
||||
if err := os.RemoveAll(location); err != nil {
|
||||
logger.Debug("❌ maker.Yosguard: 删除 yosguard 目录失败, dir = %s, err = %v", location, err)
|
||||
return err
|
||||
}
|
||||
|
||||
if err := os.MkdirAll(location, 0755); err != nil {
|
||||
logger.Debug("❌ maker.Yosguard: 创建 yosguard 目录失败: %v", err)
|
||||
return err
|
||||
@@ -96,6 +113,15 @@ WantedBy=multi-user.target`
|
||||
}
|
||||
logger.Debug("✅ maker.Yosguard: 写入 yosguard.service 文件成功, dest = %s", filepath.Join(location, "yosguard.service"))
|
||||
|
||||
if o.Pkg {
|
||||
_cmd := fmt.Sprintf("cd %s && 7za a -pRrPt7Uo9WM1dkXOJmHps56T8BZY2qA4g -mhe=on yosguard.pkg *", location)
|
||||
logger.Debug("☑️ maker.Yosguard: start create yosguard.pkg by 7zip, cmd = '%s'", _cmd)
|
||||
if err := m.RunCommand(ctx, location, _cmd); err != nil {
|
||||
logger.Debug("❌ maker.Yosguard: 创建 yosguard.pkg 失败, err = %v", err)
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
logger.Info("✅ maker.Yosguard: 构建 yosguard 成功!!!")
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user