diff --git a/models/bots/runner_token.go b/models/bots/runner_token.go index a97d47cd47..097bc79bca 100644 --- a/models/bots/runner_token.go +++ b/models/bots/runner_token.go @@ -49,13 +49,6 @@ func init() { db.RegisterModel(new(RunnerToken)) } -// NewRunnerToken creates new runner token. -func NewRunnerToken(t *RunnerToken) error { - t.Token = base.EncodeSha1(gouuid.New().String()) - _, err := db.GetEngine(db.DefaultContext).Insert(t) - return err -} - // GetRunnerByToken returns a bot runner via token func GetRunnerToken(token string) (*RunnerToken, error) { var runnerToken RunnerToken @@ -81,3 +74,28 @@ func UpdateRunnerToken(ctx context.Context, r *RunnerToken, cols ...string) (err } return err } + +// NewRunnerToken creates a new runner token +func NewRunnerToken(ownerID, repoID int64) (*RunnerToken, error) { + runnerToken := &RunnerToken{ + OwnerID: ownerID, + RepoID: repoID, + IsActive: false, + // FIXME: why token is 36 chars? + Token: base.EncodeSha1(gouuid.New().String())[:36], + } + _, err := db.GetEngine(db.DefaultContext).Insert(runnerToken) + return runnerToken, err +} + +// GetUnactivatedRunnerToken returns a unactivated runner token +func GetUnactivatedRunnerToken(ownerID, repoID int64) (*RunnerToken, error) { + var runnerToken RunnerToken + has, err := db.GetEngine(db.DefaultContext).Where("owner_id=? AND repo_id=? AND is_active=0", ownerID, repoID).OrderBy("id DESC").Get(&runnerToken) + if err != nil { + return nil, err + } else if !has { + return nil, ErrRunnerTokenNotExist{} + } + return &runnerToken, nil +} diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 7cfaac0efd..5c9266050f 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -3005,6 +3005,32 @@ notices.desc = Description notices.op = Op. notices.delete_success = The system notices have been deleted. +runners = Runners +runners.runner_manage_panel = Runners Management +runners.new = Create new Runner +runners.new_notice = Show runner installation documentation +runners.status = Status +runners.id = ID +runners.owner_type = Type +runners.description = Description +runners.labels = Labels +runners.latest_online = Last Online Time +runners.agent_labels = Agent Labels +runners.custom_labels = Custom Labels +runners.custom_labels_helper = Custom labels are labels that are not automatically added by the agent. They are added by the administrator. Use comma separated. +runners.runner_title = Runner +runners.task_list = Recent jobs on this runner +runners.edit_runner = Edit Runner +runners.update_runner = Update Changes +runners.update_runner_success = Runner updated successfully +runners.update_runner_failed = Failed to update runner +runners.delete_runner = Delete this runner +runners.delete_runner_success = Runner deleted successfully +runners.delete_runner_failed = Failed to delete runner +runners.delete_runner_header = Confirm to delete this runner +runners.delete_runner_notice = If job is running on this runner, it will be terminated and mark as failed. It may break building workflow. +runners.delete_runner_confirm = Delete this runner + [action] create_repo = created repository %s rename_repo = renamed repository from %[1]s to %[3]s diff --git a/routers/web/admin/runners.go b/routers/web/admin/runners.go index cf7bddd291..65ebf5cc23 100644 --- a/routers/web/admin/runners.go +++ b/routers/web/admin/runners.go @@ -63,9 +63,26 @@ func Runners(ctx *context.Context) { return } + // ownid=0,repo_id=0,means this token is used for global + var token *bots_model.RunnerToken + token, err = bots_model.GetUnactivatedRunnerToken(0, 0) + if _, ok := err.(bots_model.ErrRunnerTokenNotExist); ok { + token, err = bots_model.NewRunnerToken(0, 0) + if err != nil { + ctx.ServerError("CreateRunnerToken", err) + return + } + } else { + if err != nil { + ctx.ServerError("GetUnactivatedRunnerToken", err) + return + } + } + ctx.Data["Keyword"] = opts.Filter ctx.Data["Runners"] = runners ctx.Data["Total"] = count + ctx.Data["RegistrationToken"] = token.Token pager := context.NewPagination(int(count), opts.PageSize, opts.Page, 5) ctx.Data["Page"] = pager @@ -75,7 +92,7 @@ func Runners(ctx *context.Context) { // EditRunner show editing runner page func EditRunner(ctx *context.Context) { - ctx.Data["Title"] = ctx.Tr("admin.runners.edit") + ctx.Data["Title"] = ctx.Tr("admin.runners.edit_runner") ctx.Data["PageIsAdmin"] = true ctx.Data["PageIsAdminRunners"] = true @@ -107,7 +124,7 @@ func EditRunnerPost(ctx *context.Context) { err = bots_model.UpdateRunner(ctx, runner, "description", "custom_labels") if err != nil { log.Warn("EditRunnerPost.UpdateRunner failed: %v, url: %s", err, ctx.Req.URL) - ctx.Flash.Warning(ctx.Tr("admin.runners.edit_failed")) + ctx.Flash.Warning(ctx.Tr("admin.runners.update_runner_failed")) ctx.Redirect(setting.AppSubURL + "/admin/runners/" + url.PathEscape(ctx.Params(":runnerid"))) return } @@ -118,7 +135,7 @@ func EditRunnerPost(ctx *context.Context) { log.Debug("EditRunnerPost success: %s", ctx.Req.URL) - ctx.Flash.Success(ctx.Tr("admin.runners.edit_success")) + ctx.Flash.Success(ctx.Tr("admin.runners.update_runner_success")) ctx.Redirect(setting.AppSubURL + "/admin/runners/" + url.PathEscape(ctx.Params(":runnerid"))) } @@ -134,14 +151,25 @@ func DeleteRunnerPost(ctx *context.Context) { err = bots_model.DeleteRunner(ctx, runner) if err != nil { log.Warn("DeleteRunnerPost.UpdateRunner failed: %v, url: %s", err, ctx.Req.URL) - ctx.Flash.Warning(ctx.Tr("admin.runners.delete_failed")) + ctx.Flash.Warning(ctx.Tr("admin.runners.delete_runner_failed")) ctx.Redirect(setting.AppSubURL + "/admin/runners/" + url.PathEscape(ctx.Params(":runnerid"))) return } log.Info("DeleteRunnerPost success: %s", ctx.Req.URL) - ctx.Flash.Success(ctx.Tr("admin.runners.deletion_success")) + ctx.Flash.Success(ctx.Tr("admin.runners.delete_runner_success")) + ctx.Redirect(setting.AppSubURL + "/admin/runners/") +} + +func ResetRunnerRegistrationToken(ctx *context.Context) { + _, err := bots_model.NewRunnerToken(0, 0) + if err != nil { + ctx.ServerError("ResetRunnerRegistrationToken", err) + return + } + + ctx.Flash.Success(ctx.Tr("admin.runners.reset_registration_token_success")) ctx.Redirect(setting.AppSubURL + "/admin/runners/") } diff --git a/routers/web/web.go b/routers/web/web.go index b8e72d14eb..2dbaf26538 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -627,6 +627,7 @@ func RegisterRoutes(m *web.Route) { m.Group("/runners", func() { m.Get("", admin.Runners) + m.Get("/reset_registration_token", admin.ResetRunnerRegistrationToken) m.Combo("/{runnerid}").Get(admin.EditRunner).Post(bindIgnErr(forms.AdminEditRunnerForm{}), admin.EditRunnerPost) m.Post("/{runnerid}/delete", admin.DeleteRunnerPost) }) diff --git a/templates/admin/runner/edit.tmpl b/templates/admin/runner/edit.tmpl index 023114185d..6a46eed8f4 100644 --- a/templates/admin/runner/edit.tmpl +++ b/templates/admin/runner/edit.tmpl @@ -16,7 +16,7 @@ {{.Runner.StatusType}}
- + {{TimeSinceUnix .Runner.LastOnline $.locale}}
@@ -56,7 +56,7 @@

- {{.locale.Tr "admin.runner.task_list"}} + {{.locale.Tr "admin.runners.task_list"}}

Comming soon @@ -66,18 +66,18 @@