code.gitea.io/gitea@v1.21.7/routers/web/repo/setting/runners.go (about) 1 // Copyright 2022 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package setting 5 6 import ( 7 "errors" 8 "net/http" 9 "net/url" 10 11 actions_model "code.gitea.io/gitea/models/actions" 12 "code.gitea.io/gitea/models/db" 13 "code.gitea.io/gitea/modules/base" 14 "code.gitea.io/gitea/modules/context" 15 "code.gitea.io/gitea/modules/setting" 16 actions_shared "code.gitea.io/gitea/routers/web/shared/actions" 17 shared_user "code.gitea.io/gitea/routers/web/shared/user" 18 ) 19 20 const ( 21 // TODO: Separate secrets from runners when layout is ready 22 tplRepoRunners base.TplName = "repo/settings/actions" 23 tplOrgRunners base.TplName = "org/settings/actions" 24 tplAdminRunners base.TplName = "admin/actions" 25 tplUserRunners base.TplName = "user/settings/actions" 26 tplRepoRunnerEdit base.TplName = "repo/settings/runner_edit" 27 tplOrgRunnerEdit base.TplName = "org/settings/runners_edit" 28 tplAdminRunnerEdit base.TplName = "admin/runners/edit" 29 tplUserRunnerEdit base.TplName = "user/settings/runner_edit" 30 ) 31 32 type runnersCtx struct { 33 OwnerID int64 34 RepoID int64 35 IsRepo bool 36 IsOrg bool 37 IsAdmin bool 38 IsUser bool 39 RunnersTemplate base.TplName 40 RunnerEditTemplate base.TplName 41 RedirectLink string 42 } 43 44 func getRunnersCtx(ctx *context.Context) (*runnersCtx, error) { 45 if ctx.Data["PageIsRepoSettings"] == true { 46 return &runnersCtx{ 47 RepoID: ctx.Repo.Repository.ID, 48 OwnerID: 0, 49 IsRepo: true, 50 RunnersTemplate: tplRepoRunners, 51 RunnerEditTemplate: tplRepoRunnerEdit, 52 RedirectLink: ctx.Repo.RepoLink + "/settings/actions/runners/", 53 }, nil 54 } 55 56 if ctx.Data["PageIsOrgSettings"] == true { 57 err := shared_user.LoadHeaderCount(ctx) 58 if err != nil { 59 ctx.ServerError("LoadHeaderCount", err) 60 return nil, nil 61 } 62 return &runnersCtx{ 63 RepoID: 0, 64 OwnerID: ctx.Org.Organization.ID, 65 IsOrg: true, 66 RunnersTemplate: tplOrgRunners, 67 RunnerEditTemplate: tplOrgRunnerEdit, 68 RedirectLink: ctx.Org.OrgLink + "/settings/actions/runners/", 69 }, nil 70 } 71 72 if ctx.Data["PageIsAdmin"] == true { 73 return &runnersCtx{ 74 RepoID: 0, 75 OwnerID: 0, 76 IsAdmin: true, 77 RunnersTemplate: tplAdminRunners, 78 RunnerEditTemplate: tplAdminRunnerEdit, 79 RedirectLink: setting.AppSubURL + "/admin/actions/runners/", 80 }, nil 81 } 82 83 if ctx.Data["PageIsUserSettings"] == true { 84 return &runnersCtx{ 85 OwnerID: ctx.Doer.ID, 86 RepoID: 0, 87 IsUser: true, 88 RunnersTemplate: tplUserRunners, 89 RunnerEditTemplate: tplUserRunnerEdit, 90 RedirectLink: setting.AppSubURL + "/user/settings/actions/runners/", 91 }, nil 92 } 93 94 return nil, errors.New("unable to set Runners context") 95 } 96 97 // Runners render settings/actions/runners page for repo level 98 func Runners(ctx *context.Context) { 99 ctx.Data["PageIsSharedSettingsRunners"] = true 100 ctx.Data["Title"] = ctx.Tr("actions.actions") 101 ctx.Data["PageType"] = "runners" 102 103 rCtx, err := getRunnersCtx(ctx) 104 if err != nil { 105 ctx.ServerError("getRunnersCtx", err) 106 return 107 } 108 109 page := ctx.FormInt("page") 110 if page <= 1 { 111 page = 1 112 } 113 114 opts := actions_model.FindRunnerOptions{ 115 ListOptions: db.ListOptions{ 116 Page: page, 117 PageSize: 100, 118 }, 119 Sort: ctx.Req.URL.Query().Get("sort"), 120 Filter: ctx.Req.URL.Query().Get("q"), 121 } 122 if rCtx.IsRepo { 123 opts.RepoID = rCtx.RepoID 124 opts.WithAvailable = true 125 } else if rCtx.IsOrg || rCtx.IsUser { 126 opts.OwnerID = rCtx.OwnerID 127 opts.WithAvailable = true 128 } 129 actions_shared.RunnersList(ctx, opts) 130 131 ctx.HTML(http.StatusOK, rCtx.RunnersTemplate) 132 } 133 134 // RunnersEdit renders runner edit page for repository level 135 func RunnersEdit(ctx *context.Context) { 136 ctx.Data["PageIsSharedSettingsRunners"] = true 137 ctx.Data["Title"] = ctx.Tr("actions.runners.edit_runner") 138 rCtx, err := getRunnersCtx(ctx) 139 if err != nil { 140 ctx.ServerError("getRunnersCtx", err) 141 return 142 } 143 144 page := ctx.FormInt("page") 145 if page <= 1 { 146 page = 1 147 } 148 149 actions_shared.RunnerDetails(ctx, page, 150 ctx.ParamsInt64(":runnerid"), rCtx.OwnerID, rCtx.RepoID, 151 ) 152 ctx.HTML(http.StatusOK, rCtx.RunnerEditTemplate) 153 } 154 155 func RunnersEditPost(ctx *context.Context) { 156 rCtx, err := getRunnersCtx(ctx) 157 if err != nil { 158 ctx.ServerError("getRunnersCtx", err) 159 return 160 } 161 actions_shared.RunnerDetailsEditPost(ctx, ctx.ParamsInt64(":runnerid"), 162 rCtx.OwnerID, rCtx.RepoID, 163 rCtx.RedirectLink+url.PathEscape(ctx.Params(":runnerid"))) 164 } 165 166 func ResetRunnerRegistrationToken(ctx *context.Context) { 167 rCtx, err := getRunnersCtx(ctx) 168 if err != nil { 169 ctx.ServerError("getRunnersCtx", err) 170 return 171 } 172 actions_shared.RunnerResetRegistrationToken(ctx, rCtx.OwnerID, rCtx.RepoID, rCtx.RedirectLink) 173 } 174 175 // RunnerDeletePost response for deleting runner 176 func RunnerDeletePost(ctx *context.Context) { 177 rCtx, err := getRunnersCtx(ctx) 178 if err != nil { 179 ctx.ServerError("getRunnersCtx", err) 180 return 181 } 182 actions_shared.RunnerDeletePost(ctx, ctx.ParamsInt64(":runnerid"), rCtx.RedirectLink, rCtx.RedirectLink+url.PathEscape(ctx.Params(":runnerid"))) 183 } 184 185 func RedirectToDefaultSetting(ctx *context.Context) { 186 ctx.Redirect(ctx.Repo.RepoLink + "/settings/actions/runners") 187 }