From 2be7a6f1a5d50c05f55085c47234fdaa2d09426e Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Tue, 22 Jul 2025 07:54:10 +0000 Subject: [PATCH] fix: sanitize network aliases to be valid DNS names (#190) - s/[^A-Z0-9-]/_/g - add a log line in case the name is sanitized Closes forgejo/runner#226 --- It is breaking because it will fail jobs that rely on service names that contain characters that are sanitized Reviewed-on: https://code.forgejo.org/forgejo/act/pulls/190 Reviewed-by: Michael Kriese Co-authored-by: Earl Warren Co-committed-by: Earl Warren --- act/runner/run_context.go | 15 +++++++++++++-- act/runner/run_context_test.go | 8 ++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/act/runner/run_context.go b/act/runner/run_context.go index 323346c0..a43ec444 100644 --- a/act/runner/run_context.go +++ b/act/runner/run_context.go @@ -402,6 +402,17 @@ func (rc *RunContext) getNetworkName(_ context.Context) (networkName string, cre return networkName, createAndDeleteNetwork } +var sanitizeNetworkAliasRegex = regexp.MustCompile("[^A-Z0-9-]") + +func sanitizeNetworkAlias(ctx context.Context, original string) string { + sanitized := sanitizeNetworkAliasRegex.ReplaceAllString(strings.ToUpper(original), "_") + if sanitized != original { + logger := common.Logger(ctx) + logger.Infof("The network alias is %s (sanitized version of %s)", original, sanitized) + } + return sanitized +} + func (rc *RunContext) prepareJobContainer(ctx context.Context) error { logger := common.Logger(ctx) image := rc.platformImage(ctx) @@ -492,7 +503,7 @@ func (rc *RunContext) prepareJobContainer(ctx context.Context) error { Platform: rc.Config.ContainerArchitecture, AutoRemove: rc.Config.AutoRemove, NetworkMode: networkName, - NetworkAliases: []string{serviceID}, + NetworkAliases: []string{sanitizeNetworkAlias(ctx, serviceID)}, ExposedPorts: exposedPorts, PortBindings: portBindings, ValidVolumes: rc.Config.ValidVolumes, @@ -547,7 +558,7 @@ func (rc *RunContext) prepareJobContainer(ctx context.Context) error { ToolCache: rc.getToolCache(ctx), Mounts: mounts, NetworkMode: networkName, - NetworkAliases: []string{rc.Name}, + NetworkAliases: []string{sanitizeNetworkAlias(ctx, rc.Name)}, Binds: binds, Stdout: logWriter, Stderr: logWriter, diff --git a/act/runner/run_context_test.go b/act/runner/run_context_test.go index 48608684..0c2a3c86 100644 --- a/act/runner/run_context_test.go +++ b/act/runner/run_context_test.go @@ -711,6 +711,14 @@ func Test_createSimpleContainerName(t *testing.T) { } } +func TestSanitizeNetworkAlias(t *testing.T) { + same := "SAME" + assert.Equal(t, same, sanitizeNetworkAlias(context.Background(), same)) + original := "OR.IGIN'A-L" + sanitized := "OR_IGIN_A-L" + assert.Equal(t, sanitized, sanitizeNetworkAlias(context.Background(), original)) +} + func TestPrepareJobContainer(t *testing.T) { yaml := ` on: