diff --git a/api/v1alpha1/runner_types.go b/api/v1alpha1/runner_types.go index 25437987..5ced5fcc 100644 --- a/api/v1alpha1/runner_types.go +++ b/api/v1alpha1/runner_types.go @@ -181,6 +181,9 @@ func (rs *RunnerSpec) ValidateRepository() error { // RunnerStatus defines the observed state of Runner type RunnerStatus struct { + // Turns true only if the runner pod is ready. + // +optional + Ready bool `json:"ready"` // +optional Registration RunnerStatusRegistration `json:"registration"` // +optional diff --git a/charts/actions-runner-controller/crds/actions.summerwind.dev_runners.yaml b/charts/actions-runner-controller/crds/actions.summerwind.dev_runners.yaml index 3f85eb1d..01bf48e4 100644 --- a/charts/actions-runner-controller/crds/actions.summerwind.dev_runners.yaml +++ b/charts/actions-runner-controller/crds/actions.summerwind.dev_runners.yaml @@ -5126,6 +5126,9 @@ spec: type: string phase: type: string + ready: + description: Turns true only if the runner pod is ready. + type: boolean reason: type: string registration: diff --git a/config/crd/bases/actions.summerwind.dev_runners.yaml b/config/crd/bases/actions.summerwind.dev_runners.yaml index 3f85eb1d..01bf48e4 100644 --- a/config/crd/bases/actions.summerwind.dev_runners.yaml +++ b/config/crd/bases/actions.summerwind.dev_runners.yaml @@ -5126,6 +5126,9 @@ spec: type: string phase: type: string + ready: + description: Turns true only if the runner pod is ready. + type: boolean reason: type: string registration: diff --git a/controllers/runner_controller.go b/controllers/runner_controller.go index 907bcc9f..78bfb951 100644 --- a/controllers/runner_controller.go +++ b/controllers/runner_controller.go @@ -132,7 +132,9 @@ func (r *RunnerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr phase = "Created" } - if runner.Status.Phase != phase { + ready := runnerPodReady(&pod) + + if runner.Status.Phase != phase || runner.Status.Ready != ready { if pod.Status.Phase == corev1.PodRunning { // Seeing this message, you can expect the runner to become `Running` soon. log.V(1).Info( @@ -143,6 +145,7 @@ func (r *RunnerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr updated := runner.DeepCopy() updated.Status.Phase = phase + updated.Status.Ready = ready updated.Status.Reason = pod.Status.Reason updated.Status.Message = pod.Status.Message @@ -155,6 +158,18 @@ func (r *RunnerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr return ctrl.Result{}, nil } +func runnerPodReady(pod *corev1.Pod) bool { + for _, c := range pod.Status.Conditions { + if c.Type != corev1.PodReady { + continue + } + + return c.Status == corev1.ConditionTrue + } + + return false +} + func runnerContainerExitCode(pod *corev1.Pod) *int32 { for _, status := range pod.Status.ContainerStatuses { if status.Name != containerName { diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go index 293051c3..0d6791c3 100644 --- a/test/e2e/e2e_test.go +++ b/test/e2e/e2e_test.go @@ -37,13 +37,23 @@ var ( }, { Dockerfile: "../../runner/Dockerfile", - Args: []testing.BuildArg{}, - Image: runnerImage, + Args: []testing.BuildArg{ + { + Name: "RUNNER_VERSION", + Value: "2.289.2", + }, + }, + Image: runnerImage, }, { Dockerfile: "../../runner/Dockerfile.dindrunner", - Args: []testing.BuildArg{}, - Image: runnerDindImage, + Args: []testing.BuildArg{ + { + Name: "RUNNER_VERSION", + Value: "2.289.2", + }, + }, + Image: runnerDindImage, }, } @@ -58,7 +68,7 @@ var ( } commonScriptEnv = []string{ - "SYNC_PERIOD=" + "10s", + "SYNC_PERIOD=" + "30m", "NAME=" + controllerImageRepo, "VERSION=" + controllerImageTag, "RUNNER_TAG=" + runnerImageTag,