mirror of
https://gitea.com/gitea/act_runner.git
synced 2025-06-19 04:57:13 +02:00
Clarify labels (#69)
The label will follow the format `label[:schema[:args]]`, and the schema will be `host` if it's omitted. So - `ubuntu:docker://node:18`: Run jobs with label `ubuntu` via docker with image `node:18` - `ubuntu:host`: Run jobs with label `ubuntu` on the host directly. - `ubuntu`: Same as `ubuntu:host`. - `ubuntu:vm:ubuntu-latest`: (Just a example, not Implemented) Run jobs with label `ubuntu` via virtual machine with iso `ubuntu-latest`. Reviewed-on: https://gitea.com/gitea/act_runner/pulls/69 Reviewed-by: Zettat123 <zettat123@noreply.gitea.io> Reviewed-by: wxiaoguang <wxiaoguang@noreply.gitea.io>
This commit is contained in:
26
runtime/label.go
Normal file
26
runtime/label.go
Normal file
@ -0,0 +1,26 @@
|
||||
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package runtime
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func ParseLabel(str string) (label, schema, arg string, err error) {
|
||||
splits := strings.SplitN(str, ":", 3)
|
||||
label = splits[0]
|
||||
schema = "host"
|
||||
arg = ""
|
||||
if len(splits) >= 2 {
|
||||
schema = splits[1]
|
||||
}
|
||||
if len(splits) >= 3 {
|
||||
arg = splits[2]
|
||||
}
|
||||
if schema != "host" && schema != "docker" {
|
||||
return "", "", "", fmt.Errorf("unsupported schema: %s", schema)
|
||||
}
|
||||
return
|
||||
}
|
60
runtime/label_test.go
Normal file
60
runtime/label_test.go
Normal file
@ -0,0 +1,60 @@
|
||||
package runtime
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestParseLabel(t *testing.T) {
|
||||
tests := []struct {
|
||||
args string
|
||||
wantLabel string
|
||||
wantSchema string
|
||||
wantArg string
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
args: "ubuntu:docker://node:18",
|
||||
wantLabel: "ubuntu",
|
||||
wantSchema: "docker",
|
||||
wantArg: "//node:18",
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
args: "ubuntu:host",
|
||||
wantLabel: "ubuntu",
|
||||
wantSchema: "host",
|
||||
wantArg: "",
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
args: "ubuntu",
|
||||
wantLabel: "ubuntu",
|
||||
wantSchema: "host",
|
||||
wantArg: "",
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
args: "ubuntu:vm:ubuntu-18.04",
|
||||
wantLabel: "",
|
||||
wantSchema: "",
|
||||
wantArg: "",
|
||||
wantErr: true,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.args, func(t *testing.T) {
|
||||
gotLabel, gotSchema, gotArg, err := ParseLabel(tt.args)
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("parseLabel() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
if gotLabel != tt.wantLabel {
|
||||
t.Errorf("parseLabel() gotLabel = %v, want %v", gotLabel, tt.wantLabel)
|
||||
}
|
||||
if gotSchema != tt.wantSchema {
|
||||
t.Errorf("parseLabel() gotSchema = %v, want %v", gotSchema, tt.wantSchema)
|
||||
}
|
||||
if gotArg != tt.wantArg {
|
||||
t.Errorf("parseLabel() gotArg = %v, want %v", gotArg, tt.wantArg)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
@ -8,6 +8,7 @@ import (
|
||||
"strings"
|
||||
|
||||
runnerv1 "code.gitea.io/actions-proto-go/runner/v1"
|
||||
log "github.com/sirupsen/logrus"
|
||||
|
||||
"gitea.com/gitea/act_runner/artifactcache"
|
||||
"gitea.com/gitea/act_runner/client"
|
||||
@ -35,28 +36,24 @@ func (s *Runner) Run(ctx context.Context, task *runnerv1.Task) error {
|
||||
}
|
||||
|
||||
func (s *Runner) platformPicker(labels []string) string {
|
||||
// "ubuntu-18.04:docker://node:16-buster"
|
||||
// "self-hosted"
|
||||
|
||||
platforms := make(map[string]string, len(labels))
|
||||
platforms := make(map[string]string, len(s.Labels))
|
||||
for _, l := range s.Labels {
|
||||
// "ubuntu-18.04:docker://node:16-buster"
|
||||
splits := strings.SplitN(l, ":", 2)
|
||||
if len(splits) == 1 {
|
||||
// identifier for non docker execution environment
|
||||
platforms[splits[0]] = "-self-hosted"
|
||||
label, schema, arg, err := ParseLabel(l)
|
||||
if err != nil {
|
||||
log.Errorf("invaid label %q: %v", l, err)
|
||||
continue
|
||||
}
|
||||
// ["ubuntu-18.04", "docker://node:16-buster"]
|
||||
k, v := splits[0], splits[1]
|
||||
|
||||
if prefix := "docker://"; !strings.HasPrefix(v, prefix) {
|
||||
switch schema {
|
||||
case "docker":
|
||||
// TODO "//" will be ignored, maybe we should use 'ubuntu-18.04:docker:node:16-buster' instead
|
||||
platforms[label] = strings.TrimPrefix(arg, "//")
|
||||
case "host":
|
||||
platforms[label] = "-self-hosted"
|
||||
default:
|
||||
// It should not happen, because ParseLabel has checked it.
|
||||
continue
|
||||
} else {
|
||||
v = strings.TrimPrefix(v, prefix)
|
||||
}
|
||||
// ubuntu-18.04 => node:16-buster
|
||||
platforms[k] = v
|
||||
}
|
||||
|
||||
for _, label := range labels {
|
||||
@ -71,6 +68,8 @@ func (s *Runner) platformPicker(labels []string) string {
|
||||
// ["with-gpu"] => "linux:with-gpu"
|
||||
// ["ubuntu-22.04", "with-gpu"] => "ubuntu:22.04_with-gpu"
|
||||
|
||||
// return default
|
||||
return "node:16-bullseye"
|
||||
// return default.
|
||||
// So the runner receives a task with a label that the runner doesn't have,
|
||||
// it happens when the user have edited the label of the runner in the web UI.
|
||||
return "node:16-bullseye" // TODO: it may be not correct, what if the runner is used as host mode only?
|
||||
}
|
||||
|
Reference in New Issue
Block a user