kubernetes: create service for detached steps (#4892)

Co-authored-by: Robert Kaussow <mail@thegeeklab.de>
This commit is contained in:
hhomar 2025-02-25 06:16:43 +00:00 committed by GitHub
parent 0428d01d6f
commit f47165ff9f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 61 additions and 4 deletions

View file

@ -199,7 +199,7 @@ func (e *kube) SetupWorkflow(ctx context.Context, conf *types.Config, taskUUID s
var extraHosts []types.HostAlias
for _, stage := range conf.Stages {
for _, step := range stage.Steps {
if step.Type == types.StepTypeService || step.Detached {
if isService(step) {
svc, err := startService(ctx, e, step)
if err != nil {
return err
@ -416,7 +416,7 @@ func (e *kube) DestroyWorkflow(ctx context.Context, conf *types.Config, taskUUID
return err
}
if step.Type == types.StepTypeService {
if isService(step) {
err := stopService(ctx, e, step, defaultDeleteOptions)
if err != nil {
return err

View file

@ -70,7 +70,7 @@ func mkPod(step *types.Step, config *config, podName, goos string, options Backe
}
func stepToPodName(step *types.Step) (name string, err error) {
if step.Type == types.StepTypeService {
if isService(step) {
return serviceName(step)
}
return podName(step)
@ -112,7 +112,7 @@ func podLabels(step *types.Step, config *config, options BackendOptions) (map[st
log.Trace().Msgf("using labels from the configuration: %v", config.PodLabels)
maps.Copy(labels, config.PodLabels)
}
if step.Type == types.StepTypeService {
if isService(step) {
labels[ServiceLabel], _ = serviceName(step)
}
labels[StepLabel], err = stepLabel(step)

View file

@ -53,6 +53,57 @@ func TestStepToPodName(t *testing.T) {
name, err = stepToPodName(&types.Step{UUID: "01he8bebctabr3kg", Name: "postgres", Type: types.StepTypeService})
assert.NoError(t, err)
assert.EqualValues(t, "wp-svc-01he8bebctabr3kg-postgres", name)
// Detached service
name, err = stepToPodName(&types.Step{UUID: "01he8bebctabr3kg", Name: "postgres", Detached: true})
assert.NoError(t, err)
assert.EqualValues(t, "wp-svc-01he8bebctabr3kg-postgres", name)
// Detached long running container
name, err = stepToPodName(&types.Step{UUID: "01he8bebctabr3kg", Name: "long running", Detached: true})
assert.NoError(t, err)
assert.EqualValues(t, "wp-01he8bebctabr3kg", name)
}
func TestPodMeta(t *testing.T) {
meta, err := podMeta(&types.Step{
Name: "postgres",
UUID: "01he8bebctabr3kg",
Type: types.StepTypeService,
Image: "postgres:16",
WorkingDir: "/woodpecker/src",
Environment: map[string]string{"CI": "woodpecker"},
}, &config{
Namespace: "woodpecker",
}, BackendOptions{}, "wp-01he8bebctabr3kg-0")
assert.NoError(t, err)
assert.EqualValues(t, "wp-svc-01he8bebctabr3kg-postgres", meta.Labels[ServiceLabel])
// Detached service
meta, err = podMeta(&types.Step{
Name: "postgres",
UUID: "01he8bebctabr3kg",
Detached: true,
Image: "postgres:16",
WorkingDir: "/woodpecker/src",
Environment: map[string]string{"CI": "woodpecker"},
}, &config{
Namespace: "woodpecker",
}, BackendOptions{}, "wp-01he8bebctabr3kg-0")
assert.NoError(t, err)
assert.EqualValues(t, "wp-svc-01he8bebctabr3kg-postgres", meta.Labels[ServiceLabel])
// Detached long running container
meta, err = podMeta(&types.Step{
Name: "long running",
UUID: "01he8bebctabr3kg",
Detached: true,
Image: "postgres:16",
WorkingDir: "/woodpecker/src",
Environment: map[string]string{"CI": "woodpecker"},
}, &config{
Namespace: "woodpecker",
}, BackendOptions{}, "wp-01he8bebctabr3kg-0")
assert.NoError(t, err)
assert.EqualValues(t, "", meta.Labels[ServiceLabel])
}
func TestStepLabel(t *testing.T) {

View file

@ -24,6 +24,8 @@ import (
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
client_cmd "k8s.io/client-go/tools/clientcmd"
"go.woodpecker-ci.org/woodpecker/v3/pipeline/backend/types"
)
var (
@ -103,6 +105,10 @@ func getClientInsideOfCluster() (kubernetes.Interface, error) {
return kubernetes.NewForConfig(config)
}
func isService(step *types.Step) bool {
return step.Type == types.StepTypeService || (step.Detached && dnsPattern.FindStringIndex(step.Name) != nil)
}
func newBool(val bool) *bool {
ptr := new(bool)
*ptr = val