Display the version of runner in the runner list (#23490)

Close: #23489 

### Change
1. Add version column to action_runner table.
2. Read the runner version from the request header, and update it in DB.
3. Display version in runner list

### Screenshot

![image](https://user-images.githubusercontent.com/33891828/225220990-98bc0158-4403-4e6c-9805-31bbbc65a802.png)
This commit is contained in:
sillyguodong 2023-03-20 10:19:40 +08:00 committed by GitHub
parent af3711100a
commit 371520d7ab
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 35 additions and 2 deletions

View file

@ -25,6 +25,7 @@ type ActionRunner struct {
ID int64 ID int64
UUID string `xorm:"CHAR(36) UNIQUE"` UUID string `xorm:"CHAR(36) UNIQUE"`
Name string `xorm:"VARCHAR(255)"` Name string `xorm:"VARCHAR(255)"`
Version string `xorm:"VARCHAR(64)"`
OwnerID int64 `xorm:"index"` // org level runner, 0 means system OwnerID int64 `xorm:"index"` // org level runner, 0 means system
Owner *user_model.User `xorm:"-"` Owner *user_model.User `xorm:"-"`
RepoID int64 `xorm:"index"` // repo level runner, if orgid also is zero, then it's a global RepoID int64 `xorm:"index"` // repo level runner, if orgid also is zero, then it's a global

View file

@ -473,6 +473,8 @@ var migrations = []Migration{
NewMigration("Add missed column owner_id for project table", v1_20.AddNewColumnForProject), NewMigration("Add missed column owner_id for project table", v1_20.AddNewColumnForProject),
// v247 -> v248 // v247 -> v248
NewMigration("Fix incorrect project type", v1_20.FixIncorrectProjectType), NewMigration("Fix incorrect project type", v1_20.FixIncorrectProjectType),
// v248 -> v249
NewMigration("Add version column to action_runner table", v1_20.AddVersionToActionRunner),
} }
// GetCurrentDBVersion returns the current db version // GetCurrentDBVersion returns the current db version

View file

@ -0,0 +1,14 @@
// Copyright 2023 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package v1_20 //nolint
import "xorm.io/xorm"
func AddVersionToActionRunner(x *xorm.Engine) error {
type ActionRunner struct {
Version string `xorm:"VARCHAR(64)"` // the version of act_runner
}
return x.Sync(new(ActionRunner))
}

View file

@ -3355,6 +3355,7 @@ runners.status.unspecified = Unknown
runners.status.idle = Idle runners.status.idle = Idle
runners.status.active = Active runners.status.active = Active
runners.status.offline = Offline runners.status.offline = Offline
runners.version = Version
runs.all_workflows = All Workflows runs.all_workflows = All Workflows
runs.open_tab = %d Open runs.open_tab = %d Open

View file

@ -23,6 +23,9 @@ import (
const ( const (
uuidHeaderKey = "x-runner-uuid" uuidHeaderKey = "x-runner-uuid"
tokenHeaderKey = "x-runner-token" tokenHeaderKey = "x-runner-token"
versionHeaderKey = "x-runner-version"
versionUnknown = "Unknown"
) )
var withRunner = connect.WithInterceptors(connect.UnaryInterceptorFunc(func(unaryFunc connect.UnaryFunc) connect.UnaryFunc { var withRunner = connect.WithInterceptors(connect.UnaryInterceptorFunc(func(unaryFunc connect.UnaryFunc) connect.UnaryFunc {
@ -33,6 +36,12 @@ var withRunner = connect.WithInterceptors(connect.UnaryInterceptorFunc(func(unar
} }
uuid := request.Header().Get(uuidHeaderKey) uuid := request.Header().Get(uuidHeaderKey)
token := request.Header().Get(tokenHeaderKey) token := request.Header().Get(tokenHeaderKey)
version := request.Header().Get(versionHeaderKey)
if util.IsEmptyString(version) {
version = versionUnknown
}
version, _ = util.SplitStringAtByteN(version, 64)
runner, err := actions_model.GetRunnerByUUID(ctx, uuid) runner, err := actions_model.GetRunnerByUUID(ctx, uuid)
if err != nil { if err != nil {
if errors.Is(err, util.ErrNotExist) { if errors.Is(err, util.ErrNotExist) {
@ -45,6 +54,10 @@ var withRunner = connect.WithInterceptors(connect.UnaryInterceptorFunc(func(unar
} }
cols := []string{"last_online"} cols := []string{"last_online"}
if runner.Version != version {
runner.Version = version
cols = append(cols, "version")
}
runner.LastOnline = timeutil.TimeStampNow() runner.LastOnline = timeutil.TimeStampNow()
if methodName == "UpdateTask" || methodName == "UpdateLog" { if methodName == "UpdateTask" || methodName == "UpdateLog" {
runner.LastActive = timeutil.TimeStampNow() runner.LastActive = timeutil.TimeStampNow()

View file

@ -49,6 +49,7 @@
<th data-sortt-asc="online" data-sortt-desc="offline">{{.locale.Tr "actions.runners.status"}}</th> <th data-sortt-asc="online" data-sortt-desc="offline">{{.locale.Tr "actions.runners.status"}}</th>
<th data-sortt-asc="alphabetically">{{.locale.Tr "actions.runners.id"}}</th> <th data-sortt-asc="alphabetically">{{.locale.Tr "actions.runners.id"}}</th>
<th>{{.locale.Tr "actions.runners.name"}}</th> <th>{{.locale.Tr "actions.runners.name"}}</th>
<th>{{.locale.Tr "actions.runners.version"}}</th>
<th>{{.locale.Tr "actions.runners.owner_type"}}</th> <th>{{.locale.Tr "actions.runners.owner_type"}}</th>
<th>{{.locale.Tr "actions.runners.labels"}}</th> <th>{{.locale.Tr "actions.runners.labels"}}</th>
<th>{{.locale.Tr "actions.runners.last_online"}}</th> <th>{{.locale.Tr "actions.runners.last_online"}}</th>
@ -64,6 +65,7 @@
</td> </td>
<td>{{.ID}}</td> <td>{{.ID}}</td>
<td><p class="tooltip" data-content="{{.Description}}">{{.Name}}</p></td> <td><p class="tooltip" data-content="{{.Description}}">{{.Name}}</p></td>
<td>{{.Version}}</td>
<td>{{.OwnType}}</td> <td>{{.OwnType}}</td>
<td class="runner-tags"> <td class="runner-tags">
{{range .AllLabels}}<span class="ui label">{{.}}</span>{{end}} {{range .AllLabels}}<span class="ui label">{{.}}</span>{{end}}