Skip to content

Commit baf0d40

Browse files
lunnydenyskontechknowlogick
authored
Add get actions runner registration token for API routes, repo, org, user and global level (#27144)
Replace #23761 --------- Co-authored-by: Denys Konovalov <kontakt@denyskon.de> Co-authored-by: techknowlogick <techknowlogick@gitea.io>
1 parent 4c29c75 commit baf0d40

File tree

8 files changed

+285
-14
lines changed

8 files changed

+285
-14
lines changed

routers/api/v1/admin/runners.go

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Copyright 2023 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package admin
5+
6+
import (
7+
"code.gitea.io/gitea/modules/context"
8+
"code.gitea.io/gitea/routers/api/v1/shared"
9+
)
10+
11+
// https://docs.github.com/en/rest/actions/self-hosted-runners?apiVersion=2022-11-28#create-a-registration-token-for-an-organization
12+
13+
// GetRegistrationToken returns the token to register global runners
14+
func GetRegistrationToken(ctx *context.APIContext) {
15+
// swagger:operation GET /admin/runners/registration-token admin adminGetRunnerRegistrationToken
16+
// ---
17+
// summary: Get an global actions runner registration token
18+
// produces:
19+
// - application/json
20+
// parameters:
21+
// responses:
22+
// "200":
23+
// "$ref": "#/responses/RegistrationToken"
24+
25+
shared.GetRegistrationToken(ctx, 0, 0)
26+
}

routers/api/v1/api.go

+35-14
Original file line numberDiff line numberDiff line change
@@ -948,11 +948,17 @@ func Routes() *web.Route {
948948
Post(bind(api.CreateEmailOption{}), user.AddEmail).
949949
Delete(bind(api.DeleteEmailOption{}), user.DeleteEmail)
950950

951-
// create or update a user's actions secrets
952-
m.Group("/actions/secrets", func() {
953-
m.Combo("/{secretname}").
954-
Put(bind(api.CreateOrUpdateSecretOption{}), user.CreateOrUpdateSecret).
955-
Delete(user.DeleteSecret)
951+
// manage user-level actions features
952+
m.Group("/actions", func() {
953+
m.Group("/secrets", func() {
954+
m.Combo("/{secretname}").
955+
Put(bind(api.CreateOrUpdateSecretOption{}), user.CreateOrUpdateSecret).
956+
Delete(user.DeleteSecret)
957+
})
958+
959+
m.Group("/runners", func() {
960+
m.Get("/registration-token", reqToken(), user.GetRegistrationToken)
961+
})
956962
})
957963

958964
m.Get("/followers", user.ListMyFollowers)
@@ -1052,10 +1058,16 @@ func Routes() *web.Route {
10521058
m.Post("/accept", repo.AcceptTransfer)
10531059
m.Post("/reject", repo.RejectTransfer)
10541060
}, reqToken())
1055-
m.Group("/actions/secrets", func() {
1056-
m.Combo("/{secretname}").
1057-
Put(reqToken(), reqOwner(), bind(api.CreateOrUpdateSecretOption{}), repo.CreateOrUpdateSecret).
1058-
Delete(reqToken(), reqOwner(), repo.DeleteSecret)
1061+
m.Group("/actions", func() {
1062+
m.Group("/secrets", func() {
1063+
m.Combo("/{secretname}").
1064+
Put(reqToken(), reqOwner(), bind(api.CreateOrUpdateSecretOption{}), repo.CreateOrUpdateSecret).
1065+
Delete(reqToken(), reqOwner(), repo.DeleteSecret)
1066+
})
1067+
1068+
m.Group("/runners", func() {
1069+
m.Get("/registration-token", reqToken(), reqOwner(), repo.GetRegistrationToken)
1070+
})
10591071
})
10601072
m.Group("/hooks/git", func() {
10611073
m.Combo("").Get(repo.ListGitHooks)
@@ -1422,11 +1434,17 @@ func Routes() *web.Route {
14221434
m.Combo("/{username}").Get(reqToken(), org.IsMember).
14231435
Delete(reqToken(), reqOrgOwnership(), org.DeleteMember)
14241436
})
1425-
m.Group("/actions/secrets", func() {
1426-
m.Get("", reqToken(), reqOrgOwnership(), org.ListActionsSecrets)
1427-
m.Combo("/{secretname}").
1428-
Put(reqToken(), reqOrgOwnership(), bind(api.CreateOrUpdateSecretOption{}), org.CreateOrUpdateSecret).
1429-
Delete(reqToken(), reqOrgOwnership(), org.DeleteSecret)
1437+
m.Group("/actions", func() {
1438+
m.Group("/secrets", func() {
1439+
m.Get("", reqToken(), reqOrgOwnership(), org.ListActionsSecrets)
1440+
m.Combo("/{secretname}").
1441+
Put(reqToken(), reqOrgOwnership(), bind(api.CreateOrUpdateSecretOption{}), org.CreateOrUpdateSecret).
1442+
Delete(reqToken(), reqOrgOwnership(), org.DeleteSecret)
1443+
})
1444+
1445+
m.Group("/runners", func() {
1446+
m.Get("/registration-token", reqToken(), reqOrgOwnership(), org.GetRegistrationToken)
1447+
})
14301448
})
14311449
m.Group("/public_members", func() {
14321450
m.Get("", org.ListPublicMembers)
@@ -1518,6 +1536,9 @@ func Routes() *web.Route {
15181536
Patch(bind(api.EditHookOption{}), admin.EditHook).
15191537
Delete(admin.DeleteHook)
15201538
})
1539+
m.Group("/runners", func() {
1540+
m.Get("/registration-token", admin.GetRegistrationToken)
1541+
})
15211542
}, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryAdmin), reqToken(), reqSiteAdmin())
15221543

15231544
m.Group("/topics", func() {

routers/api/v1/org/runners.go

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// Copyright 2023 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package org
5+
6+
import (
7+
"code.gitea.io/gitea/modules/context"
8+
"code.gitea.io/gitea/routers/api/v1/shared"
9+
)
10+
11+
// https://docs.github.com/en/rest/actions/self-hosted-runners?apiVersion=2022-11-28#create-a-registration-token-for-an-organization
12+
13+
// GetRegistrationToken returns the token to register org runners
14+
func GetRegistrationToken(ctx *context.APIContext) {
15+
// swagger:operation GET /orgs/{org}/actions/runners/registration-token organization orgGetRunnerRegistrationToken
16+
// ---
17+
// summary: Get an organization's actions runner registration token
18+
// produces:
19+
// - application/json
20+
// parameters:
21+
// - name: org
22+
// in: path
23+
// description: name of the organization
24+
// type: string
25+
// required: true
26+
// responses:
27+
// "200":
28+
// "$ref": "#/responses/RegistrationToken"
29+
30+
shared.GetRegistrationToken(ctx, ctx.Org.Organization.ID, 0)
31+
}
File renamed without changes.

routers/api/v1/repo/runners.go

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Copyright 2023 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package repo
5+
6+
import (
7+
"code.gitea.io/gitea/modules/context"
8+
"code.gitea.io/gitea/routers/api/v1/shared"
9+
)
10+
11+
// GetRegistrationToken returns the token to register repo runners
12+
func GetRegistrationToken(ctx *context.APIContext) {
13+
// swagger:operation GET /repos/{owner}/{repo}/runners/registration-token repository repoGetRunnerRegistrationToken
14+
// ---
15+
// summary: Get a repository's actions runner registration token
16+
// produces:
17+
// - application/json
18+
// parameters:
19+
// - name: owner
20+
// in: path
21+
// description: owner of the repo
22+
// type: string
23+
// required: true
24+
// - name: repo
25+
// in: path
26+
// description: name of the repo
27+
// type: string
28+
// required: true
29+
// responses:
30+
// "200":
31+
// "$ref": "#/responses/RegistrationToken"
32+
33+
shared.GetRegistrationToken(ctx, ctx.Repo.Repository.OwnerID, ctx.Repo.Repository.ID)
34+
}

routers/api/v1/shared/runners.go

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright 2023 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package shared
5+
6+
import (
7+
"errors"
8+
"net/http"
9+
10+
actions_model "code.gitea.io/gitea/models/actions"
11+
"code.gitea.io/gitea/modules/context"
12+
"code.gitea.io/gitea/modules/util"
13+
)
14+
15+
// RegistrationToken is response related to registeration token
16+
// swagger:response RegistrationToken
17+
type RegistrationToken struct {
18+
Token string `json:"token"`
19+
}
20+
21+
func GetRegistrationToken(ctx *context.APIContext, ownerID, repoID int64) {
22+
token, err := actions_model.GetLatestRunnerToken(ctx, ownerID, repoID)
23+
if errors.Is(err, util.ErrNotExist) || (token != nil && !token.IsActive) {
24+
token, err = actions_model.NewRunnerToken(ctx, ownerID, repoID)
25+
}
26+
if err != nil {
27+
ctx.InternalServerError(err)
28+
return
29+
}
30+
31+
ctx.JSON(http.StatusOK, RegistrationToken{Token: token.Token})
32+
}

routers/api/v1/user/runners.go

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Copyright 2023 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package user
5+
6+
import (
7+
"code.gitea.io/gitea/modules/context"
8+
"code.gitea.io/gitea/routers/api/v1/shared"
9+
)
10+
11+
// https://docs.github.com/en/rest/actions/self-hosted-runners?apiVersion=2022-11-28#create-a-registration-token-for-an-organization
12+
13+
// GetRegistrationToken returns the token to register user runners
14+
func GetRegistrationToken(ctx *context.APIContext) {
15+
// swagger:operation GET /user/actions/runners/registration-token user userGetRunnerRegistrationToken
16+
// ---
17+
// summary: Get an user's actions runner registration token
18+
// produces:
19+
// - application/json
20+
// parameters:
21+
// responses:
22+
// "200":
23+
// "$ref": "#/responses/RegistrationToken"
24+
25+
shared.GetRegistrationToken(ctx, ctx.Doer.ID, 0)
26+
}

templates/swagger/v1_json.tmpl

+101
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)