From 25b189069c0d7f81b200e97ac7d4256e197c91e2 Mon Sep 17 00:00:00 2001
From: zhengkunwang <31820853+zhengkunwang223@users.noreply.github.com>
Date: Fri, 2 Aug 2024 16:00:15 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E5=BA=94=E7=94=A8=E5=8D=87=E7=BA=A7?=
=?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=97=A5=E5=BF=97=20(#6011)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
agent/app/dto/request/app.go | 2 +
agent/app/dto/request/file.go | 9 +-
agent/app/model/task.go | 1 +
agent/app/repo/task.go | 7 +
agent/app/service/app.go | 6 +-
agent/app/service/app_install.go | 1 +
agent/app/service/app_utils.go | 181 ++++++++++--------
agent/app/service/file.go | 2 +-
agent/app/service/runtime.go | 4 +-
agent/app/service/website.go | 4 +-
agent/app/task/task.go | 27 +--
agent/i18n/lang/zh.yaml | 11 +-
agent/init/migration/migrations/init.go | 2 +-
frontend/src/components/task-log/index.vue | 4 +-
.../views/app-store/detail/install/index.vue | 2 -
.../src/views/app-store/installed/index.vue | 4 +-
.../app-store/installed/upgrade/index.vue | 12 ++
17 files changed, 156 insertions(+), 123 deletions(-)
diff --git a/agent/app/dto/request/app.go b/agent/app/dto/request/app.go
index 936e7603f..c00a6a49c 100644
--- a/agent/app/dto/request/app.go
+++ b/agent/app/dto/request/app.go
@@ -72,6 +72,7 @@ type AppInstalledOperate struct {
Backup bool `json:"backup"`
PullImage bool `json:"pullImage"`
DockerCompose string `json:"dockerCompose"`
+ TaskID string `json:"taskID"`
}
type AppInstallUpgrade struct {
@@ -80,6 +81,7 @@ type AppInstallUpgrade struct {
Backup bool `json:"backup"`
PullImage bool `json:"pullImage"`
DockerCompose string `json:"dockerCompose"`
+ TaskID string `json:"taskID"`
}
type AppInstalledUpdate struct {
diff --git a/agent/app/dto/request/file.go b/agent/app/dto/request/file.go
index d68ff3874..5331ed6d6 100644
--- a/agent/app/dto/request/file.go
+++ b/agent/app/dto/request/file.go
@@ -128,8 +128,13 @@ type FileReadByLineReq struct {
ID uint `json:"ID"`
Name string `json:"name"`
Latest bool `json:"latest"`
- TaskID string `json:"taskID"`
- TaskType string `json:"taskType"`
+ TaskReq
+}
+
+type TaskReq struct {
+ TaskID string `json:"taskID"`
+ TaskType string `json:"taskType"`
+ TaskOperate string `json:"taskOperate"`
}
type FileExistReq struct {
diff --git a/agent/app/model/task.go b/agent/app/model/task.go
index 4126400aa..46d003237 100644
--- a/agent/app/model/task.go
+++ b/agent/app/model/task.go
@@ -6,6 +6,7 @@ type Task struct {
ID string `gorm:"primarykey;" json:"id"`
Name string `json:"name"`
Type string `json:"type"`
+ Operate string `json:"operate"`
LogFile string `json:"logFile"`
Status string `json:"status"`
ErrorMsg string `json:"errorMsg"`
diff --git a/agent/app/repo/task.go b/agent/app/repo/task.go
index 957aaf3fa..f88ac4a0c 100644
--- a/agent/app/repo/task.go
+++ b/agent/app/repo/task.go
@@ -19,6 +19,7 @@ type ITaskRepo interface {
WithType(taskType string) DBOption
WithResourceID(id uint) DBOption
WithStatus(status string) DBOption
+ WithOperate(taskOperate string) DBOption
}
func NewITaskRepo() ITaskRepo {
@@ -37,6 +38,12 @@ func (t TaskRepo) WithType(taskType string) DBOption {
}
}
+func (t TaskRepo) WithOperate(taskOperate string) DBOption {
+ return func(g *gorm.DB) *gorm.DB {
+ return g.Where("operate = ?", taskOperate)
+ }
+}
+
func (t TaskRepo) WithStatus(status string) DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Where("status = ?", status)
diff --git a/agent/app/service/app.go b/agent/app/service/app.go
index f0e6776ba..fce3a5511 100644
--- a/agent/app/service/app.go
+++ b/agent/app/service/app.go
@@ -185,7 +185,7 @@ func (a AppService) GetAppDetail(appID uint, version, appType string) (response.
versionPath := filepath.Join(app.GetAppResourcePath(), detail.Version)
if !fileOp.Stat(versionPath) || detail.Update {
- if err = downloadApp(app, detail, nil); err != nil {
+ if err = downloadApp(app, detail, nil, nil); err != nil {
return appDetailDTO, err
}
}
@@ -441,7 +441,7 @@ func (a AppService) Install(req request.AppInstallCreate) (appInstall *model.App
return
}
- installTask, err := task.NewTaskWithOps(appInstall.Name, task.TaskCreate, task.TaskScopeApp, req.TaskID, appInstall.ID)
+ installTask, err := task.NewTaskWithOps(appInstall.Name, task.TaskInstall, task.TaskScopeApp, req.TaskID, appInstall.ID)
if err != nil {
return
}
@@ -462,7 +462,7 @@ func (a AppService) Install(req request.AppInstallCreate) (appInstall *model.App
return nil
}
- handleAppStatus := func() {
+ handleAppStatus := func(t *task.Task) {
appInstall.Status = constant.UpErr
appInstall.Message = installTask.Task.ErrorMsg
_ = appInstallRepo.Save(context.Background(), appInstall)
diff --git a/agent/app/service/app_install.go b/agent/app/service/app_install.go
index c3f0b0ffd..61abcfa50 100644
--- a/agent/app/service/app_install.go
+++ b/agent/app/service/app_install.go
@@ -272,6 +272,7 @@ func (a *AppInstallService) Operate(req request.AppInstalledOperate) error {
Backup: req.Backup,
PullImage: req.PullImage,
DockerCompose: req.DockerCompose,
+ TaskID: req.TaskID,
}
return upgradeInstall(upgradeReq)
case constant.Reload:
diff --git a/agent/app/service/app_utils.go b/agent/app/service/app_utils.go
index c7ed9548b..8f55a27a7 100644
--- a/agent/app/service/app_utils.go
+++ b/agent/app/service/app_utils.go
@@ -6,6 +6,7 @@ import (
"encoding/json"
"fmt"
"github.com/1Panel-dev/1Panel/agent/app/task"
+ "log"
"math"
"net/http"
"os"
@@ -132,7 +133,7 @@ var ToolKeys = map[string]uint{
}
func createLink(ctx context.Context, installTask *task.Task, app model.App, appInstall *model.AppInstall, params map[string]interface{}) error {
- deleteAppLink := func() {
+ deleteAppLink := func(t *task.Task) {
_ = deleteLink(ctx, appInstall, true, true, true)
}
var dbConfig dto.AppDatabase
@@ -496,67 +497,44 @@ func upgradeInstall(req request.AppInstallUpgrade) error {
if install.Version == detail.Version {
return errors.New("two version is same")
}
+
+ upgradeTask, err := task.NewTaskWithOps(install.Name, task.TaskUpgrade, task.TaskScopeApp, req.TaskID, install.ID)
+ if err != nil {
+ return err
+ }
install.Status = constant.Upgrading
- go func() {
- var (
- upErr error
- backupFile string
- preErr error
- )
- global.LOG.Infof(i18n.GetMsgWithName("UpgradeAppStart", install.Name, nil))
+ var (
+ upErr error
+ backupFile string
+ )
+ backUpApp := func(t *task.Task) error {
if req.Backup {
backupRecord, err := NewIBackupService().AppBackup(dto.CommonBackup{Name: install.App.Key, DetailName: install.Name})
- if err == nil {
- localDir, err := loadLocalDir()
- if err == nil {
- backupFile = path.Join(localDir, backupRecord.FileDir, backupRecord.FileName)
- } else {
- global.LOG.Errorf(i18n.GetMsgWithName("ErrAppBackup", install.Name, err))
- }
- } else {
- global.LOG.Errorf(i18n.GetMsgWithName("ErrAppBackup", install.Name, err))
+ if err != nil {
+ return buserr.WithNameAndErr("ErrAppBackup", install.Name, err)
}
+ localDir, err := loadLocalDir()
+ if err != nil {
+ return buserr.WithNameAndErr("ErrAppBackup", install.Name, err)
+ }
+ backupFile = path.Join(localDir, backupRecord.FileDir, backupRecord.FileName)
}
+ return nil
+ }
+ upgradeTask.AddSubTask(task.GetTaskName(install.Name, task.TaskBackup, task.TaskScopeApp), backUpApp, nil)
- defer func() {
- if upErr != nil {
- global.LOG.Infof(i18n.GetMsgWithName("ErrAppUpgrade", install.Name, upErr))
- if req.Backup {
- global.LOG.Infof(i18n.GetMsgWithName("AppRecover", install.Name, nil))
- if err := NewIBackupService().AppRecover(dto.CommonRecover{Name: install.App.Key, DetailName: install.Name, Type: "app", Source: constant.ResourceLocal, File: backupFile}); err != nil {
- global.LOG.Errorf("recover app [%s] [%s] failed %v", install.App.Key, install.Name, err)
- }
- }
- existInstall, _ := appInstallRepo.GetFirst(commonRepo.WithByID(req.InstallID))
- if existInstall.ID > 0 {
- existInstall.Status = constant.UpgradeErr
- existInstall.Message = upErr.Error()
- _ = appInstallRepo.Save(context.Background(), &existInstall)
- }
- }
- if preErr != nil {
- global.LOG.Infof(i18n.GetMsgWithName("ErrAppUpgrade", install.Name, preErr))
- existInstall, _ := appInstallRepo.GetFirst(commonRepo.WithByID(req.InstallID))
- if existInstall.ID > 0 {
- existInstall.Status = constant.UpgradeErr
- existInstall.Message = preErr.Error()
- _ = appInstallRepo.Save(context.Background(), &existInstall)
- }
- }
- }()
-
+ upgradeApp := func(t *task.Task) error {
fileOp := files.NewFileOp()
detailDir := path.Join(constant.ResourceDir, "apps", install.App.Resource, install.App.Key, detail.Version)
if install.App.Resource == constant.AppResourceRemote {
- if preErr = downloadApp(install.App, detail, &install); preErr != nil {
- return
+ if err = downloadApp(install.App, detail, &install, t.Logger); err != nil {
+ return err
}
if detail.DockerCompose == "" {
composeDetail, err := fileOp.GetContent(path.Join(detailDir, "docker-compose.yml"))
if err != nil {
- preErr = err
- return
+ return err
}
detail.DockerCompose = string(composeDetail)
_ = appDetailRepo.Update(context.Background(), detail)
@@ -565,41 +543,37 @@ func upgradeInstall(req request.AppInstallUpgrade) error {
_, _, _ = httpUtil.HandleGet(detail.DownloadCallBackUrl, http.MethodGet, constant.TimeOut5s)
}()
}
-
if install.App.Resource == constant.AppResourceLocal {
detailDir = path.Join(constant.ResourceDir, "apps", "local", strings.TrimPrefix(install.App.Key, "local"), detail.Version)
}
content, err := fileOp.GetContent(install.GetEnvPath())
if err != nil {
- preErr = err
- return
+ return err
}
if req.PullImage {
projectName := strings.ToLower(install.Name)
images, err := composeV2.GetDockerComposeImages(projectName, content, []byte(detail.DockerCompose))
if err != nil {
- preErr = err
- return
+ return err
}
for _, image := range images {
- global.LOG.Infof(i18n.GetMsgWithName("PullImageStart", image, nil))
+ t.Log(i18n.GetWithName("PullImageStart", image))
if out, err := cmd.ExecWithTimeOut("docker pull "+image, 20*time.Minute); err != nil {
if out != "" {
err = errors.New(out)
}
- preErr = buserr.WithNameAndErr("ErrDockerPullImage", "", err)
- return
- } else {
- global.LOG.Infof(i18n.GetMsgByKey("PullImageSuccess"))
+ err = buserr.WithNameAndErr("ErrDockerPullImage", "", err)
+ return err
}
+ t.LogSuccess(i18n.GetMsgByKey("PullImage"))
}
}
command := exec.Command("/bin/bash", "-c", fmt.Sprintf("cp -rn %s/* %s || true", detailDir, install.GetPath()))
stdout, _ := command.CombinedOutput()
if stdout != nil {
- global.LOG.Infof("upgrade app [%s] [%s] cp file log : %s ", install.App.Key, install.Name, string(stdout))
+ t.Logger.Printf("upgrade app [%s] [%s] cp file log : %s ", install.App.Key, install.Name, string(stdout))
}
sourceScripts := path.Join(detailDir, "scripts")
if fileOp.Stat(sourceScripts) {
@@ -612,9 +586,9 @@ func upgradeInstall(req request.AppInstallUpgrade) error {
var newCompose string
if req.DockerCompose == "" {
- newCompose, upErr = getUpgradeCompose(install, detail)
- if upErr != nil {
- return
+ newCompose, err = getUpgradeCompose(install, detail)
+ if err != nil {
+ return err
}
} else {
newCompose = req.DockerCompose
@@ -627,40 +601,65 @@ func upgradeInstall(req request.AppInstallUpgrade) error {
if out, err := compose.Down(install.GetComposePath()); err != nil {
if out != "" {
upErr = errors.New(out)
- return
+ return upErr
}
- upErr = err
- return
+ return err
}
envs := make(map[string]interface{})
- if upErr = json.Unmarshal([]byte(install.Env), &envs); upErr != nil {
- return
+ if err = json.Unmarshal([]byte(install.Env), &envs); err != nil {
+ return err
}
envParams := make(map[string]string, len(envs))
handleMap(envs, envParams)
- if upErr = env.Write(envParams, install.GetEnvPath()); upErr != nil {
- return
+ if err = env.Write(envParams, install.GetEnvPath()); err != nil {
+ return err
}
- //TODO use task
- if upErr = runScript(nil, &install, "upgrade"); upErr != nil {
- return
+ if err = runScript(t, &install, "upgrade"); err != nil {
+ return err
}
- if upErr = fileOp.WriteFile(install.GetComposePath(), strings.NewReader(install.DockerCompose), 0775); upErr != nil {
- return
+ if err = fileOp.WriteFile(install.GetComposePath(), strings.NewReader(install.DockerCompose), 0775); err != nil {
+ return err
}
+
+ logStr := fmt.Sprintf("%s %s", i18n.GetMsgByKey("Run"), i18n.GetMsgByKey("App"))
+ t.Log(logStr)
if out, err := compose.Up(install.GetComposePath()); err != nil {
if out != "" {
- upErr = errors.New(out)
+ return errors.New(out)
+ }
+ return err
+ }
+ t.LogSuccess(logStr)
+ install.Status = constant.Running
+ return appInstallRepo.Save(context.Background(), &install)
+ }
+
+ rollBackApp := func(t *task.Task) {
+ if req.Backup {
+ t.Log(i18n.GetWithName("AppRecover", install.Name))
+ if err := NewIBackupService().AppRecover(dto.CommonRecover{Name: install.App.Key, DetailName: install.Name, Type: "app", Source: constant.ResourceLocal, File: backupFile}); err != nil {
+ t.LogFailedWithErr(i18n.GetWithName("AppRecover", install.Name), err)
return
}
- upErr = err
+ t.LogSuccess(i18n.GetWithName("AppRecover", install.Name))
return
}
- install.Status = constant.Running
- _ = appInstallRepo.Save(context.Background(), &install)
- global.LOG.Infof(i18n.GetMsgWithName("UpgradeAppSuccess", install.Name, nil))
+ }
+
+ upgradeTask.AddSubTask(task.GetTaskName(install.Name, task.TaskScopeApp, task.TaskUpgrade), upgradeApp, rollBackApp)
+
+ go func() {
+ err = upgradeTask.Execute()
+ if err != nil {
+ existInstall, _ := appInstallRepo.GetFirst(commonRepo.WithByID(req.InstallID))
+ if existInstall.ID > 0 && existInstall.Status != constant.Running {
+ existInstall.Status = constant.UpgradeErr
+ existInstall.Message = upErr.Error()
+ _ = appInstallRepo.Save(context.Background(), &existInstall)
+ }
+ }
}()
return appInstallRepo.Save(context.Background(), &install)
@@ -747,9 +746,8 @@ func handleMap(params map[string]interface{}, envParams map[string]string) {
}
}
-func downloadApp(app model.App, appDetail model.AppDetail, appInstall *model.AppInstall) (err error) {
+func downloadApp(app model.App, appDetail model.AppDetail, appInstall *model.AppInstall, logger *log.Logger) (err error) {
if app.IsLocalApp() {
- //本地应用,不去官网下载
return nil
}
appResourceDir := path.Join(constant.AppResourceDir, app.Resource)
@@ -765,7 +763,12 @@ func downloadApp(app model.App, appDetail model.AppDetail, appInstall *model.App
if !fileOp.Stat(appVersionDir) {
_ = fileOp.CreateDir(appVersionDir, 0755)
}
- global.LOG.Infof("download app[%s] from %s", app.Name, appDetail.DownloadUrl)
+ if logger == nil {
+ global.LOG.Infof("download app[%s] from %s", app.Name, appDetail.DownloadUrl)
+ } else {
+ logger.Printf("download app[%s] from %s", app.Name, appDetail.DownloadUrl)
+ }
+
filePath := path.Join(appVersionDir, app.Key+"-"+appDetail.Version+".tar.gz")
defer func() {
@@ -778,11 +781,19 @@ func downloadApp(app model.App, appDetail model.AppDetail, appInstall *model.App
}()
if err = fileOp.DownloadFileWithProxy(appDetail.DownloadUrl, filePath); err != nil {
- global.LOG.Errorf("download app[%s] error %v", app.Name, err)
+ if logger == nil {
+ global.LOG.Errorf("download app[%s] error %v", app.Name, err)
+ } else {
+ logger.Printf("download app[%s] error %v", app.Name, err)
+ }
return
}
if err = fileOp.Decompress(filePath, appResourceDir, files.SdkTarGz, ""); err != nil {
- global.LOG.Errorf("decompress app[%s] error %v", app.Name, err)
+ if logger == nil {
+ global.LOG.Errorf("decompress app[%s] error %v", app.Name, err)
+ } else {
+ logger.Printf("decompress app[%s] error %v", app.Name, err)
+ }
return
}
_ = fileOp.DeleteFile(filePath)
@@ -796,7 +807,7 @@ func copyData(task *task.Task, app model.App, appDetail model.AppDetail, appInst
appResourceDir := path.Join(constant.AppResourceDir, app.Resource)
if app.Resource == constant.AppResourceRemote {
- err = downloadApp(app, appDetail, appInstall)
+ err = downloadApp(app, appDetail, appInstall, task.Logger)
if err != nil {
return
}
diff --git a/agent/app/service/file.go b/agent/app/service/file.go
index 79ca7e804..8790c68a8 100644
--- a/agent/app/service/file.go
+++ b/agent/app/service/file.go
@@ -472,7 +472,7 @@ func (f *FileService) ReadLogByLine(req request.FileReadByLineReq) (*response.Fi
if req.TaskID != "" {
opts = append(opts, taskRepo.WithByID(req.TaskID))
} else {
- opts = append(opts, taskRepo.WithType(req.TaskType), taskRepo.WithResourceID(req.ID))
+ opts = append(opts, taskRepo.WithType(req.TaskType), taskRepo.WithOperate(req.TaskOperate), taskRepo.WithResourceID(req.ID))
}
taskModel, err := taskRepo.GetFirst(opts...)
if err != nil {
diff --git a/agent/app/service/runtime.go b/agent/app/service/runtime.go
index 4e9e4a5e9..c083c3f94 100644
--- a/agent/app/service/runtime.go
+++ b/agent/app/service/runtime.go
@@ -114,7 +114,7 @@ func (r *RuntimeService) Create(create request.RuntimeCreate) (*model.Runtime, e
appVersionDir := filepath.Join(app.GetAppResourcePath(), appDetail.Version)
if !fileOp.Stat(appVersionDir) || appDetail.Update {
- if err = downloadApp(app, appDetail, nil); err != nil {
+ if err = downloadApp(app, appDetail, nil, nil); err != nil {
return nil, err
}
}
@@ -397,7 +397,7 @@ func (r *RuntimeService) Update(req request.RuntimeUpdate) error {
fileOp := files.NewFileOp()
appVersionDir := path.Join(constant.AppResourceDir, app.Resource, app.Key, appDetail.Version)
if !fileOp.Stat(appVersionDir) || appDetail.Update {
- if err := downloadApp(app, appDetail, nil); err != nil {
+ if err := downloadApp(app, appDetail, nil, nil); err != nil {
return err
}
_ = fileOp.Rename(path.Join(runtime.GetPath(), "run.sh"), path.Join(runtime.GetPath(), "run.sh.bak"))
diff --git a/agent/app/service/website.go b/agent/app/service/website.go
index dd67b6f39..6ec59bf3a 100644
--- a/agent/app/service/website.go
+++ b/agent/app/service/website.go
@@ -347,7 +347,7 @@ func (w WebsiteService) CreateWebsite(create request.WebsiteCreate) (err error)
website.FtpID = itemID
return nil
}
- deleteFtpUser := func() {
+ deleteFtpUser := func(t *task.Task) {
if website.FtpID > 0 {
req := dto.BatchDeleteReq{Ids: []uint{website.FtpID}}
if err = NewIFtpService().Delete(req); err != nil {
@@ -381,7 +381,7 @@ func (w WebsiteService) CreateWebsite(create request.WebsiteCreate) (err error)
return nil
}
- deleteWebsite := func() {
+ deleteWebsite := func(t *task.Task) {
_ = deleteWebsiteFolder(nginxInstall, website)
}
diff --git a/agent/app/task/task.go b/agent/app/task/task.go
index 6788b63e7..3267b6509 100644
--- a/agent/app/task/task.go
+++ b/agent/app/task/task.go
@@ -16,7 +16,7 @@ import (
)
type ActionFunc func(*Task) error
-type RollbackFunc func()
+type RollbackFunc func(*Task)
type Task struct {
Name string
@@ -48,6 +48,7 @@ const (
TaskUpgrade = "TaskUpgrade"
TaskUpdate = "TaskUpdate"
TaskRestart = "TaskRestart"
+ TaskBackup = "TaskBackup"
)
const (
@@ -67,29 +68,20 @@ func GetTaskName(resourceName, operate, scope string) string {
}
func NewTaskWithOps(resourceName, operate, scope, taskID string, resourceID uint) (*Task, error) {
- return NewTask(GetTaskName(resourceName, operate, scope), scope, taskID, resourceID)
+ return NewTask(GetTaskName(resourceName, operate, scope), operate, scope, taskID, resourceID)
}
-//func NewChildTask(name, taskType, parentTaskID string) (*Task, error) {
-// task, err := NewTask(name, taskType, "")
-// if err != nil {
-// return nil, err
-// }
-// task.ParentID = parentTaskID
-// return task, nil
-//}
-
-func NewTask(name, taskType, taskID string, resourceID uint) (*Task, error) {
+func NewTask(name, operate, taskScope, taskID string, resourceID uint) (*Task, error) {
if taskID == "" {
taskID = uuid.New().String()
}
- logDir := path.Join(constant.LogDir, taskType)
+ logDir := path.Join(constant.LogDir, taskScope)
if _, err := os.Stat(logDir); os.IsNotExist(err) {
if err = os.MkdirAll(logDir, 0755); err != nil {
return nil, fmt.Errorf("failed to create log directory: %w", err)
}
}
- logPath := path.Join(constant.LogDir, taskType, taskID+".log")
+ logPath := path.Join(constant.LogDir, taskScope, taskID+".log")
file, err := os.OpenFile(logPath, os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
return nil, fmt.Errorf("failed to open log file: %w", err)
@@ -98,10 +90,11 @@ func NewTask(name, taskType, taskID string, resourceID uint) (*Task, error) {
taskModel := &model.Task{
ID: taskID,
Name: name,
- Type: taskType,
+ Type: taskScope,
LogFile: logPath,
Status: constant.StatusRunning,
ResourceID: resourceID,
+ Operate: operate,
}
taskRepo := repo.NewITaskRepo()
task := &Task{Name: name, logFile: file, Logger: logger, taskRepo: taskRepo, Task: taskModel}
@@ -147,7 +140,7 @@ func (s *SubTask) Execute() error {
if i == s.Retry {
if s.Rollback != nil {
- s.Rollback()
+ s.Rollback(s.RootTask)
}
}
time.Sleep(1 * time.Second)
@@ -176,7 +169,7 @@ func (t *Task) Execute() error {
t.Task.ErrorMsg = err.Error()
t.Task.Status = constant.StatusFailed
for _, rollback := range t.Rollbacks {
- rollback()
+ rollback(t)
}
t.updateTask(t.Task)
break
diff --git a/agent/i18n/lang/zh.yaml b/agent/i18n/lang/zh.yaml
index d68bb8c21..61da03b83 100644
--- a/agent/i18n/lang/zh.yaml
+++ b/agent/i18n/lang/zh.yaml
@@ -201,11 +201,11 @@ ErrXpackNotActive: "该部分为专业版功能,请先在 面板设置-许可
ErrXpackOutOfDate: "当前许可证已过期,请重新在 面板设置-许可证 界面导入许可证"
#task
-TaskStart: "{{.name}} 开始 [START]"
-TaskEnd: "{{.name}} 结束 [COMPLETED]"
-TaskFailed: "{{.name}} 失败"
+TaskStart: "{{.name}} 任务开始 [START]"
+TaskEnd: "{{.name}} 任务结束 [COMPLETED]"
+TaskFailed: "{{.name}} 任务失败"
TaskTimeout: "{{.name}} 超时"
-TaskSuccess: "{{.name}} 成功"
+TaskSuccess: "{{.name}} 任务成功"
TaskRetry: "开始第 {{.name}} 次重试"
SubTaskSuccess: "{{ .name }} 成功"
SubTaskFailed: "{{ .name }} 失败: {{ .err }}"
@@ -216,6 +216,7 @@ TaskDelete: "删除"
TaskUpgrade: "升级"
TaskUpdate: "更新"
TaskRestart: "重启"
+TaskBackup: "备份"
Website: "网站"
App: "应用"
Runtime: "运行环境"
@@ -232,4 +233,4 @@ HandleDatabaseApp: "处理应用参数"
ExecShell: "执行 {{ .name }} 脚本"
PullImage: "拉取镜像"
Start: "开始"
-Run: "启动"
\ No newline at end of file
+Run: "启动"
diff --git a/agent/init/migration/migrations/init.go b/agent/init/migration/migrations/init.go
index 9179f98e0..75c0859bc 100644
--- a/agent/init/migration/migrations/init.go
+++ b/agent/init/migration/migrations/init.go
@@ -276,7 +276,7 @@ var InitPHPExtensions = &gormigrate.Migration{
}
var AddTask = &gormigrate.Migration{
- ID: "20240801-add-task",
+ ID: "20240802-add-task",
Migrate: func(tx *gorm.DB) error {
return tx.AutoMigrate(
&model.Task{})
diff --git a/frontend/src/components/task-log/index.vue b/frontend/src/components/task-log/index.vue
index 5eadeddf1..6e17b8de6 100644
--- a/frontend/src/components/task-log/index.vue
+++ b/frontend/src/components/task-log/index.vue
@@ -53,6 +53,7 @@ const readReq = reactive({
pageSize: 500,
latest: false,
taskType: '',
+ taskOperate: '',
id: 0,
});
@@ -69,9 +70,10 @@ const openWithTaskID = (id: string) => {
initData();
};
-const openWithResourceID = (taskType: string, resourceID: number) => {
+const openWithResourceID = (taskType: string, taskOperate: string, resourceID: number) => {
readReq.taskType = taskType;
readReq.id = resourceID;
+ readReq.taskOperate = taskOperate;
initData();
};
diff --git a/frontend/src/views/app-store/detail/install/index.vue b/frontend/src/views/app-store/detail/install/index.vue
index fc00095df..17f37c572 100644
--- a/frontend/src/views/app-store/detail/install/index.vue
+++ b/frontend/src/views/app-store/detail/install/index.vue
@@ -270,9 +270,7 @@ const openTaskLog = (taskID: string) => {
const install = () => {
loading.value = true;
const taskID = uuidv4();
- console.log(taskID);
req.taskID = taskID;
- console.log(req);
InstallApp(req)
.then(() => {
handleClose();
diff --git a/frontend/src/views/app-store/installed/index.vue b/frontend/src/views/app-store/installed/index.vue
index 85981e7d1..ffe112a92 100644
--- a/frontend/src/views/app-store/installed/index.vue
+++ b/frontend/src/views/app-store/installed/index.vue
@@ -116,7 +116,6 @@
{{ installed.name }}
-
{
const openLog = (row: any) => {
switch (row.status) {
case 'Installing':
- taskLogRef.value.openWithResourceID('App', row.id);
+ taskLogRef.value.openWithResourceID('App', 'TaskInstall', row.id);
break;
default:
composeLogRef.value.acceptParams({ compose: row.path + '/docker-compose.yml', resource: row.name });
diff --git a/frontend/src/views/app-store/installed/upgrade/index.vue b/frontend/src/views/app-store/installed/upgrade/index.vue
index c637bf3bb..88db880b0 100644
--- a/frontend/src/views/app-store/installed/upgrade/index.vue
+++ b/frontend/src/views/app-store/installed/upgrade/index.vue
@@ -76,6 +76,7 @@
+