Files
ci/internal/model/model.go
2026-06-18 21:19:47 +08:00

89 lines
3.5 KiB
Go

package model
import "time"
// Project represents a managed CI/CD project
type Project struct {
ID uint `gorm:"primaryKey" json:"id"`
Name string `gorm:"uniqueIndex;not null" json:"name"`
Description string `json:"description"`
Mode string `gorm:"default:'git'" json:"mode"` // "git" or "upload"
// Git mode fields
GitURL string `json:"git_url"`
GitBranch string `gorm:"default:'master'" json:"git_branch"`
GitUsername string `json:"git_username"`
GitPassword string `json:"-"` // hidden from JSON responses
// Build config
BuildScript string `json:"build_script"`
OutputBinary string `json:"output_binary"` // relative path to built binary
// Runtime config
RunCommand string `json:"run_command"` // command to run the project
EnvVars string `json:"env_vars"` // JSON key-value env vars
Port int `json:"port"` // target port
// Status
Status string `json:"status"` // "stopped", "running", "building", "error"
PID int `json:"pid"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
// BuildRecord represents a single build execution
type BuildRecord struct {
ID uint `gorm:"primaryKey" json:"id"`
ProjectID uint `gorm:"index;not null" json:"project_id"`
Project *Project `gorm:"foreignKey:ProjectID" json:"project,omitempty"`
Status string `gorm:"default:'running'" json:"status"` // "running", "success", "failed"
LogPath string `json:"log_path"` // path to log file
CommitHash string `json:"commit_hash"` // git commit hash (if git mode)
StartedAt time.Time `json:"started_at"`
FinishedAt *time.Time `json:"finished_at"`
}
// DeployConfig holds SSH deployment configuration for a project.
type DeployConfig struct {
ID uint `gorm:"primaryKey" json:"id"`
ProjectID uint `gorm:"uniqueIndex;not null" json:"project_id"`
// SSH connection
Host string `json:"host"`
Port int `gorm:"default:22" json:"port"`
Username string `json:"username"`
AuthMethod string `gorm:"default:'key'" json:"auth_method"` // "key" or "password"
SSHKey string `json:"-"` // hidden from JSON responses
SSHPassword string `json:"-"` // hidden from JSON responses
// Deployment settings
DeployDir string `json:"deploy_dir"` // remote target directory
FileMappings string `json:"file_mappings"` // JSON: [{"local":"app","remote":"/opt/myapp/app"}]
PreDeployCommand string `json:"pre_deploy_command"`
PostDeployCommand string `json:"post_deploy_command"`
// Health check
HealthCheckURL string `json:"health_check_url"`
HealthCheckTimeout int `gorm:"default:30" json:"health_check_timeout"`
// Auto-deploy after successful build
AutoDeploy bool `gorm:"default:false" json:"auto_deploy"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
// DeployRecord tracks a single deployment execution.
type DeployRecord struct {
ID uint `gorm:"primaryKey" json:"id"`
ProjectID uint `gorm:"index;not null" json:"project_id"`
Project *Project `gorm:"foreignKey:ProjectID" json:"project,omitempty"`
BuildRecordID *uint `json:"build_record_id"` // optional link to the build that triggered this deploy
Status string `gorm:"default:'running'" json:"status"` // "running", "success", "failed"
LogPath string `json:"log_path"`
StartedAt time.Time `json:"started_at"`
FinishedAt *time.Time `json:"finished_at"`
}