script

package
v0.0.9 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 17, 2026 License: MIT Imports: 23 Imported by: 0

Documentation

Index

Constants

View Source
const (

	// 通用参数: 是否生成debug.sh调试脚本
	// 上游模块设置 req.SetEnv("debug_script", "true") 即可启用
	// 注意: debug.sh 可能包含敏感信息(如密码、token等), 请仅在开发调试时启用
	PARAM_DEBUG_SCRIPT = "debug_script"

	// 构建输出目录参数, 可选, 默认 output/
	PARAM_BUILD_OUTPUT_DIR = "build_output_dir"

	// 脚本输出环境变量文件路径参数
	PARAM_OUTPUT_ENV_FILE = "output_env_file"

	// 共享数据目录参数
	PARAM_SHARED_DATA_DIR = "shared_data_dir"

	// 工作空间目录参数
	PARAM_WORKSPACE = "workspace"

	// 脚本目录参数
	PARAM_SCRIPT_DIR = "script_dir"
)
View Source
const (
	APP_NAME = "script_runner"
)
View Source
const EnableScriptVerificationAtBuild = false

EnableScriptVerificationAtBuild 编译时启用脚本完整性校验(开发环境,默认为 false)

Variables

This section is empty.

Functions

func ParseOutputParams

func ParseOutputParams(filePath string) (map[string]string, error)

ParseOutputParams 解析脚本输出参数文件(output.env) 支持标准的 key=value 格式,自动处理注释、空行、引号等

Types

type AssetCopier

type AssetCopier interface {
	GetAssets() []string
	GetWorkDir() string
	SetEnv(key, value string)
	GetMetadata() *CommandMetadata
}

AssetCopier 定义支持资产复制的请求接口

type CancleRequest

type CancleRequest struct {
	WorkDir string
}

type CommandMetadata

type CommandMetadata struct {
	ID          string            `json:"id"`                    // 命令唯一ID
	Name        string            `json:"name"`                  // 命令名称
	Description string            `json:"description,omitempty"` // 命令描述
	Tags        []string          `json:"tags,omitempty"`        // 标签
	CreatedBy   string            `json:"created_by"`            // 创建者
	CreatedAt   time.Time         `json:"created_at"`            // 创建时间
	Timeout     time.Duration     `json:"timeout"`               // 超时时间
	EnvVars     map[string]string `json:"env_vars"`              // 环境变量
	WorkDir     string            `json:"work_dir"`              // 工作目录
	RefTask     string            `json:"ref_task,omitempty"`    // 关联的任务
}

CommandMetadata 命令元数据

func (*CommandMetadata) GetEnvVar

func (m *CommandMetadata) GetEnvVar(key string) string

GetEnvVar 获取环境变量(大小写不敏感) 因为 SetEnv 会将 key 转换为大写,所以查询时也需要转换为大写

type DeleteWorkDirRequest

type DeleteWorkDirRequest struct {
	WorkDir string
}

func NewDeleteWorkDirRequest

func NewDeleteWorkDirRequest(workDir string) *DeleteWorkDirRequest

type ExecuteCommandRequest

type ExecuteCommandRequest struct {
	Command string
	Assets  []string // 资产目录列表
	// contains filtered or unexported fields
}

func NewExecuteCommandRequest

func NewExecuteCommandRequest(command string, workDir string) *ExecuteCommandRequest

func (ExecuteCommandRequest) EnableCollectUploadFiles

func (s ExecuteCommandRequest) EnableCollectUploadFiles()

EnableCollectUploadFiles 启用收集输出目录文件信息 只有调用此方法后,执行完成时才会收集 build_output_dir 目录中的文件信息

func (*ExecuteCommandRequest) GetAssets

func (r *ExecuteCommandRequest) GetAssets() []string

func (*ExecuteCommandRequest) GetMetadata

func (r *ExecuteCommandRequest) GetMetadata() *CommandMetadata

func (ExecuteCommandRequest) GetResultFilePath

func (s ExecuteCommandRequest) GetResultFilePath() string

GetResultFilePath 获取结果文件路径

func (*ExecuteCommandRequest) GetWorkDir

func (r *ExecuteCommandRequest) GetWorkDir() string

