diff --git a/pipeline/backend/kubernetes/kubernetes.go b/pipeline/backend/kubernetes/kubernetes.go index 7902b3785..70bc684b3 100644 --- a/pipeline/backend/kubernetes/kubernetes.go +++ b/pipeline/backend/kubernetes/kubernetes.go @@ -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 diff --git a/pipeline/backend/kubernetes/pod.go b/pipeline/backend/kubernetes/pod.go index 42a04356c..3548213a0 100644 --- a/pipeline/backend/kubernetes/pod.go +++ b/pipeline/backend/kubernetes/pod.go @@ -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) diff --git a/pipeline/backend/kubernetes/pod_test.go b/pipeline/backend/kubernetes/pod_test.go index 01aa95ecb..8b1812555 100644 --- a/pipeline/backend/kubernetes/pod_test.go +++ b/pipeline/backend/kubernetes/pod_test.go @@ -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) { diff --git a/pipeline/backend/kubernetes/utils.go b/pipeline/backend/kubernetes/utils.go index 030ce2c81..d1d05f938 100644 --- a/pipeline/backend/kubernetes/utils.go +++ b/pipeline/backend/kubernetes/utils.go @@ -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