Add an HTTP API endpoint for runner registration. It enables managing the entire runner lifecycle using Forgejo's HTTP API. See https://code.forgejo.org/forgejo/forgejo-actions-feature-requests/issues/78 for background, design considerations, and usage. Example usage: ``` $ curl -X POST -H "Content-Type: application/json" -H "Accept: application/json" -H "Authorization: token 3fc3ef39805b0f811a5d7789cb7b448348d6bfbb" --data '{"name":"api-runner","description":"Lorem ipsum"}' http://localhost:3000/api/v1/user/actions/runners ``` ```json {"id":30,"uuid":"a5e33697-9f58-437d-83c3-551b6c6a6334","token":"cac45fa6726fe4e28f42598773671af28a3be121"} ``` ## Checklist The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org). ### Tests - I added test coverage for Go changes... - [ ] in their respective `*_test.go` for unit tests. - [x] in the `tests/integration` directory if it involves interactions with a live Forgejo server. - I added test coverage for JavaScript changes... - [ ] in `web_src/js/*.test.js` if it can be unit tested. - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)). ### Documentation - [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [ ] I do not want this change to show in the release notes. - [ ] I want the title to show in the release notes with a link to this pull request. - [ ] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/10677 Reviewed-by: Mathieu Fenniak <mfenniak@noreply.codeberg.org> Co-authored-by: Andreas Ahlenstorf <andreas@ahlenstorf.ch> Co-committed-by: Andreas Ahlenstorf <andreas@ahlenstorf.ch>
191 lines
5.9 KiB
Go
191 lines
5.9 KiB
Go
// Copyright 2023 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package admin
|
|
|
|
import (
|
|
"forgejo.org/routers/api/v1/shared"
|
|
"forgejo.org/services/context"
|
|
)
|
|
|
|
// GetRunnerRegistrationToken returns a token to register global runners
|
|
func GetRunnerRegistrationToken(ctx *context.APIContext) {
|
|
// swagger:operation GET /admin/actions/runners/registration-token admin adminGetRunnerRegistrationToken
|
|
// ---
|
|
// summary: Get a runner registration token for registering global runners
|
|
// produces:
|
|
// - application/json
|
|
// parameters:
|
|
// responses:
|
|
// "200":
|
|
// "$ref": "#/responses/RegistrationToken"
|
|
|
|
shared.GetRegistrationToken(ctx, 0, 0)
|
|
}
|
|
|
|
// GetRegistrationToken returns the token to register global runners
|
|
//
|
|
// Deprecated: This operation has been deprecated in Forgejo 15. Use GetRunnerRegistrationToken instead.
|
|
func GetRegistrationToken(ctx *context.APIContext) {
|
|
// swagger:operation GET /admin/runners/registration-token admin adminGetRegistrationToken
|
|
// ---
|
|
// summary: Get a runner registration token for registering global runners
|
|
// description: >
|
|
// This operation has been deprecated in Forgejo 15.
|
|
// Use [`/admin/actions/runners/registration-token`](#/admin/adminGetRunnerRegistrationToken) instead.
|
|
// deprecated: true
|
|
// produces:
|
|
// - application/json
|
|
// parameters:
|
|
// responses:
|
|
// "200":
|
|
// "$ref": "#/responses/RegistrationToken"
|
|
|
|
shared.GetRegistrationToken(ctx, 0, 0)
|
|
}
|
|
|
|
// GetActionRunJobs returns a list of action run jobs
|
|
func GetActionRunJobs(ctx *context.APIContext) {
|
|
// swagger:operation GET /admin/actions/runners/jobs admin adminGetActionRunJobs
|
|
// ---
|
|
// summary: Get action run jobs
|
|
// produces:
|
|
// - application/json
|
|
// parameters:
|
|
// - name: labels
|
|
// in: query
|
|
// description: a comma separated list of labels to search for
|
|
// type: string
|
|
// responses:
|
|
// "200":
|
|
// "$ref": "#/responses/RunJobList"
|
|
// "403":
|
|
// "$ref": "#/responses/forbidden"
|
|
shared.GetActionRunJobs(ctx, 0, 0)
|
|
}
|
|
|
|
// SearchActionRunJobs returns a list of actions jobs filtered by the provided parameters
|
|
//
|
|
// Deprecated: This operation has been deprecated in Forgejo 15. Use GetActionRunJobs instead.
|
|
func SearchActionRunJobs(ctx *context.APIContext) {
|
|
// swagger:operation GET /admin/runners/jobs admin adminSearchRunJobs
|
|
// ---
|
|
// summary: Search action jobs according to filter conditions
|
|
// description: >
|
|
// This operation has been deprecated in Forgejo 15.
|
|
// Use [`/admin/actions/runners/jobs`](#/admin/adminGetActionRunJobs) instead.
|
|
// deprecated: true
|
|
// produces:
|
|
// - application/json
|
|
// parameters:
|
|
// - name: labels
|
|
// in: query
|
|
// description: a comma separated list of run job labels to search for
|
|
// type: string
|
|
// responses:
|
|
// "200":
|
|
// "$ref": "#/responses/RunJobList"
|
|
// "403":
|
|
// "$ref": "#/responses/forbidden"
|
|
shared.GetActionRunJobs(ctx, 0, 0)
|
|
}
|
|
|
|
// ListRunners returns all runners, no matter whether they are global runners or scoped to an organization, user, or repository
|
|
func ListRunners(ctx *context.APIContext) {
|
|
// swagger:operation GET /admin/actions/runners admin getAdminRunners
|
|
// ---
|
|
// summary: Get all runners, no matter whether they are global runners or scoped to an organization, user, or repository
|
|
// produces:
|
|
// - application/json
|
|
// parameters:
|
|
// - name: page
|
|
// in: query
|
|
// description: page number of results to return (1-based)
|
|
// type: integer
|
|
// - name: limit
|
|
// in: query
|
|
// description: page size of results
|
|
// type: integer
|
|
// responses:
|
|
// "200":
|
|
// "$ref": "#/responses/ActionRunnerList"
|
|
// "400":
|
|
// "$ref": "#/responses/error"
|
|
// "404":
|
|
// "$ref": "#/responses/notFound"
|
|
shared.ListRunners(ctx, 0, 0)
|
|
}
|
|
|
|
// GetRunner returns a particular runner, no matter whether it is a global runner or scoped to an organization, user, or repository
|
|
func GetRunner(ctx *context.APIContext) {
|
|
// swagger:operation GET /admin/actions/runners/{runner_id} admin getAdminRunner
|
|
// ---
|
|
// summary: Get a particular runner, no matter whether it is a global runner or scoped to an organization, user, or repository
|
|
// produces:
|
|
// - application/json
|
|
// parameters:
|
|
// - name: runner_id
|
|
// in: path
|
|
// description: ID of the runner
|
|
// type: string
|
|
// required: true
|
|
// responses:
|
|
// "200":
|
|
// "$ref": "#/responses/ActionRunner"
|
|
// "400":
|
|
// "$ref": "#/responses/error"
|
|
// "404":
|
|
// "$ref": "#/responses/notFound"
|
|
shared.GetRunner(ctx, 0, 0, ctx.ParamsInt64("runner_id"))
|
|
}
|
|
|
|
// RegisterRunner registers a new global runner
|
|
func RegisterRunner(ctx *context.APIContext) {
|
|
// swagger:operation POST /admin/actions/runners admin registerAdminRunner
|
|
// ---
|
|
// summary: Register a new global runner
|
|
// consumes:
|
|
// - application/json
|
|
// produces:
|
|
// - application/json
|
|
// parameters:
|
|
// - name: body
|
|
// in: body
|
|
// schema:
|
|
// "$ref": "#/definitions/RegisterRunnerOptions"
|
|
// responses:
|
|
// "201":
|
|
// "$ref": "#/responses/RegisterRunnerResponse"
|
|
// "400":
|
|
// "$ref": "#/responses/error"
|
|
// "401":
|
|
// "$ref": "#/responses/unauthorized"
|
|
// "404":
|
|
// "$ref": "#/responses/notFound"
|
|
|
|
shared.RegisterRunner(ctx, 0, 0)
|
|
}
|
|
|
|
// DeleteRunner removes a particular runner, no matter whether it is a global runner or scoped to an organization, user, or repository
|
|
func DeleteRunner(ctx *context.APIContext) {
|
|
// swagger:operation DELETE /admin/actions/runners/{runner_id} admin deleteAdminRunner
|
|
// ---
|
|
// summary: Delete a particular runner, no matter whether it is a global runner or scoped to an organization, user, or repository
|
|
// produces:
|
|
// - application/json
|
|
// parameters:
|
|
// - name: runner_id
|
|
// in: path
|
|
// description: ID of the runner
|
|
// type: string
|
|
// required: true
|
|
// responses:
|
|
// "204":
|
|
// description: runner has been deleted
|
|
// "400":
|
|
// "$ref": "#/responses/error"
|
|
// "404":
|
|
// "$ref": "#/responses/notFound"
|
|
shared.DeleteRunner(ctx, 0, 0, ctx.ParamsInt64("runner_id"))
|
|
}
|