From b35dd2238efe271a49ee27fe96edf203245ab1ec Mon Sep 17 00:00:00 2001 From: Kristoffer Dalby Date: Wed, 7 Oct 2026 15:24:04 +0000 Subject: [PATCH] integration: reuse the prebuilt image for mock OIDC Updates #3522 --- integration/scenario.go | 45 ++++++++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/integration/scenario.go b/integration/scenario.go index 73eb73f2a..f6dd3da53 100644 --- a/integration/scenario.go +++ b/integration/scenario.go @@ -24,6 +24,7 @@ import ( clientv1 "github.com/juanfont/headscale/gen/client/v1" "github.com/juanfont/headscale/hscontrol/capver" "github.com/juanfont/headscale/hscontrol/types" + "github.com/juanfont/headscale/hscontrol/util" "github.com/juanfont/headscale/integration/dockertestutil" "github.com/juanfont/headscale/integration/dsic" "github.com/juanfont/headscale/integration/hsic" @@ -51,9 +52,11 @@ const ( var usePostgresForTest = envknob.Bool("HEADSCALE_INTEGRATION_POSTGRES") var ( - errNoHeadscaleAvailable = errors.New("no headscale available") - errNoUserAvailable = errors.New("no user available") - errNoClientFound = errors.New("client not found") + errNoHeadscaleAvailable = errors.New("no headscale available") + errNoUserAvailable = errors.New("no user available") + errNoClientFound = errors.New("client not found") + errInvalidMockOIDCImage = errors.New("invalid HEADSCALE_INTEGRATION_HEADSCALE_IMAGE format, expected repository:tag") + errMockOIDCImageRequiredInCI = errors.New("HEADSCALE_INTEGRATION_HEADSCALE_IMAGE must be set for mock OIDC in CI") // AllVersions represents a list of Tailscale versions the suite // uses to test compatibility with the [ControlServer]. @@ -1638,16 +1641,38 @@ func (s *Scenario) runMockOIDC(accessTTL time.Duration, users []mockoidc.MockUse // Add integration test labels if running under hi tool dockertestutil.DockerAddIntegrationLabels(mockOidcOptions, "oidc") - if pmockoidc, err := s.pool.BuildAndRunWithBuildOptions( //nolint:noinlineerr - headscaleBuildOptions, - mockOidcOptions, - dockertestutil.DockerRestartPolicy, - ); err == nil { - s.mockOIDC.r = pmockoidc + var container *dockertest.Resource + + // CI already built and loaded the Headscale image, including its mockoidc command. + // Reuse it instead of downloading dependencies and rebuilding for every OIDC test. + if prebuiltImage := os.Getenv("HEADSCALE_INTEGRATION_HEADSCALE_IMAGE"); prebuiltImage != "" { + repo, tag, ok := strings.Cut(prebuiltImage, ":") + if !ok || repo == "" || tag == "" { + return errInvalidMockOIDCImage + } + + mockOidcOptions.Repository = repo + mockOidcOptions.Tag = tag + container, err = s.pool.RunWithOptions( + mockOidcOptions, + dockertestutil.DockerRestartPolicy, + ) + } else if util.IsCI() { + return errMockOIDCImageRequiredInCI } else { - return err + container, err = s.pool.BuildAndRunWithBuildOptions( + headscaleBuildOptions, + mockOidcOptions, + dockertestutil.DockerRestartPolicy, + ) } + if err != nil { + return fmt.Errorf("starting mock OIDC container: %w", err) + } + + s.mockOIDC.r = container + // headscale needs to set up the provider with a specific // IP addr to ensure we get the correct config from the well-known // endpoint.