func (*ExecuteCommandRequest) SetAssets

func (r *ExecuteCommandRequest) SetAssets(assetdir ...string)

SetAssets 设置资产目录

func (ExecuteCommandRequest) SetCollectFiles

func (s ExecuteCommandRequest) SetCollectFiles(filenames ...string)

SetCollectFiles 设置需要收集内容的文件列表

func (ExecuteCommandRequest) SetCreateProcessGroup

func (s ExecuteCommandRequest) SetCreateProcessGroup(enable bool)

SetCreateProcessGroup 设置是否创建新的进程组 用于控制是否可以通过进程组杀死子进程树 默认 true,设为 false 时适用于自升级场景(如 agent_upgrade)

func (ExecuteCommandRequest) SetEnv

func (s ExecuteCommandRequest) SetEnv(key, value string)

SetEnv 设置环境变量, key会被强制转换为大写

func (ExecuteCommandRequest) SetEnvAll

func (s ExecuteCommandRequest) SetEnvAll(params map[string]string)

SetEnvAll 透传所有任务参数到环境变量 这是最简洁的方式,适用于大多数场景 所有参数的 key 会被转换为大写

func (ExecuteCommandRequest) SetEnvFromParams

func (s ExecuteCommandRequest) SetEnvFromParams(getParam func(string) string, paramKeys ...string)

SetEnvFromParams 从任务参数中批量设置环境变量 paramKeys: 需要透传的参数key列表 getParam: 获取参数值的函数(通常是 task.GetParam)

func (ExecuteCommandRequest) SetEnvMultiple

func (s ExecuteCommandRequest) SetEnvMultiple(envVars map[string]string)

SetEnvMultiple 批量设置环境变量

func (ExecuteCommandRequest) SetLogCallback

func (s ExecuteCommandRequest) SetLogCallback(callback func(string))

SetLogCallback 设置日志回调函数

func (ExecuteCommandRequest) SetLogFile

func (s ExecuteCommandRequest) SetLogFile(logFile string)

SetLogFile 设置日志文件路径

func (ExecuteCommandRequest) SetMetadata

func (s ExecuteCommandRequest) SetMetadata(metadata *CommandMetadata)

SetMetadata 设置命令元数据

func (ExecuteCommandRequest) SetResultFile

func (s ExecuteCommandRequest) SetResultFile(resultFile string)

SetResultFile 设置结果文件路径

func (ExecuteCommandRequest) SetTimeout

func (s ExecuteCommandRequest) SetTimeout(timeout time.Duration)

SetTimeout 设置命令执行超时时间

func (ExecuteCommandRequest) SetUseProcessGroupKill

func (s ExecuteCommandRequest) SetUseProcessGroupKill(enable bool)

SetUseProcessGroupKill 设置是否使用进程组杀死方式 默认 true,设为 false 时使用默认的单进程杀死方式

func (ExecuteCommandRequest) UpdateMetadata

func (s ExecuteCommandRequest) UpdateMetadata(updates map[string]any)

UpdateMetadata 更新元数据字段

func (ExecuteCommandRequest) WriteDebugScript

func (s ExecuteCommandRequest) WriteDebugScript(scriptPath string, args []string) (string, error)

WriteDebugScript 生成debug.sh调试脚本到工作目录 通过环境变量 DEBUG_SCRIPT 控制是否生成 (值为 true 或 1 时生成) 返回生成的文件路径,如果未生成则返回空字符串

type ExecuteScriptRequest

type ExecuteScriptRequest struct {
	ScriptPath string
	Args       []string
	Assets     []string // 资产目录列表
	// contains filtered or unexported fields
}

func NewExecuteScriptRequest

func NewExecuteScriptRequest(scriptPath string, workDir string, args ...string) *ExecuteScriptRequest

func (ExecuteScriptRequest) EnableCollectUploadFiles

func (s ExecuteScriptRequest) EnableCollectUploadFiles()

EnableCollectUploadFiles 启用收集输出目录文件信息 只有调用此方法后,执行完成时才会收集 build_output_dir 目录中的文件信息

func (*ExecuteScriptRequest) GetAssets

func (r *ExecuteScriptRequest) GetAssets() []string

实现 AssetCopier 接口

func (*ExecuteScriptRequest) GetMetadata

func (r *ExecuteScriptRequest) GetMetadata() *CommandMetadata

func (ExecuteScriptRequest) GetResultFilePath

func (s ExecuteScriptRequest) GetResultFilePath() string

GetResultFilePath 获取结果文件路径

func (*ExecuteScriptRequest) GetWorkDir

func (r *ExecuteScriptRequest) GetWorkDir() string

func (*ExecuteScriptRequest) SetAssets

func (r *ExecuteScriptRequest) SetAssets(assetdir ...string)

SetAssets 设置资产目录

func (ExecuteScriptRequest) SetCollectFiles

func (s ExecuteScriptRequest) SetCollectFiles(filenames ...string)

SetCollectFiles 设置需要收集内容的文件列表

func (ExecuteScriptRequest) SetCreateProcessGroup

func (s ExecuteScriptRequest) SetCreateProcessGroup(enable bool)

SetCreateProcessGroup 设置是否创建新的进程组 用于控制是否可以通过进程组杀死子进程树 默认 true,设为 false 时适用于自升级场景(如 agent_upgrade)

func (ExecuteScriptRequest) SetEnv

func (s ExecuteScriptRequest) SetEnv(key, value string)

SetEnv 设置环境变量, key会被强制转换为大写

func (ExecuteScriptRequest) SetEnvAll

func (s ExecuteScriptRequest) SetEnvAll(params map[string]string)

SetEnvAll 透传所有任务参数到环境变量 这是最简洁的方式,适用于大多数场景 所有参数的 key 会被转换为大写

func (ExecuteScriptRequest) SetEnvFromParams

func (s ExecuteScriptRequest) SetEnvFromParams(getParam func(string) string, paramKeys ...string)

SetEnvFromParams 从任务参数中批量设置环境变量 paramKeys: 需要透传的参数key列表 getParam: 获取参数值的函数(通常是 task.GetParam)

func (ExecuteScriptRequest) SetEnvMultiple

func (s ExecuteScriptRequest) SetEnvMultiple(envVars map[string]string)

SetEnvMultiple 批量设置环境变量

func (ExecuteScriptRequest) SetLogCallback

func (s ExecuteScriptRequest) SetLogCallback(callback func(string))

SetLogCallback 设置日志回调函数

func (ExecuteScriptRequest) SetLogFile

func (s ExecuteScriptRequest) SetLogFile(logFile string)

SetLogFile 设置日志文件路径

func (ExecuteScriptRequest) SetMetadata

func (s ExecuteScriptRequest) SetMetadata(metadata *CommandMetadata)

SetMetadata 设置命令元数据

func (ExecuteScriptRequest) SetResultFile

func (s ExecuteScriptRequest) SetResultFile(resultFile string)

SetResultFile 设置结果文件路径

func (ExecuteScriptRequest) SetTimeout

func (s ExecuteScriptRequest) SetTimeout(timeout time.Duration)

SetTimeout 设置命令执行超时时间

func (ExecuteScriptRequest) SetUseProcessGroupKill

func (s ExecuteScriptRequest) SetUseProcessGroupKill(enable bool)

SetUseProcessGroupKill 设置是否使用进程组杀死方式 默认 true,设为 false 时使用默认的单进程杀死方式

func (ExecuteScriptRequest) UpdateMetadata

func (s ExecuteScriptRequest) UpdateMetadata(updates map[string]any)

UpdateMetadata 更新元数据字段

func (ExecuteScriptRequest) WriteDebugScript

func (s ExecuteScriptRequest) WriteDebugScript(scriptPath string, args []string) (string, error)

WriteDebugScript 生成debug.sh调试脚本到工作目录 通过环境变量 DEBUG_SCRIPT 控制是否生成 (值为 true 或 1 时生成) 返回生成的文件路径,如果未生成则返回空字符串

type ExecutionResult

