e2e: Add new option to test rootless docker (#1742)
Related to #1644 Signed-off-by: Yusuke Kuoka <ykuoka@gmail.com> Signed-off-by: Yusuke Kuoka <ykuoka@gmail.com>
This commit is contained in:
		
							parent
							
								
									0cac005ab2
								
							
						
					
					
						commit
						ea94b3cc5b
					
				|  | @ -56,7 +56,7 @@ spec: | ||||||
| 
 | 
 | ||||||
|       # # Uncomment the below to enable the kubernetes container mode |       # # Uncomment the below to enable the kubernetes container mode | ||||||
|       # # See https://github.com/actions-runner-controller/actions-runner-controller#runner-with-k8s-jobs |       # # See https://github.com/actions-runner-controller/actions-runner-controller#runner-with-k8s-jobs | ||||||
|       containerMode: kubernetes |       containerMode: ${RUNNER_CONTAINER_MODE} | ||||||
|       workVolumeClaimTemplate: |       workVolumeClaimTemplate: | ||||||
|         accessModes: |         accessModes: | ||||||
|         - ReadWriteOnce |         - ReadWriteOnce | ||||||
|  |  | ||||||
|  | @ -123,10 +123,18 @@ func TestE2E(t *testing.T) { | ||||||
| 			}) | 			}) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		if t.Failed() { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		t.Run("install actions-runner-controller v0.24.1", func(t *testing.T) { | 		t.Run("install actions-runner-controller v0.24.1", func(t *testing.T) { | ||||||
| 			env.installActionsRunnerController(t, "summerwind/actions-runner-controller", "v0.24.1", testID) | 			env.installActionsRunnerController(t, "summerwind/actions-runner-controller", "v0.24.1", testID) | ||||||
| 		}) | 		}) | ||||||
| 
 | 
 | ||||||
|  | 		if t.Failed() { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		t.Run("install argo-tunnel", func(t *testing.T) { | 		t.Run("install argo-tunnel", func(t *testing.T) { | ||||||
| 			env.installArgoTunnel(t) | 			env.installArgoTunnel(t) | ||||||
| 		}) | 		}) | ||||||
|  | @ -137,6 +145,10 @@ func TestE2E(t *testing.T) { | ||||||
| 			}) | 			}) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		if t.Failed() { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		t.Run("deploy runners", func(t *testing.T) { | 		t.Run("deploy runners", func(t *testing.T) { | ||||||
| 			env.deploy(t, RunnerSets, testID) | 			env.deploy(t, RunnerSets, testID) | ||||||
| 		}) | 		}) | ||||||
|  | @ -147,6 +159,10 @@ func TestE2E(t *testing.T) { | ||||||
| 			}) | 			}) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		if t.Failed() { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		t.Run("install edge actions-runner-controller", func(t *testing.T) { | 		t.Run("install edge actions-runner-controller", func(t *testing.T) { | ||||||
| 			env.installActionsRunnerController(t, vars.controllerImageRepo, vars.controllerImageTag, testID) | 			env.installActionsRunnerController(t, vars.controllerImageRepo, vars.controllerImageTag, testID) | ||||||
| 		}) | 		}) | ||||||
|  | @ -183,10 +199,18 @@ func TestE2E(t *testing.T) { | ||||||
| 			}) | 			}) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		if t.Failed() { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		t.Run("install actions-runner-controller v0.24.1", func(t *testing.T) { | 		t.Run("install actions-runner-controller v0.24.1", func(t *testing.T) { | ||||||
| 			env.installActionsRunnerController(t, "summerwind/actions-runner-controller", "v0.24.1", testID) | 			env.installActionsRunnerController(t, "summerwind/actions-runner-controller", "v0.24.1", testID) | ||||||
| 		}) | 		}) | ||||||
| 
 | 
 | ||||||
|  | 		if t.Failed() { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		t.Run("install argo-tunnel", func(t *testing.T) { | 		t.Run("install argo-tunnel", func(t *testing.T) { | ||||||
| 			env.installArgoTunnel(t) | 			env.installArgoTunnel(t) | ||||||
| 		}) | 		}) | ||||||
|  | @ -197,6 +221,10 @@ func TestE2E(t *testing.T) { | ||||||
| 			}) | 			}) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		if t.Failed() { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		t.Run("deploy runners", func(t *testing.T) { | 		t.Run("deploy runners", func(t *testing.T) { | ||||||
| 			env.deploy(t, RunnerDeployments, testID) | 			env.deploy(t, RunnerDeployments, testID) | ||||||
| 		}) | 		}) | ||||||
|  | @ -207,6 +235,10 @@ func TestE2E(t *testing.T) { | ||||||
| 			}) | 			}) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		if t.Failed() { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		t.Run("install edge actions-runner-controller", func(t *testing.T) { | 		t.Run("install edge actions-runner-controller", func(t *testing.T) { | ||||||
| 			env.installActionsRunnerController(t, vars.controllerImageRepo, vars.controllerImageTag, testID) | 			env.installActionsRunnerController(t, vars.controllerImageRepo, vars.controllerImageTag, testID) | ||||||
| 		}) | 		}) | ||||||
|  | @ -252,6 +284,8 @@ type env struct { | ||||||
| 	scaleDownDelaySecondsAfterScaleOut          int64 | 	scaleDownDelaySecondsAfterScaleOut          int64 | ||||||
| 	minReplicas                                 int64 | 	minReplicas                                 int64 | ||||||
| 	dockerdWithinRunnerContainer                bool | 	dockerdWithinRunnerContainer                bool | ||||||
|  | 	rootlessDocker                              bool | ||||||
|  | 	containerMode                               string | ||||||
| 	remoteKubeconfig                            string | 	remoteKubeconfig                            string | ||||||
| 	imagePullSecretName                         string | 	imagePullSecretName                         string | ||||||
| 	imagePullPolicy                             string | 	imagePullPolicy                             string | ||||||
|  | @ -265,6 +299,7 @@ type vars struct { | ||||||
| 
 | 
 | ||||||
| 	runnerImageRepo             string | 	runnerImageRepo             string | ||||||
| 	runnerDindImageRepo         string | 	runnerDindImageRepo         string | ||||||
|  | 	runnerRootlessDindImageRepo string | ||||||
| 
 | 
 | ||||||
| 	prebuildImages []testing.ContainerImage | 	prebuildImages []testing.ContainerImage | ||||||
| 	builds         []testing.DockerBuild | 	builds         []testing.DockerBuild | ||||||
|  | @ -283,15 +318,18 @@ func buildVars(repo string) vars { | ||||||
| 		controllerImage             = testing.Img(controllerImageRepo, controllerImageTag) | 		controllerImage             = testing.Img(controllerImageRepo, controllerImageTag) | ||||||
| 		runnerImageRepo             = repo + "/actions-runner" | 		runnerImageRepo             = repo + "/actions-runner" | ||||||
| 		runnerDindImageRepo         = repo + "/actions-runner-dind" | 		runnerDindImageRepo         = repo + "/actions-runner-dind" | ||||||
|  | 		runnerRootlessDindImageRepo = repo + "/actions-runner-rootless-dind" | ||||||
| 		runnerImageTag              = "e2e" | 		runnerImageTag              = "e2e" | ||||||
| 		runnerImage                 = testing.Img(runnerImageRepo, runnerImageTag) | 		runnerImage                 = testing.Img(runnerImageRepo, runnerImageTag) | ||||||
| 		runnerDindImage             = testing.Img(runnerDindImageRepo, runnerImageTag) | 		runnerDindImage             = testing.Img(runnerDindImageRepo, runnerImageTag) | ||||||
|  | 		runnerRootlessDindImage     = testing.Img(runnerRootlessDindImageRepo, runnerImageTag) | ||||||
| 	) | 	) | ||||||
| 
 | 
 | ||||||
| 	var vs vars | 	var vs vars | ||||||
| 
 | 
 | ||||||
| 	vs.controllerImageRepo, vs.controllerImageTag = controllerImageRepo, controllerImageTag | 	vs.controllerImageRepo, vs.controllerImageTag = controllerImageRepo, controllerImageTag | ||||||
| 	vs.runnerDindImageRepo = runnerDindImageRepo | 	vs.runnerDindImageRepo = runnerDindImageRepo | ||||||
|  | 	vs.runnerRootlessDindImageRepo = runnerRootlessDindImageRepo | ||||||
| 	vs.runnerImageRepo = runnerImageRepo | 	vs.runnerImageRepo = runnerImageRepo | ||||||
| 
 | 
 | ||||||
| 	// vs.controllerImage, vs.controllerImageTag
 | 	// vs.controllerImage, vs.controllerImageTag
 | ||||||
|  | @ -300,6 +338,7 @@ func buildVars(repo string) vars { | ||||||
| 		controllerImage, | 		controllerImage, | ||||||
| 		runnerImage, | 		runnerImage, | ||||||
| 		runnerDindImage, | 		runnerDindImage, | ||||||
|  | 		runnerRootlessDindImage, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	vs.builds = []testing.DockerBuild{ | 	vs.builds = []testing.DockerBuild{ | ||||||
|  | @ -331,6 +370,17 @@ func buildVars(repo string) vars { | ||||||
| 			Image:        runnerDindImage, | 			Image:        runnerDindImage, | ||||||
| 			EnableBuildX: true, | 			EnableBuildX: true, | ||||||
| 		}, | 		}, | ||||||
|  | 		{ | ||||||
|  | 			Dockerfile: "../../runner/actions-runner-dind-rootless.dockerfile", | ||||||
|  | 			Args: []testing.BuildArg{ | ||||||
|  | 				{ | ||||||
|  | 					Name:  "RUNNER_VERSION", | ||||||
|  | 					Value: "2.294.0", | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
|  | 			Image:        runnerRootlessDindImage, | ||||||
|  | 			EnableBuildX: true, | ||||||
|  | 		}, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	vs.commonScriptEnv = []string{ | 	vs.commonScriptEnv = []string{ | ||||||
|  | @ -397,6 +447,16 @@ func initTestEnv(t *testing.T, k8sMinorVer string, vars vars) *env { | ||||||
| 		panic(fmt.Sprintf("unable to parse bool from TEST_RUNNER_DOCKERD_WITHIN_RUNNER_CONTAINER: %v", err)) | 		panic(fmt.Sprintf("unable to parse bool from TEST_RUNNER_DOCKERD_WITHIN_RUNNER_CONTAINER: %v", err)) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	e.rootlessDocker, err = strconv.ParseBool(testing.Getenv(t, "TEST_RUNNER_ROOTLESS_DOCKER", "false")) | ||||||
|  | 	if err != nil { | ||||||
|  | 		panic(fmt.Sprintf("unable to parse bool from TEST_RUNNER_ROOTLESS_DOCKER: %v", err)) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	e.containerMode = testing.Getenv(t, "TEST_CONTAINER_MODE", "") | ||||||
|  | 	if err != nil { | ||||||
|  | 		panic(fmt.Sprintf("unable to parse bool from TEST_CONTAINER_MODE: %v", err)) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	return e | 	return e | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -527,13 +587,27 @@ func (e *env) do(t *testing.T, op string, kind DeployKind, testID string) { | ||||||
| 		fmt.Sprintf("REPO_RUNNER_MIN_REPLICAS=%d", e.minReplicas), | 		fmt.Sprintf("REPO_RUNNER_MIN_REPLICAS=%d", e.minReplicas), | ||||||
| 		fmt.Sprintf("ORG_RUNNER_MIN_REPLICAS=%d", e.minReplicas), | 		fmt.Sprintf("ORG_RUNNER_MIN_REPLICAS=%d", e.minReplicas), | ||||||
| 		fmt.Sprintf("ENTERPRISE_RUNNER_MIN_REPLICAS=%d", e.minReplicas), | 		fmt.Sprintf("ENTERPRISE_RUNNER_MIN_REPLICAS=%d", e.minReplicas), | ||||||
|  | 		"RUNNER_CONTAINER_MODE=" + e.containerMode, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if e.dockerdWithinRunnerContainer && e.containerMode == "kubernetes" { | ||||||
|  | 		t.Fatalf("TEST_RUNNER_DOCKERD_WITHIN_RUNNER_CONTAINER cannot be set along with TEST_CONTAINER_MODE=kubernetes") | ||||||
|  | 		t.FailNow() | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if e.dockerdWithinRunnerContainer { | 	if e.dockerdWithinRunnerContainer { | ||||||
| 		varEnv = append(varEnv, | 		varEnv = append(varEnv, | ||||||
| 			"RUNNER_DOCKERD_WITHIN_RUNNER_CONTAINER=true", | 			"RUNNER_DOCKERD_WITHIN_RUNNER_CONTAINER=true", | ||||||
|  | 		) | ||||||
|  | 		if e.rootlessDocker { | ||||||
|  | 			varEnv = append(varEnv, | ||||||
|  | 				"RUNNER_NAME="+e.vars.runnerRootlessDindImageRepo, | ||||||
|  | 			) | ||||||
|  | 		} else { | ||||||
|  | 			varEnv = append(varEnv, | ||||||
| 				"RUNNER_NAME="+e.vars.runnerDindImageRepo, | 				"RUNNER_NAME="+e.vars.runnerDindImageRepo, | ||||||
| 			) | 			) | ||||||
|  | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		varEnv = append(varEnv, | 		varEnv = append(varEnv, | ||||||
| 			"RUNNER_DOCKERD_WITHIN_RUNNER_CONTAINER=false", | 			"RUNNER_DOCKERD_WITHIN_RUNNER_CONTAINER=false", | ||||||
|  | @ -583,7 +657,7 @@ func (e *env) createControllerNamespaceAndServiceAccount(t *testing.T) { | ||||||
| func (e *env) installActionsWorkflow(t *testing.T, kind DeployKind, testID string) { | func (e *env) installActionsWorkflow(t *testing.T, kind DeployKind, testID string) { | ||||||
| 	t.Helper() | 	t.Helper() | ||||||
| 
 | 
 | ||||||
| 	installActionsWorkflow(t, e.testName+" "+testID, e.runnerLabel(testID), testResultCMNamePrefix, e.repoToCommit, kind, e.testJobs(testID)) | 	installActionsWorkflow(t, e.testName+" "+testID, e.runnerLabel(testID), testResultCMNamePrefix, e.repoToCommit, kind, e.testJobs(testID), !e.rootlessDocker) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (e *env) testJobs(testID string) []job { | func (e *env) testJobs(testID string) []job { | ||||||
|  | @ -624,7 +698,8 @@ func createTestJobs(id, testResultCMNamePrefix string, numJobs int) []job { | ||||||
| 
 | 
 | ||||||
| const Branch = "main" | const Branch = "main" | ||||||
| 
 | 
 | ||||||
| func installActionsWorkflow(t *testing.T, testName, runnerLabel, testResultCMNamePrefix, testRepo string, kind DeployKind, testJobs []job) { | // useSudo also implies rootful docker and the use of buildx cache export/import
 | ||||||
|  | func installActionsWorkflow(t *testing.T, testName, runnerLabel, testResultCMNamePrefix, testRepo string, kind DeployKind, testJobs []job, useSudo bool) { | ||||||
| 	t.Helper() | 	t.Helper() | ||||||
| 
 | 
 | ||||||
| 	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) | 	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) | ||||||
|  | @ -655,11 +730,41 @@ func installActionsWorkflow(t *testing.T, testName, runnerLabel, testResultCMNam | ||||||
| 			}, | 			}, | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		var sudo string | ||||||
|  | 		if useSudo { | ||||||
|  | 			sudo = "sudo " | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		if !kubernetesContainerMode { | 		if !kubernetesContainerMode { | ||||||
| 			if kind == RunnerDeployments { | 			if kind == RunnerDeployments { | ||||||
| 				steps = append(steps, | 				steps = append(steps, | ||||||
| 					testing.Step{ | 					testing.Step{ | ||||||
| 						Run: "sudo mkdir -p \"${RUNNER_TOOL_CACHE}\" \"${HOME}/.cache\" \"/var/lib/docker\"", | 						Run: sudo + "mkdir -p \"${RUNNER_TOOL_CACHE}\" \"${HOME}/.cache\"", | ||||||
|  | 					}, | ||||||
|  | 				) | ||||||
|  | 
 | ||||||
|  | 				if useSudo { | ||||||
|  | 					steps = append(steps, | ||||||
|  | 						testing.Step{ | ||||||
|  | 							// This might be the easiest way to handle permissions without use of securityContext
 | ||||||
|  | 							// https://stackoverflow.com/questions/50156124/kubernetes-nfs-persistent-volumes-permission-denied#comment107483717_53186320
 | ||||||
|  | 							Run: sudo + "mkdir -p \"/var/lib/docker\"", | ||||||
|  | 						}, | ||||||
|  | 					) | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			steps = append(steps, | ||||||
|  | 				testing.Step{ | ||||||
|  | 					// This might be the easiest way to handle permissions without use of securityContext
 | ||||||
|  | 					// https://stackoverflow.com/questions/50156124/kubernetes-nfs-persistent-volumes-permission-denied#comment107483717_53186320
 | ||||||
|  | 					Run: sudo + "chmod 777 -R \"${RUNNER_TOOL_CACHE}\" \"${HOME}/.cache\"", | ||||||
|  | 				}, | ||||||
|  | 			) | ||||||
|  | 			if useSudo { | ||||||
|  | 				steps = append(steps, | ||||||
|  | 					testing.Step{ | ||||||
|  | 						Run: sudo + "chmod 777 -R \"/var/lib/docker\"", | ||||||
| 					}, | 					}, | ||||||
| 				) | 				) | ||||||
| 			} | 			} | ||||||
|  | @ -668,12 +773,12 @@ func installActionsWorkflow(t *testing.T, testName, runnerLabel, testResultCMNam | ||||||
| 				testing.Step{ | 				testing.Step{ | ||||||
| 					// This might be the easiest way to handle permissions without use of securityContext
 | 					// This might be the easiest way to handle permissions without use of securityContext
 | ||||||
| 					// https://stackoverflow.com/questions/50156124/kubernetes-nfs-persistent-volumes-permission-denied#comment107483717_53186320
 | 					// https://stackoverflow.com/questions/50156124/kubernetes-nfs-persistent-volumes-permission-denied#comment107483717_53186320
 | ||||||
| 					Run: "sudo chmod 777 -R \"${RUNNER_TOOL_CACHE}\" \"${HOME}/.cache\" \"/var/lib/docker\"", | 					Run: "ls -lah \"${RUNNER_TOOL_CACHE}\" \"${HOME}/.cache\"", | ||||||
| 				}, | 				}, | ||||||
| 				testing.Step{ | 				testing.Step{ | ||||||
| 					// This might be the easiest way to handle permissions without use of securityContext
 | 					// This might be the easiest way to handle permissions without use of securityContext
 | ||||||
| 					// https://stackoverflow.com/questions/50156124/kubernetes-nfs-persistent-volumes-permission-denied#comment107483717_53186320
 | 					// https://stackoverflow.com/questions/50156124/kubernetes-nfs-persistent-volumes-permission-denied#comment107483717_53186320
 | ||||||
| 					Run: "ls -lah \"${RUNNER_TOOL_CACHE}\" \"${HOME}/.cache\" \"/var/lib/docker\"", | 					Run: "ls -lah \"/var/lib/docker\" || echo ls failed.", | ||||||
| 				}, | 				}, | ||||||
| 				testing.Step{ | 				testing.Step{ | ||||||
| 					Uses: "actions/setup-go@v3", | 					Uses: "actions/setup-go@v3", | ||||||
|  | @ -694,6 +799,26 @@ func installActionsWorkflow(t *testing.T, testName, runnerLabel, testResultCMNam | ||||||
| 		) | 		) | ||||||
| 
 | 
 | ||||||
| 		if !kubernetesContainerMode { | 		if !kubernetesContainerMode { | ||||||
|  | 			setupBuildXActionWith := &testing.With{ | ||||||
|  | 				BuildkitdFlags: "--debug", | ||||||
|  | 				Endpoint:       "mycontext", | ||||||
|  | 				// As the consequence of setting `install: false`, it doesn't install buildx as an alias to `docker build`
 | ||||||
|  | 				// so we need to use `docker buildx build` in the next step
 | ||||||
|  | 				Install: false, | ||||||
|  | 			} | ||||||
|  | 			var dockerBuildCache, dockerfile string | ||||||
|  | 			if useSudo { | ||||||
|  | 				// This needs to be set only when rootful docker mode.
 | ||||||
|  | 				// When rootless, we need to use the `docker` buildx driver, which doesn't support cache export
 | ||||||
|  | 				// so we end up with the below error on docker-build:
 | ||||||
|  | 				//   error: cache export feature is currently not supported for docker driver. Please switch to a different driver (eg. "docker buildx create --use")
 | ||||||
|  | 				dockerBuildCache = "--cache-from=type=local,src=/home/runner/.cache/buildx " + | ||||||
|  | 					"--cache-to=type=local,dest=/home/runner/.cache/buildx-new,mode=max " | ||||||
|  | 				dockerfile = "Dockerfile" | ||||||
|  | 			} else { | ||||||
|  | 				setupBuildXActionWith.Driver = "docker" | ||||||
|  | 				dockerfile = "Dockerfile.nocache" | ||||||
|  | 			} | ||||||
| 			steps = append(steps, | 			steps = append(steps, | ||||||
| 				testing.Step{ | 				testing.Step{ | ||||||
| 					// https://github.com/docker/buildx/issues/413#issuecomment-710660155
 | 					// https://github.com/docker/buildx/issues/413#issuecomment-710660155
 | ||||||
|  | @ -707,20 +832,17 @@ func installActionsWorkflow(t *testing.T, testName, runnerLabel, testResultCMNam | ||||||
| 				testing.Step{ | 				testing.Step{ | ||||||
| 					Name: "Set up Docker Buildx", | 					Name: "Set up Docker Buildx", | ||||||
| 					Uses: "docker/setup-buildx-action@v1", | 					Uses: "docker/setup-buildx-action@v1", | ||||||
| 					With: &testing.With{ | 					With: setupBuildXActionWith, | ||||||
| 						BuildkitdFlags: "--debug", |  | ||||||
| 						Endpoint:       "mycontext", |  | ||||||
| 						// As the consequence of setting `install: false`, it doesn't install buildx as an alias to `docker build`
 |  | ||||||
| 						// so we need to use `docker buildx build` in the next step
 |  | ||||||
| 						Install: false, |  | ||||||
| 					}, |  | ||||||
| 				}, | 				}, | ||||||
| 				testing.Step{ | 				testing.Step{ | ||||||
| 					Run: "docker buildx build --platform=linux/amd64 " + | 					Run: "docker buildx build --platform=linux/amd64 " + | ||||||
| 						"--cache-from=type=local,src=/home/runner/.cache/buildx " + | 						dockerBuildCache + | ||||||
| 						"--cache-to=type=local,dest=/home/runner/.cache/buildx-new,mode=max " + | 						fmt.Sprintf("-f %s .", dockerfile), | ||||||
| 						".", |  | ||||||
| 				}, | 				}, | ||||||
|  | 			) | ||||||
|  | 
 | ||||||
|  | 			if useSudo { | ||||||
|  | 				steps = append(steps, | ||||||
| 					testing.Step{ | 					testing.Step{ | ||||||
| 						// https://github.com/docker/build-push-action/blob/master/docs/advanced/cache.md#local-cache
 | 						// https://github.com/docker/build-push-action/blob/master/docs/advanced/cache.md#local-cache
 | ||||||
| 						// See https://github.com/moby/buildkit/issues/1896 for why this is needed
 | 						// See https://github.com/moby/buildkit/issues/1896 for why this is needed
 | ||||||
|  | @ -729,6 +851,10 @@ func installActionsWorkflow(t *testing.T, testName, runnerLabel, testResultCMNam | ||||||
| 					testing.Step{ | 					testing.Step{ | ||||||
| 						Run: "ls -lah /home/runner/.cache/*", | 						Run: "ls -lah /home/runner/.cache/*", | ||||||
| 					}, | 					}, | ||||||
|  | 				) | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			steps = append(steps, | ||||||
| 				testing.Step{ | 				testing.Step{ | ||||||
| 					Uses: "azure/setup-kubectl@v1", | 					Uses: "azure/setup-kubectl@v1", | ||||||
| 					With: &testing.With{ | 					With: &testing.With{ | ||||||
|  |  | ||||||
|  | @ -52,4 +52,7 @@ type With struct { | ||||||
| 	// This can be either the address or the context name
 | 	// This can be either the address or the context name
 | ||||||
| 	// https://github.com/docker/buildx/blob/master/docs/reference/buildx_create.md#description
 | 	// https://github.com/docker/buildx/blob/master/docs/reference/buildx_create.md#description
 | ||||||
| 	Endpoint string `json:"endpoint,omitempty"` | 	Endpoint string `json:"endpoint,omitempty"` | ||||||
|  | 	// Needs to be "docker" in rootless mode
 | ||||||
|  | 	// https://stackoverflow.com/questions/66142872/how-to-solve-error-with-rootless-docker-in-github-actions-self-hosted-runner-wr
 | ||||||
|  | 	Driver string `json:"driver,omitempty"` | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue