integration: reuse the prebuilt image for mock OIDC

Updates #3522
This commit is contained in:
Kristoffer Dalby
2026-10-07 15:24:04 +00:00
parent 0e20065f6d
commit b35dd2238e
+35 -10
View File
@@ -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.