type ExecutionResult struct {
	// 命令
	Command string `json:"command"`
	// 错误原因
	Error string `json:"error,omitempty"`
	// 命令退出码
	ExitCode int `json:"exit_code"`
	// 命令开始执行时间
	StartTime time.Time `json:"start_time"`
	// 命令结束执行时间
	EndTime *time.Time `json:"end_time"`
	// 命令执行时长
	Duration time.Duration `json:"duration"`
	// 命令执行是否成功
	Success bool `json:"success"`
	// 是否跳过执行(跳过视为成功,但标记为 Skip 以便管道状态同步)
	Skipped bool `json:"skipped,omitempty"`
	// 非错误的说明信息(比如跳过原因等)
	Message string `json:"message,omitempty"`
	// 元数据
	Metadata *CommandMetadata `json:"metadata"`
	// 文件内容集合
	FileContents map[string]string `json:"file_contents,omitempty"`
	// 输出目录中的文件信息
	UploadFiles []*UploadFileInfo `json:"upload_files,omitempty"`
	// 脚本输出参数(供下一个任务使用)
	OutputParams map[string]string `json:"output_params,omitempty"`
}

ExecutionResult 命令执行结果

func ExecutionSkipped

func ExecutionSkipped(start time.Time, command string, message string) *ExecutionResult

ExecutionSkipped 创建一个跳过的执行结果(成功但标记为跳过)

func ExecutionSuccess

func ExecutionSuccess(start time.Time, command string) *ExecutionResult

ExecutionSuccess 创建一个成功的执行结果

func NewExecutionFailed

func NewExecutionFailed(start time.Time, command string, err error, exitCode int) *ExecutionResult

NewExecutionFailed 创建一个失败的执行结果

func (*ExecutionResult) CleanRef

func (r *ExecutionResult) CleanRef() *ExecutionResult

func (*ExecutionResult) SensitiveParams

func (r *ExecutionResult) SensitiveParams(params ...string) *ExecutionResult

提供一个参数脱敏方法(参数名忽略大小写比较)

func (*ExecutionResult) String

func (r *ExecutionResult) String() string

String 返回执行结果的字符串表示

func (*ExecutionResult) ToJSON

func (r *ExecutionResult) ToJSON() string

type GetExecutionResultRequest

type GetExecutionResultRequest struct {
	WorkDir string
}

func NewGetExecutionResultRequest

func NewGetExecutionResultRequest(workDir string) *GetExecutionResultRequest

type ScriptExcutor

type ScriptExcutor struct {
	ioc.ObjectImpl

	// 脚本工作目录前缀
	WorkDirPrefix string `json:"work_dir_prefix" yaml:"work_dir_prefix" toml:"work_dir_prefix" env:"SCRIPT_WORK_DIR_PREFIX"`
	// 脚本目录前缀
	ScriptDirPrefix string `json:"script_dir_prefix" yaml:"script_dir_prefix" toml:"script_dir_prefix" env:"SCRIPT_DIR_PREFIX"`
	// 工作空间有效期
	WorkspaceTTL string `json:"workspace_ttl" yaml:"workspace_ttl" toml:"workspace_ttl" env:"SCRIPT_WORKSPACE_TTL"`
	// 资源目录
	AssetsDirPrefix string `json:"assets_dir_prefix" yaml:"assets_dir_prefix" toml:"assets_dir_prefix" env:"SCRIPT_ASSETS_DIR_PREFIX"`

	// 工作空间清理定时任务表达式
	WorkspaceCleanCron string `json:"workspace_clean_cron" yaml:"workspace_clean_cron" toml:"workspace_clean_cron" env:"SCRIPT_WORKSPACE_CLEAN_CRON"`
	// contains filtered or unexported fields
}

脚本执行器

func (*ScriptExcutor) Cancle

func (s *ScriptExcutor) Cancle(ctx context.Context, in *CancleRequest) error

func (*ScriptExcutor) CleanWorkspace

func (r *ScriptExcutor) CleanWorkspace(duration time.Duration) error

CleanWorkspace 清理工作目录下超过指定时间的 workspace duration: 时间期限,超过此时间的 workspace 将被删除

func (*ScriptExcutor) DeleteWorkDir

func (s *ScriptExcutor) DeleteWorkDir(ctx context.Context, in *DeleteWorkDirRequest) error

删除工作目录

func (*ScriptExcutor) ExecuteCommand

