- {{.locale.Tr "admin.runnners.delete_notice" | Safe}}
+ {{.locale.Tr "admin.runners.delete_runner_notice" | Safe}}
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}}