diff --git a/models/bots/task.go b/models/bots/task.go index b64e5274d4..20840ad474 100644 --- a/models/bots/task.go +++ b/models/bots/task.go @@ -5,8 +5,12 @@ package bots import ( + "bytes" "context" + "encoding/binary" + "errors" "fmt" + "io" "code.gitea.io/gitea/core" "code.gitea.io/gitea/models/db" @@ -29,10 +33,10 @@ type Task struct { Started timeutil.TimeStamp Stopped timeutil.TimeStamp - LogURL string // dbfs:///a/b.log or s3://endpoint.com/a/b.log and etc. - LogLength int64 // lines count - LogSize int64 // blob size - LogIndexes []int64 `xorm:"JSON TEXT"` // line number to offset + LogURL string // dbfs:///a/b.log or s3://endpoint.com/a/b.log and etc. + LogLength int64 // lines count + LogSize int64 // blob size + LogIndexes *LogIndexes `xorm:"BLOB"` // line number to offset LogExpired bool Created timeutil.TimeStamp `xorm:"created"` @@ -109,6 +113,30 @@ func (task *Task) FullSteps() []*TaskStep { return steps } +type LogIndexes []int64 + +func (i *LogIndexes) FromDB(b []byte) error { + reader := bytes.NewReader(b) + for { + v, err := binary.ReadVarint(reader) + if err != nil { + if errors.Is(err, io.EOF) { + return nil + } + return fmt.Errorf("binary ReadVarint: %w", err) + } + *i = append(*i, v) + } +} + +func (i *LogIndexes) ToDB() ([]byte, error) { + var buf []byte + for _, v := range *i { + buf = binary.AppendVarint(buf, v) + } + return buf, nil +} + // ErrTaskNotExist represents an error for bot task not exist type ErrTaskNotExist struct { ID int64 diff --git a/models/migrations/v-dev.go b/models/migrations/v-dev.go index bf56d69c52..f477655713 100644 --- a/models/migrations/v-dev.go +++ b/models/migrations/v-dev.go @@ -94,17 +94,20 @@ func addBotTables(x *xorm.Engine) error { type BotsRunIndex db.ResourceIndex type BotsTask struct { - ID int64 - JobID int64 - Attempt int64 - RunnerID int64 `xorm:"index"` - LogToFile bool // read log from database or from storage - LogURL string // url of the log file in storage - Result int32 - Started timeutil.TimeStamp - Stopped timeutil.TimeStamp - Created timeutil.TimeStamp `xorm:"created"` - Updated timeutil.TimeStamp `xorm:"updated"` + ID int64 + JobID int64 + Attempt int64 + RunnerID int64 `xorm:"index"` + Result int32 + Started timeutil.TimeStamp + Stopped timeutil.TimeStamp + LogURL string // dbfs:///a/b.log or s3://endpoint.com/a/b.log and etc. + LogLength int64 // lines count + LogSize int64 // blob size + LogIndexes *[]int64 `xorm:"BLOB"` // line number to offset + LogExpired bool + Created timeutil.TimeStamp `xorm:"created"` + Updated timeutil.TimeStamp `xorm:"updated"` } type BotsTaskStep struct { diff --git a/models/repo/repo.go b/models/repo/repo.go index 37d8cffd60..b9a22ba87a 100644 --- a/models/repo/repo.go +++ b/models/repo/repo.go @@ -142,9 +142,9 @@ type Repository struct { NumProjects int `xorm:"NOT NULL DEFAULT 0"` NumClosedProjects int `xorm:"NOT NULL DEFAULT 0"` NumOpenProjects int `xorm:"-"` - NumBuilds int `xorm:"NOT NULL DEFAULT 0"` - NumClosedBuilds int `xorm:"NOT NULL DEFAULT 0"` - NumOpenBuilds int `xorm:"-"` + NumRuns int `xorm:"NOT NULL DEFAULT 0"` + NumClosedRuns int `xorm:"NOT NULL DEFAULT 0"` + NumOpenRuns int `xorm:"-"` IsPrivate bool `xorm:"INDEX"` IsEmpty bool `xorm:"INDEX"` @@ -237,7 +237,7 @@ func (repo *Repository) AfterLoad() { repo.NumOpenPulls = repo.NumPulls - repo.NumClosedPulls repo.NumOpenMilestones = repo.NumMilestones - repo.NumClosedMilestones repo.NumOpenProjects = repo.NumProjects - repo.NumClosedProjects - repo.NumOpenBuilds = repo.NumBuilds - repo.NumClosedBuilds + repo.NumOpenRuns = repo.NumRuns - repo.NumClosedRuns } // LoadAttributes loads attributes of the repository. diff --git a/routers/api/bots/runner/runner.go b/routers/api/bots/runner/runner.go index 8352e028f7..dbc779954f 100644 --- a/routers/api/bots/runner/runner.go +++ b/routers/api/bots/runner/runner.go @@ -186,8 +186,11 @@ func (s *Service) UpdateLog( return nil, status.Errorf(codes.Internal, "write logs: %v", err) } task.LogLength += int64(len(rows)) + if task.LogIndexes == nil { + task.LogIndexes = &bots_model.LogIndexes{} + } for _, n := range ns { - task.LogIndexes = append(task.LogIndexes, task.LogSize) + *task.LogIndexes = append(*task.LogIndexes, task.LogSize) task.LogSize += int64(n) } if err := bots_model.UpdateTask(ctx, task, "log_indexes", "log_length", "log_size"); err != nil { diff --git a/routers/web/dev/buildview.go b/routers/web/dev/buildview.go index 87abf4f248..d1c28b7964 100644 --- a/routers/web/dev/buildview.go +++ b/routers/web/dev/buildview.go @@ -179,7 +179,7 @@ func BuildViewPost(ctx *context.Context) { if cursor.Cursor < step.LogLength || step.LogLength < 0 { index := step.LogIndex + cursor.Cursor length := step.LogLength - cursor.Cursor - offset := task.LogIndexes[index] + offset := (*task.LogIndexes)[index] logRows, err = bots.ReadLogs(ctx, task.LogURL, offset, length) if err != nil { ctx.Error(http.StatusInternalServerError, err.Error()) diff --git a/templates/repo/builds/openclose.tmpl b/templates/repo/builds/openclose.tmpl index c22254232e..fb42e761ca 100644 --- a/templates/repo/builds/openclose.tmpl +++ b/templates/repo/builds/openclose.tmpl @@ -1,10 +1,10 @@ diff --git a/templates/repo/header.tmpl b/templates/repo/header.tmpl index 16df255952..f950cda65f 100644 --- a/templates/repo/header.tmpl +++ b/templates/repo/header.tmpl @@ -186,8 +186,8 @@ {{ if and (not .UnitBuildsGlobalDisabled) (.Permission.CanRead $.UnitTypeBuilds)}} {{svg "octicon-git-builds"}} {{.locale.Tr "repo.builds"}} - {{if .Repository.NumOpenBuilds}} - {{CountFmt .Repository.NumOpenBuilds}} + {{if .Repository.NumOpenRuns}} + {{CountFmt .Repository.NumOpenRuns}} {{end}} {{end}}