func (r *ScriptExcutor) ExecuteCommand(ctx context.Context, in *ExecuteCommandRequest) (*ExecutionResult, error)

执行命令

func (*ScriptExcutor) ExecuteScript

func (r *ScriptExcutor) ExecuteScript(ctx context.Context, in *ExecuteScriptRequest) (*ExecutionResult, error)

执行脚本

func (*ScriptExcutor) GetExecutionResult

func (s *ScriptExcutor) GetExecutionResult(ctx context.Context, in *GetExecutionResultRequest) (*ExecutionResult, error)

LoadResult 从文件加载执行结果

func (*ScriptExcutor) Init

func (r *ScriptExcutor) Init() error

func (*ScriptExcutor) InjectEnv

func (r *ScriptExcutor) InjectEnv(in *shellExecutor)

func (*ScriptExcutor) Name

func (r *ScriptExcutor) Name() string

func (*ScriptExcutor) ResolveAbsolutePath

func (r *ScriptExcutor) ResolveAbsolutePath(path string) (string, error)

ResolveAbsolutePath 将相对路径转换为绝对路径

func (*ScriptExcutor) WithPrefixScripPath

func (r *ScriptExcutor) WithPrefixScripPath(scriptName string) string

func (*ScriptExcutor) WithPrefixWorkSpace

func (r *ScriptExcutor) WithPrefixWorkSpace(workspace string) string

type ScriptIntegrityManager

type ScriptIntegrityManager struct {
	// contains filtered or unexported fields
}

ScriptIntegrityManager 脚本完整性管理器 脚本 hash 在编译时计算并硬编码到二进制中 在执行脚本前校验 hash,防止脚本被篡改 这确保了生产环境的脚本不会被篡改,即使脚本目录变为可写

func NewScriptIntegrityManager

func NewScriptIntegrityManager(scriptDir string, enabled bool) *ScriptIntegrityManager

NewScriptIntegrityManager 创建脚本完整性管理器 从编译时嵌入的 hash 文件加载脚本 hash

func (*ScriptIntegrityManager) Disable

func (m *ScriptIntegrityManager) Disable()

Disable 禁用校验

func (*ScriptIntegrityManager) Enable

func (m *ScriptIntegrityManager) Enable()

Enable 启用校验

func (*ScriptIntegrityManager) GetRegisteredScripts

func (m *ScriptIntegrityManager) GetRegisteredScripts() map[string]string

GetRegisteredScripts 获取已注册的脚本列表

func (*ScriptIntegrityManager) IsEnabled

func (m *ScriptIntegrityManager) IsEnabled() bool

IsEnabled 是否启用校验

func (*ScriptIntegrityManager) RegisterScripts

func (m *ScriptIntegrityManager) RegisterScripts() error

RegisterScripts 验证编译时的脚本 hash 是否有效 不再扫描脚本目录,而是直接使用编译时的 hash

func (*ScriptIntegrityManager) VerifyScript

func (m *ScriptIntegrityManager) VerifyScript(scriptPath string) error

VerifyScript 校验脚本完整性 在执行脚本前调用,验证脚本是否被篡改

type Service

type Service interface {
	// 执行脚本
	ExecuteScript(ctx context.Context, in *ExecuteScriptRequest) (*ExecutionResult, error)
	// 执行命令
	ExecuteCommand(ctx context.Context, in *ExecuteCommandRequest) (*ExecutionResult, error)
	// 获取执行结果
	GetExecutionResult(ctx context.Context, in *GetExecutionResultRequest) (*ExecutionResult, error)
	// 删除工作目录
	DeleteWorkDir(ctx context.Context, in *DeleteWorkDirRequest) error
	// 取消执行
	Cancle(ctx context.Context, in *CancleRequest) error
	// 清理过期的 workspace
	CleanWorkspace(duration time.Duration) error
}

func GetService

func GetService() Service

type UploadFileInfo

type UploadFileInfo struct {
	Name    string `json:"name"`     // 文件名
	Path    string `json:"path"`     // 相对路径
	Size    int64  `json:"size"`     // 文件大小(字节)
	MD5     string `json:"md5"`      // MD5哈希
	ModTime string `json:"mod_time"` // 修改时间
}

UploadFileInfo 上传文件信息

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL