Compare commits

..

1 Commits

Author SHA1 Message Date
Nikola Jokic
7f15ae7f05 extending ephemeral runner statuses 2025-11-10 14:20:27 +01:00
27 changed files with 148 additions and 132 deletions

View File

@@ -63,7 +63,7 @@ jobs:
python-version: "3.11" python-version: "3.11"
- name: Set up chart-testing - name: Set up chart-testing
uses: helm/chart-testing-action@6ec842c01de15ebb84c8627d2744a0c2f2755c9f uses: helm/chart-testing-action@0d28d3144d3a25ea2cc349d6e59901c4ff469b3b
- name: Run chart-testing (list-changed) - name: Run chart-testing (list-changed)
id: list-changed id: list-changed
@@ -79,7 +79,7 @@ jobs:
- name: Create kind cluster - name: Create kind cluster
if: steps.list-changed.outputs.changed == 'true' if: steps.list-changed.outputs.changed == 'true'
uses: helm/kind-action@92086f6be054225fa813e0a4b13787fc9088faab uses: helm/kind-action@a1b0e391336a6ee6713a0583f8c6240d70863de3
# We need cert-manager already installed in the cluster because we assume the CRDs exist # We need cert-manager already installed in the cluster because we assume the CRDs exist
- name: Install cert-manager - name: Install cert-manager

View File

@@ -19,7 +19,7 @@ env:
PUSH_TO_REGISTRIES: true PUSH_TO_REGISTRIES: true
TARGET_ORG: actions-runner-controller TARGET_ORG: actions-runner-controller
TARGET_WORKFLOW: release-runners.yaml TARGET_WORKFLOW: release-runners.yaml
DOCKER_VERSION: 28.0.4 DOCKER_VERSION: 24.0.7
concurrency: concurrency:
group: ${{ github.workflow }} group: ${{ github.workflow }}

View File

@@ -55,7 +55,7 @@ jobs:
python-version: "3.11" python-version: "3.11"
- name: Set up chart-testing - name: Set up chart-testing
uses: helm/chart-testing-action@6ec842c01de15ebb84c8627d2744a0c2f2755c9f uses: helm/chart-testing-action@0d28d3144d3a25ea2cc349d6e59901c4ff469b3b
- name: Run chart-testing (list-changed) - name: Run chart-testing (list-changed)
id: list-changed id: list-changed
@@ -70,7 +70,7 @@ jobs:
ct lint --config charts/.ci/ct-config.yaml ct lint --config charts/.ci/ct-config.yaml
- name: Create kind cluster - name: Create kind cluster
uses: helm/kind-action@92086f6be054225fa813e0a4b13787fc9088faab uses: helm/kind-action@a1b0e391336a6ee6713a0583f8c6240d70863de3
if: steps.list-changed.outputs.changed == 'true' if: steps.list-changed.outputs.changed == 'true'
# We need cert-manager already installed in the cluster because we assume the CRDs exist # We need cert-manager already installed in the cluster because we assume the CRDs exist

View File

@@ -984,7 +984,7 @@ jobs:
echo "5 pods are up!" echo "5 pods are up!"
break break
fi fi
if [[ "$count" -ge 30 ]]; then if [[ "$count" -ge 12 ]]; then
echo "Timeout waiting for 5 pods to be created" echo "Timeout waiting for 5 pods to be created"
exit 1 exit 1
fi fi

View File

@@ -72,7 +72,7 @@ jobs:
echo "repository_owner=$(echo ${{ github.repository_owner }} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_OUTPUT echo "repository_owner=$(echo ${{ github.repository_owner }} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_OUTPUT
- name: Set up QEMU - name: Set up QEMU
uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435

View File

@@ -51,7 +51,7 @@ jobs:
python-version: "3.11" python-version: "3.11"
- name: Set up chart-testing - name: Set up chart-testing
uses: helm/chart-testing-action@6ec842c01de15ebb84c8627d2744a0c2f2755c9f uses: helm/chart-testing-action@0d28d3144d3a25ea2cc349d6e59901c4ff469b3b
- name: Run chart-testing (list-changed) - name: Run chart-testing (list-changed)
id: list-changed id: list-changed
@@ -88,7 +88,7 @@ jobs:
cache-to: type=gha,mode=max cache-to: type=gha,mode=max
- name: Create kind cluster - name: Create kind cluster
uses: helm/kind-action@92086f6be054225fa813e0a4b13787fc9088faab uses: helm/kind-action@a1b0e391336a6ee6713a0583f8c6240d70863de3
if: steps.list-changed.outputs.changed == 'true' if: steps.list-changed.outputs.changed == 'true'
with: with:
cluster_name: chart-testing cluster_name: chart-testing

View File

@@ -110,7 +110,7 @@ jobs:
echo "repository_owner=$(echo ${{ github.repository_owner }} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_OUTPUT echo "repository_owner=$(echo ${{ github.repository_owner }} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_OUTPUT
- name: Set up QEMU - name: Set up QEMU
uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435

View File

@@ -48,7 +48,7 @@ jobs:
go-version-file: "go.mod" go-version-file: "go.mod"
cache: false cache: false
- name: golangci-lint - name: golangci-lint
uses: golangci/golangci-lint-action@0a35821d5c230e903fcfe077583637dea1b27b47 uses: golangci/golangci-lint-action@4afd733a84b1f43292c63897423277bb7f4313a9
with: with:
only-new-issues: true only-new-issues: true
version: v2.5.0 version: v2.5.0
@@ -78,7 +78,7 @@ jobs:
run: git diff --exit-code run: git diff --exit-code
- name: Install kubebuilder - name: Install kubebuilder
run: | run: |
curl -D headers.txt -fsL "https://storage.googleapis.com/kubebuilder-tools/kubebuilder-tools-1.30.0-linux-amd64.tar.gz" -o kubebuilder-tools curl -D headers.txt -fsL "https://storage.googleapis.com/kubebuilder-tools/kubebuilder-tools-1.26.1-linux-amd64.tar.gz" -o kubebuilder-tools
echo "$(grep -i etag headers.txt -m 1 | cut -d'"' -f2) kubebuilder-tools" > sum echo "$(grep -i etag headers.txt -m 1 | cut -d'"' -f2) kubebuilder-tools" > sum
md5sum -c sum md5sum -c sum
tar -zvxf kubebuilder-tools tar -zvxf kubebuilder-tools

View File

@@ -48,7 +48,7 @@ type EphemeralRunner struct {
} }
func (er *EphemeralRunner) IsDone() bool { func (er *EphemeralRunner) IsDone() bool {
return er.Status.Phase == corev1.PodSucceeded || er.Status.Phase == corev1.PodFailed return er.Status.Phase == EphemeralRunnerSucceeded || er.Status.Phase == EphemeralRunnerFailed
} }
func (er *EphemeralRunner) HasJob() bool { func (er *EphemeralRunner) HasJob() bool {
@@ -125,6 +125,40 @@ type EphemeralRunnerSpec struct {
corev1.PodTemplateSpec `json:",inline"` corev1.PodTemplateSpec `json:",inline"`
} }
// EphemeralRunnerPhase is a label for the condition of an EphemeralRunner at the current time.
// +kubebuilder:validation:Enum=Pending;Running;Restarting;Succeeded;Failed;Aborted
type EphemeralRunnerPhase string
const (
// EphemeralRunnerPending is the stage where the ephemeral runner is about to start.
EphemeralRunnerPending EphemeralRunnerPhase = "Pending"
// EphemeralRunnerRunning is the stage where the ephemeral runner is running and ready to accept the job.
EphemeralRunnerRunning EphemeralRunnerPhase = "Running"
// EphemeralRunnerRestarting is the stage where the ephemeral runner pod stopped, so the ephemeral runner should restart it
EphemeralRunnerRestarting EphemeralRunnerPhase = "Restarting"
// EphemeralRunnerSucceeded is the stage where the ephemeral runner finished running and exited with exit code 0.
EphemeralRunnerSucceeded EphemeralRunnerPhase = "Succeeded"
// EphemeralRunnerFailed means that the ephemeral runner finished running and exited with a non-zero exit code.
EphemeralRunnerFailed EphemeralRunnerPhase = "Failed"
// EphemeralRunnerAborted means that the ephemeral runner failed to start due to unrecoverable failure, and will be left as is for manual inspection.
EphemeralRunnerAborted EphemeralRunnerPhase = "Aborted"
)
func EphemeralRunnerPhaseFromPodPhase(podPhase corev1.PodPhase) EphemeralRunnerPhase {
switch podPhase {
case corev1.PodPending:
return EphemeralRunnerPending
case corev1.PodRunning:
return EphemeralRunnerRunning
case corev1.PodSucceeded:
return EphemeralRunnerSucceeded
case corev1.PodFailed:
return EphemeralRunnerFailed
default:
return EphemeralRunnerPending
}
}
// EphemeralRunnerStatus defines the observed state of EphemeralRunner // EphemeralRunnerStatus defines the observed state of EphemeralRunner
type EphemeralRunnerStatus struct { type EphemeralRunnerStatus struct {
// Turns true only if the runner is online. // Turns true only if the runner is online.
@@ -140,7 +174,7 @@ type EphemeralRunnerStatus struct {
// The PodSucceded phase should be set only when confirmed that EphemeralRunner // The PodSucceded phase should be set only when confirmed that EphemeralRunner
// actually executed the job and has been removed from the service. // actually executed the job and has been removed from the service.
// +optional // +optional
Phase corev1.PodPhase `json:"phase,omitempty"` Phase EphemeralRunnerPhase `json:"phase,omitempty"`
// +optional // +optional
Reason string `json:"reason,omitempty"` Reason string `json:"reason,omitempty"`
// +optional // +optional

View File

@@ -8257,6 +8257,13 @@ spec:
The PodSucceded phase should be set only when confirmed that EphemeralRunner The PodSucceded phase should be set only when confirmed that EphemeralRunner
actually executed the job and has been removed from the service. actually executed the job and has been removed from the service.
enum:
- Pending
- Running
- Restarting
- Succeeded
- Failed
- Aborted
type: string type: string
ready: ready:
description: Turns true only if the runner is online. description: Turns true only if the runner is online.

View File

@@ -8257,6 +8257,13 @@ spec:
The PodSucceded phase should be set only when confirmed that EphemeralRunner The PodSucceded phase should be set only when confirmed that EphemeralRunner
actually executed the job and has been removed from the service. actually executed the job and has been removed from the service.
enum:
- Pending
- Running
- Restarting
- Succeeded
- Failed
- Aborted
type: string type: string
ready: ready:
description: Turns true only if the runner is online. description: Turns true only if the runner is online.

View File

@@ -22,7 +22,6 @@ import (
"fmt" "fmt"
"net/http" "net/http"
"strconv" "strconv"
"strings"
"time" "time"
"github.com/actions/actions-runner-controller/apis/actions.github.com/v1alpha1" "github.com/actions/actions-runner-controller/apis/actions.github.com/v1alpha1"
@@ -283,37 +282,10 @@ func (r *EphemeralRunnerReconciler) Reconcile(ctx context.Context, req ctrl.Requ
case kerrors.IsAlreadyExists(err): case kerrors.IsAlreadyExists(err):
log.Info("Runner pod already exists. Waiting for the pod event to be received") log.Info("Runner pod already exists. Waiting for the pod event to be received")
return ctrl.Result{Requeue: true, RequeueAfter: 5 * time.Second}, nil return ctrl.Result{Requeue: true, RequeueAfter: 5 * time.Second}, nil
case kerrors.IsInvalid(err): case kerrors.IsInvalid(err) || kerrors.IsForbidden(err):
log.Error(err, "Failed to create a pod due to unrecoverable failure") log.Error(err, "Failed to create a pod due to unrecoverable failure")
errMessage := fmt.Sprintf("Failed to create the pod: %v", err) errMessage := fmt.Sprintf("Failed to create the pod: %v", err)
if err := r.markAsFailed(ctx, ephemeralRunner, errMessage, ReasonInvalidPodFailure, log); err != nil { if err := r.markAsAborted(ctx, ephemeralRunner, errMessage, ReasonInvalidPodFailure, log); err != nil {
log.Error(err, "Failed to set ephemeral runner to phase Failed")
return ctrl.Result{}, err
}
return ctrl.Result{}, nil
case kerrors.IsForbidden(err):
if status, ok := err.(kerrors.APIStatus); ok || errors.As(err, &status) {
isResourceQuotaExceeded := strings.Contains(status.Status().Message, "exceeded quota:")
isAboutToExpire := ephemeralRunner.CreationTimestamp.Time.Add(10 * time.Minute).Before(time.Now())
switch {
case isResourceQuotaExceeded && isAboutToExpire:
log.Error(err, "Failed to create a pod due to resource quota exceeded and the ephemeral runner is about to expire; re-creating the ephemeral runner")
if err := r.Delete(ctx, ephemeralRunner); err != nil {
log.Error(err, "Failed to delete the ephemeral runner")
return ctrl.Result{}, err
}
return ctrl.Result{}, nil
case isResourceQuotaExceeded:
log.Error(err, "Resource quota is exceeded; requeue in 30s to retry pod creation")
return ctrl.Result{RequeueAfter: 30 * time.Second}, nil
default:
// other forbidden errors
// fallthrough to the default handling below
}
}
log.Error(err, "Failed to create a pod due to unrecoverable failure")
errMessage := fmt.Sprintf("Failed to create the pod: %v", err)
if err := r.markAsFailed(ctx, ephemeralRunner, errMessage, ReasonInvalidPodFailure, log); err != nil {
log.Error(err, "Failed to set ephemeral runner to phase Failed") log.Error(err, "Failed to set ephemeral runner to phase Failed")
return ctrl.Result{}, err return ctrl.Result{}, err
} }
@@ -539,10 +511,12 @@ func (r *EphemeralRunnerReconciler) cleanupRunnerLinkedSecrets(ctx context.Conte
return errors.Join(errs...) return errors.Join(errs...)
} }
func (r *EphemeralRunnerReconciler) markAsFailed(ctx context.Context, ephemeralRunner *v1alpha1.EphemeralRunner, errMessage string, reason string, log logr.Logger) error { // markAsAborted updates the ephemeral runner status to aborted and stops the reconciliation.
// This runner is left in aborted state and won't be deleted until someone manually does that.
func (r *EphemeralRunnerReconciler) markAsAborted(ctx context.Context, ephemeralRunner *v1alpha1.EphemeralRunner, errMessage string, reason string, log logr.Logger) error {
log.Info("Updating ephemeral runner status to Failed") log.Info("Updating ephemeral runner status to Failed")
if err := patchSubResource(ctx, r.Status(), ephemeralRunner, func(obj *v1alpha1.EphemeralRunner) { if err := patchSubResource(ctx, r.Status(), ephemeralRunner, func(obj *v1alpha1.EphemeralRunner) {
obj.Status.Phase = corev1.PodFailed obj.Status.Phase = v1alpha1.EphemeralRunnerAborted
obj.Status.Reason = reason obj.Status.Reason = reason
obj.Status.Message = errMessage obj.Status.Message = errMessage
}); err != nil { }); err != nil {
@@ -573,6 +547,7 @@ func (r *EphemeralRunnerReconciler) deletePodAsFailed(ctx context.Context, ephem
if obj.Status.Failures == nil { if obj.Status.Failures == nil {
obj.Status.Failures = make(map[string]metav1.Time) obj.Status.Failures = make(map[string]metav1.Time)
} }
obj.Status.Phase = v1alpha1.EphemeralRunnerRestarting
obj.Status.Failures[string(pod.UID)] = metav1.Now() obj.Status.Failures[string(pod.UID)] = metav1.Now()
obj.Status.Ready = false obj.Status.Ready = false
obj.Status.Reason = pod.Status.Reason obj.Status.Reason = pod.Status.Reason
@@ -762,7 +737,8 @@ func (r *EphemeralRunnerReconciler) updateRunStatusFromPod(ctx context.Context,
} }
} }
phaseChanged := ephemeralRunner.Status.Phase != pod.Status.Phase newPhase := v1alpha1.EphemeralRunnerPhaseFromPodPhase(pod.Status.Phase)
phaseChanged := ephemeralRunner.Status.Phase != newPhase
readyChanged := ready != ephemeralRunner.Status.Ready readyChanged := ready != ephemeralRunner.Status.Ready
if !phaseChanged && !readyChanged { if !phaseChanged && !readyChanged {
@@ -777,7 +753,7 @@ func (r *EphemeralRunnerReconciler) updateRunStatusFromPod(ctx context.Context,
"ready", ready, "ready", ready,
) )
err := patchSubResource(ctx, r.Status(), ephemeralRunner, func(obj *v1alpha1.EphemeralRunner) { err := patchSubResource(ctx, r.Status(), ephemeralRunner, func(obj *v1alpha1.EphemeralRunner) {
obj.Status.Phase = pod.Status.Phase obj.Status.Phase = newPhase
obj.Status.Ready = ready obj.Status.Ready = ready
obj.Status.Reason = pod.Status.Reason obj.Status.Reason = pod.Status.Reason
obj.Status.Message = pod.Status.Message obj.Status.Message = pod.Status.Message

View File

@@ -270,7 +270,7 @@ var _ = Describe("EphemeralRunner", func() {
updated := new(v1alpha1.EphemeralRunner) updated := new(v1alpha1.EphemeralRunner)
Eventually( Eventually(
func() (corev1.PodPhase, error) { func() (v1alpha1.EphemeralRunnerPhase, error) {
err := k8sClient.Get( err := k8sClient.Get(
ctx, ctx,
client.ObjectKey{Name: invalideEphemeralRunner.Name, Namespace: invalideEphemeralRunner.Namespace}, client.ObjectKey{Name: invalideEphemeralRunner.Name, Namespace: invalideEphemeralRunner.Namespace},
@@ -283,7 +283,7 @@ var _ = Describe("EphemeralRunner", func() {
}, },
ephemeralRunnerTimeout, ephemeralRunnerTimeout,
ephemeralRunnerInterval, ephemeralRunnerInterval,
).Should(BeEquivalentTo(corev1.PodFailed)) ).Should(BeEquivalentTo(v1alpha1.EphemeralRunnerAborted))
Expect(updated.Status.Reason).Should(Equal("InvalidPod")) Expect(updated.Status.Reason).Should(Equal("InvalidPod"))
Expect(updated.Status.Message).Should(Equal("Failed to create the pod: pods \"invalid-ephemeral-runner\" is forbidden: no PriorityClass with name notexist was found")) Expect(updated.Status.Message).Should(Equal("Failed to create the pod: pods \"invalid-ephemeral-runner\" is forbidden: no PriorityClass with name notexist was found"))
@@ -470,7 +470,7 @@ var _ = Describe("EphemeralRunner", func() {
var updated *v1alpha1.EphemeralRunner var updated *v1alpha1.EphemeralRunner
Eventually( Eventually(
func() (corev1.PodPhase, error) { func() (v1alpha1.EphemeralRunnerPhase, error) {
updated = new(v1alpha1.EphemeralRunner) updated = new(v1alpha1.EphemeralRunner)
err := k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunner.Name, Namespace: ephemeralRunner.Namespace}, updated) err := k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunner.Name, Namespace: ephemeralRunner.Namespace}, updated)
if err != nil { if err != nil {
@@ -480,7 +480,7 @@ var _ = Describe("EphemeralRunner", func() {
}, },
ephemeralRunnerTimeout, ephemeralRunnerTimeout,
ephemeralRunnerInterval, ephemeralRunnerInterval,
).Should(BeEquivalentTo(phase)) ).Should(BeEquivalentTo(v1alpha1.EphemeralRunnerPhase(phase)))
} }
}) })
@@ -592,10 +592,10 @@ var _ = Describe("EphemeralRunner", func() {
Expect(err).To(BeNil(), "failed to patch pod status") Expect(err).To(BeNil(), "failed to patch pod status")
Consistently( Consistently(
func() (corev1.PodPhase, error) { func() (v1alpha1.EphemeralRunnerPhase, error) {
updated := new(v1alpha1.EphemeralRunner) updated := new(v1alpha1.EphemeralRunner)
if err := k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunner.Name, Namespace: ephemeralRunner.Namespace}, updated); err != nil { if err := k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunner.Name, Namespace: ephemeralRunner.Namespace}, updated); err != nil {
return corev1.PodUnknown, err return "", err
} }
return updated.Status.Phase, nil return updated.Status.Phase, nil
}, },
@@ -772,7 +772,7 @@ var _ = Describe("EphemeralRunner", func() {
Expect(err).To(BeNil()) Expect(err).To(BeNil())
Eventually( Eventually(
func() (corev1.PodPhase, error) { func() (v1alpha1.EphemeralRunnerPhase, error) {
updated := new(v1alpha1.EphemeralRunner) updated := new(v1alpha1.EphemeralRunner)
if err := k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunner.Name, Namespace: ephemeralRunner.Namespace}, updated); err != nil { if err := k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunner.Name, Namespace: ephemeralRunner.Namespace}, updated); err != nil {
return "", err return "", err
@@ -781,7 +781,7 @@ var _ = Describe("EphemeralRunner", func() {
}, },
ephemeralRunnerTimeout, ephemeralRunnerTimeout,
ephemeralRunnerInterval, ephemeralRunnerInterval,
).Should(BeEquivalentTo(corev1.PodRunning)) ).Should(BeEquivalentTo(v1alpha1.EphemeralRunnerRunning))
// set phase to succeeded // set phase to succeeded
pod.Status.Phase = corev1.PodSucceeded pod.Status.Phase = corev1.PodSucceeded
@@ -789,7 +789,7 @@ var _ = Describe("EphemeralRunner", func() {
Expect(err).To(BeNil()) Expect(err).To(BeNil())
Consistently( Consistently(
func() (corev1.PodPhase, error) { func() (v1alpha1.EphemeralRunnerPhase, error) {
updated := new(v1alpha1.EphemeralRunner) updated := new(v1alpha1.EphemeralRunner)
if err := k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunner.Name, Namespace: ephemeralRunner.Namespace}, updated); err != nil { if err := k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunner.Name, Namespace: ephemeralRunner.Namespace}, updated); err != nil {
return "", err return "", err
@@ -797,7 +797,7 @@ var _ = Describe("EphemeralRunner", func() {
return updated.Status.Phase, nil return updated.Status.Phase, nil
}, },
ephemeralRunnerTimeout, ephemeralRunnerTimeout,
).Should(BeEquivalentTo(corev1.PodRunning)) ).Should(BeEquivalentTo(v1alpha1.EphemeralRunnerRunning))
}) })
}) })

View File

@@ -162,7 +162,7 @@ func (r *EphemeralRunnerSetReconciler) Reconcile(ctx context.Context, req ctrl.R
"pending", len(ephemeralRunnerState.pending), "pending", len(ephemeralRunnerState.pending),
"running", len(ephemeralRunnerState.running), "running", len(ephemeralRunnerState.running),
"finished", len(ephemeralRunnerState.finished), "finished", len(ephemeralRunnerState.finished),
"failed", len(ephemeralRunnerState.failed), "failed", len(ephemeralRunnerState.aborted),
"deleting", len(ephemeralRunnerState.deleting), "deleting", len(ephemeralRunnerState.deleting),
) )
@@ -185,7 +185,7 @@ func (r *EphemeralRunnerSetReconciler) Reconcile(ctx context.Context, req ctrl.R
}, },
len(ephemeralRunnerState.pending), len(ephemeralRunnerState.pending),
len(ephemeralRunnerState.running), len(ephemeralRunnerState.running),
len(ephemeralRunnerState.failed), len(ephemeralRunnerState.aborted),
) )
} }
@@ -232,7 +232,7 @@ func (r *EphemeralRunnerSetReconciler) Reconcile(ctx context.Context, req ctrl.R
CurrentReplicas: total, CurrentReplicas: total,
PendingEphemeralRunners: len(ephemeralRunnerState.pending), PendingEphemeralRunners: len(ephemeralRunnerState.pending),
RunningEphemeralRunners: len(ephemeralRunnerState.running), RunningEphemeralRunners: len(ephemeralRunnerState.running),
FailedEphemeralRunners: len(ephemeralRunnerState.failed), FailedEphemeralRunners: len(ephemeralRunnerState.aborted),
} }
// Update the status if needed. // Update the status if needed.
@@ -307,13 +307,13 @@ func (r *EphemeralRunnerSetReconciler) cleanUpEphemeralRunners(ctx context.Conte
"pending", len(ephemeralRunnerState.pending), "pending", len(ephemeralRunnerState.pending),
"running", len(ephemeralRunnerState.running), "running", len(ephemeralRunnerState.running),
"finished", len(ephemeralRunnerState.finished), "finished", len(ephemeralRunnerState.finished),
"failed", len(ephemeralRunnerState.failed), "failed", len(ephemeralRunnerState.aborted),
"deleting", len(ephemeralRunnerState.deleting), "deleting", len(ephemeralRunnerState.deleting),
) )
log.Info("Cleanup finished or failed ephemeral runners") log.Info("Cleanup finished or failed ephemeral runners")
var errs []error var errs []error
for _, ephemeralRunner := range append(ephemeralRunnerState.finished, ephemeralRunnerState.failed...) { for _, ephemeralRunner := range append(ephemeralRunnerState.finished, ephemeralRunnerState.aborted...) {
log.Info("Deleting ephemeral runner", "name", ephemeralRunner.Name) log.Info("Deleting ephemeral runner", "name", ephemeralRunner.Name)
if err := r.Delete(ctx, ephemeralRunner); err != nil && !kerrors.IsNotFound(err) { if err := r.Delete(ctx, ephemeralRunner); err != nil && !kerrors.IsNotFound(err) {
errs = append(errs, err) errs = append(errs, err)
@@ -564,7 +564,7 @@ type ephemeralRunnerState struct {
pending []*v1alpha1.EphemeralRunner pending []*v1alpha1.EphemeralRunner
running []*v1alpha1.EphemeralRunner running []*v1alpha1.EphemeralRunner
finished []*v1alpha1.EphemeralRunner finished []*v1alpha1.EphemeralRunner
failed []*v1alpha1.EphemeralRunner aborted []*v1alpha1.EphemeralRunner
deleting []*v1alpha1.EphemeralRunner deleting []*v1alpha1.EphemeralRunner
latestPatchID int latestPatchID int
@@ -585,12 +585,12 @@ func newEphemeralRunnerState(ephemeralRunnerList *v1alpha1.EphemeralRunnerList)
} }
switch r.Status.Phase { switch r.Status.Phase {
case corev1.PodRunning: case v1alpha1.EphemeralRunnerRunning:
ephemeralRunnerState.running = append(ephemeralRunnerState.running, r) ephemeralRunnerState.running = append(ephemeralRunnerState.running, r)
case corev1.PodSucceeded: case v1alpha1.EphemeralRunnerSucceeded, v1alpha1.EphemeralRunnerFailed:
ephemeralRunnerState.finished = append(ephemeralRunnerState.finished, r) ephemeralRunnerState.finished = append(ephemeralRunnerState.finished, r)
case corev1.PodFailed: case v1alpha1.EphemeralRunnerAborted:
ephemeralRunnerState.failed = append(ephemeralRunnerState.failed, r) ephemeralRunnerState.aborted = append(ephemeralRunnerState.aborted, r)
default: default:
// Pending or no phase should be considered as pending. // Pending or no phase should be considered as pending.
// //
@@ -603,5 +603,5 @@ func newEphemeralRunnerState(ephemeralRunnerList *v1alpha1.EphemeralRunnerList)
} }
func (s *ephemeralRunnerState) scaleTotal() int { func (s *ephemeralRunnerState) scaleTotal() int {
return len(s.pending) + len(s.running) + len(s.failed) return len(s.pending) + len(s.running) + len(s.aborted)
} }

View File

@@ -163,7 +163,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() {
for i, runner := range runnerList.Items { for i, runner := range runnerList.Items {
if runner.Status.RunnerId == 0 { if runner.Status.RunnerId == 0 {
updatedRunner := runner.DeepCopy() updatedRunner := runner.DeepCopy()
updatedRunner.Status.Phase = corev1.PodRunning updatedRunner.Status.Phase = v1alpha1.EphemeralRunnerRunning
updatedRunner.Status.RunnerId = i + 100 updatedRunner.Status.RunnerId = i + 100
err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runner)) err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runner))
Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner") Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner")
@@ -225,7 +225,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() {
for i, runner := range runnerList.Items { for i, runner := range runnerList.Items {
if runner.Status.RunnerId == 0 { if runner.Status.RunnerId == 0 {
updatedRunner := runner.DeepCopy() updatedRunner := runner.DeepCopy()
updatedRunner.Status.Phase = corev1.PodRunning updatedRunner.Status.Phase = v1alpha1.EphemeralRunnerRunning
updatedRunner.Status.RunnerId = i + 100 updatedRunner.Status.RunnerId = i + 100
err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runner)) err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runner))
Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner") Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner")
@@ -390,12 +390,12 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() {
).Should(BeEquivalentTo(2), "2 EphemeralRunner should be created") ).Should(BeEquivalentTo(2), "2 EphemeralRunner should be created")
updatedRunner := runnerList.Items[0].DeepCopy() updatedRunner := runnerList.Items[0].DeepCopy()
updatedRunner.Status.Phase = corev1.PodSucceeded updatedRunner.Status.Phase = v1alpha1.EphemeralRunnerSucceeded
err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[0])) err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[0]))
Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner") Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner")
updatedRunner = runnerList.Items[1].DeepCopy() updatedRunner = runnerList.Items[1].DeepCopy()
updatedRunner.Status.Phase = corev1.PodRunning updatedRunner.Status.Phase = v1alpha1.EphemeralRunnerRunning
err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[1])) err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[1]))
Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner") Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner")
@@ -468,12 +468,12 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() {
).Should(BeEquivalentTo(2), "2 EphemeralRunner should be created") ).Should(BeEquivalentTo(2), "2 EphemeralRunner should be created")
updatedRunner := runnerList.Items[0].DeepCopy() updatedRunner := runnerList.Items[0].DeepCopy()
updatedRunner.Status.Phase = corev1.PodSucceeded updatedRunner.Status.Phase = v1alpha1.EphemeralRunnerRunning
err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[0])) err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[0]))
Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner") Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner")
updatedRunner = runnerList.Items[1].DeepCopy() updatedRunner = runnerList.Items[1].DeepCopy()
updatedRunner.Status.Phase = corev1.PodPending updatedRunner.Status.Phase = v1alpha1.EphemeralRunnerPending
err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[1])) err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[1]))
Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner") Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner")
@@ -520,12 +520,12 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() {
).Should(BeEquivalentTo(2), "2 EphemeralRunner should be created") ).Should(BeEquivalentTo(2), "2 EphemeralRunner should be created")
updatedRunner := runnerList.Items[0].DeepCopy() updatedRunner := runnerList.Items[0].DeepCopy()
updatedRunner.Status.Phase = corev1.PodSucceeded updatedRunner.Status.Phase = v1alpha1.EphemeralRunnerSucceeded
err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[0])) err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[0]))
Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner") Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner")
updatedRunner = runnerList.Items[1].DeepCopy() updatedRunner = runnerList.Items[1].DeepCopy()
updatedRunner.Status.Phase = corev1.PodRunning updatedRunner.Status.Phase = v1alpha1.EphemeralRunnerRunning
err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[1])) err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[1]))
Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner") Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner")
@@ -555,7 +555,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() {
} }
for _, runner := range runnerList.Items { for _, runner := range runnerList.Items {
if runner.Status.Phase == corev1.PodSucceeded { if runner.Status.Phase == v1alpha1.EphemeralRunnerSucceeded {
return fmt.Errorf("Runner %s is in Succeeded phase", runner.Name) return fmt.Errorf("Runner %s is in Succeeded phase", runner.Name)
} }
} }
@@ -594,12 +594,12 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() {
).Should(BeEquivalentTo(2), "2 EphemeralRunner should be created") ).Should(BeEquivalentTo(2), "2 EphemeralRunner should be created")
updatedRunner := runnerList.Items[0].DeepCopy() updatedRunner := runnerList.Items[0].DeepCopy()
updatedRunner.Status.Phase = corev1.PodSucceeded updatedRunner.Status.Phase = v1alpha1.EphemeralRunnerSucceeded
err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[0])) err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[0]))
Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner") Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner")
updatedRunner = runnerList.Items[1].DeepCopy() updatedRunner = runnerList.Items[1].DeepCopy()
updatedRunner.Status.Phase = corev1.PodPending updatedRunner.Status.Phase = v1alpha1.EphemeralRunnerPending
err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[1])) err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[1]))
Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner") Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner")
@@ -615,9 +615,9 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() {
succeeded := 0 succeeded := 0
for _, runner := range runnerList.Items { for _, runner := range runnerList.Items {
switch runner.Status.Phase { switch runner.Status.Phase {
case corev1.PodSucceeded: case v1alpha1.EphemeralRunnerSucceeded:
succeeded++ succeeded++
case corev1.PodPending: case v1alpha1.EphemeralRunnerPending:
pending++ pending++
} }
} }
@@ -657,7 +657,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() {
return fmt.Errorf("Expected 1 runner, got %d", len(runnerList.Items)) return fmt.Errorf("Expected 1 runner, got %d", len(runnerList.Items))
} }
if runnerList.Items[0].Status.Phase != corev1.PodPending { if runnerList.Items[0].Status.Phase != v1alpha1.EphemeralRunnerPending {
return fmt.Errorf("Expected runner to be in Pending, got %s", runnerList.Items[0].Status.Phase) return fmt.Errorf("Expected runner to be in Pending, got %s", runnerList.Items[0].Status.Phase)
} }
@@ -669,7 +669,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() {
// Now, the ephemeral runner finally is done and we can scale down to 0 // Now, the ephemeral runner finally is done and we can scale down to 0
updatedRunner = runnerList.Items[0].DeepCopy() updatedRunner = runnerList.Items[0].DeepCopy()
updatedRunner.Status.Phase = corev1.PodSucceeded updatedRunner.Status.Phase = v1alpha1.EphemeralRunnerSucceeded
err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[0])) err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[0]))
Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner") Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner")
@@ -715,12 +715,12 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() {
// Put one runner in Pending and one in Running // Put one runner in Pending and one in Running
updatedRunner := runnerList.Items[0].DeepCopy() updatedRunner := runnerList.Items[0].DeepCopy()
updatedRunner.Status.Phase = corev1.PodPending updatedRunner.Status.Phase = v1alpha1.EphemeralRunnerPending
err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[0])) err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[0]))
Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner") Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner")
updatedRunner = runnerList.Items[1].DeepCopy() updatedRunner = runnerList.Items[1].DeepCopy()
updatedRunner.Status.Phase = corev1.PodRunning updatedRunner.Status.Phase = v1alpha1.EphemeralRunnerRunning
err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[1])) err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[1]))
Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner") Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner")
@@ -738,9 +738,9 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() {
for _, runner := range runnerList.Items { for _, runner := range runnerList.Items {
switch runner.Status.Phase { switch runner.Status.Phase {
case corev1.PodPending: case v1alpha1.EphemeralRunnerPending:
pending++ pending++
case corev1.PodRunning: case v1alpha1.EphemeralRunnerRunning:
running++ running++
} }
@@ -839,12 +839,12 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() {
// Put one runner in Succeeded and one in Running // Put one runner in Succeeded and one in Running
updatedRunner := runnerList.Items[0].DeepCopy() updatedRunner := runnerList.Items[0].DeepCopy()
updatedRunner.Status.Phase = corev1.PodSucceeded updatedRunner.Status.Phase = v1alpha1.EphemeralRunnerSucceeded
err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[0])) err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[0]))
Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner") Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner")
updatedRunner = runnerList.Items[1].DeepCopy() updatedRunner = runnerList.Items[1].DeepCopy()
updatedRunner.Status.Phase = corev1.PodRunning updatedRunner.Status.Phase = v1alpha1.EphemeralRunnerRunning
err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[1])) err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[1]))
Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner") Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner")
@@ -863,9 +863,9 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() {
for _, runner := range runnerList.Items { for _, runner := range runnerList.Items {
switch runner.Status.Phase { switch runner.Status.Phase {
case corev1.PodSucceeded: case v1alpha1.EphemeralRunnerSucceeded:
succeeded++ succeeded++
case corev1.PodRunning: case v1alpha1.EphemeralRunnerRunning:
running++ running++
} }
} }
@@ -907,7 +907,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() {
} }
for _, runner := range runnerList.Items { for _, runner := range runnerList.Items {
if runner.Status.Phase == corev1.PodSucceeded { if runner.Status.Phase == v1alpha1.EphemeralRunnerSucceeded {
return fmt.Errorf("Expected no runners in Succeeded phase, got one") return fmt.Errorf("Expected no runners in Succeeded phase, got one")
} }
} }
@@ -972,7 +972,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() {
pending := pendingOriginal.DeepCopy() pending := pendingOriginal.DeepCopy()
pending.Status.RunnerId = 101 pending.Status.RunnerId = 101
pending.Status.Phase = corev1.PodPending pending.Status.Phase = v1alpha1.EphemeralRunnerPending
err = k8sClient.Status().Patch(ctx, pending, client.MergeFrom(pendingOriginal)) err = k8sClient.Status().Patch(ctx, pending, client.MergeFrom(pendingOriginal))
if err != nil { if err != nil {
@@ -986,7 +986,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() {
empty = empty[1:] empty = empty[1:]
running := runningOriginal.DeepCopy() running := runningOriginal.DeepCopy()
running.Status.RunnerId = 102 running.Status.RunnerId = 102
running.Status.Phase = corev1.PodRunning running.Status.Phase = v1alpha1.EphemeralRunnerRunning
err = k8sClient.Status().Patch(ctx, running, client.MergeFrom(runningOriginal)) err = k8sClient.Status().Patch(ctx, running, client.MergeFrom(runningOriginal))
if err != nil { if err != nil {
@@ -1000,7 +1000,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() {
failed := pendingOriginal.DeepCopy() failed := pendingOriginal.DeepCopy()
failed.Status.RunnerId = 103 failed.Status.RunnerId = 103
failed.Status.Phase = corev1.PodFailed failed.Status.Phase = v1alpha1.EphemeralRunnerAborted
err = k8sClient.Status().Patch(ctx, failed, client.MergeFrom(failedOriginal)) err = k8sClient.Status().Patch(ctx, failed, client.MergeFrom(failedOriginal))
if err != nil { if err != nil {
@@ -1236,7 +1236,7 @@ var _ = Describe("Test EphemeralRunnerSet controller with proxy settings", func(
for i, runner := range runnerList.Items { for i, runner := range runnerList.Items {
if runner.Status.RunnerId == 0 { if runner.Status.RunnerId == 0 {
updatedRunner := runner.DeepCopy() updatedRunner := runner.DeepCopy()
updatedRunner.Status.Phase = corev1.PodSucceeded updatedRunner.Status.Phase = v1alpha1.EphemeralRunnerSucceeded
updatedRunner.Status.RunnerId = i + 100 updatedRunner.Status.RunnerId = i + 100
err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runner)) err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runner))
Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner") Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner")
@@ -1355,7 +1355,7 @@ var _ = Describe("Test EphemeralRunnerSet controller with proxy settings", func(
).Should(BeEquivalentTo(1), "failed to create ephemeral runner") ).Should(BeEquivalentTo(1), "failed to create ephemeral runner")
runner := runnerList.Items[0].DeepCopy() runner := runnerList.Items[0].DeepCopy()
runner.Status.Phase = corev1.PodRunning runner.Status.Phase = v1alpha1.EphemeralRunnerRunning
runner.Status.RunnerId = 100 runner.Status.RunnerId = 100
err = k8sClient.Status().Patch(ctx, runner, client.MergeFrom(&runnerList.Items[0])) err = k8sClient.Status().Patch(ctx, runner, client.MergeFrom(&runnerList.Items[0]))
Expect(err).NotTo(HaveOccurred(), "failed to update ephemeral runner status") Expect(err).NotTo(HaveOccurred(), "failed to update ephemeral runner status")
@@ -1505,7 +1505,7 @@ var _ = Describe("Test EphemeralRunnerSet controller with custom root CA", func(
Expect(runner.Spec.GitHubServerTLS).NotTo(BeNil(), "runner tls config should not be nil") Expect(runner.Spec.GitHubServerTLS).NotTo(BeNil(), "runner tls config should not be nil")
Expect(runner.Spec.GitHubServerTLS).To(BeEquivalentTo(ephemeralRunnerSet.Spec.EphemeralRunnerSpec.GitHubServerTLS), "runner tls config should be correct") Expect(runner.Spec.GitHubServerTLS).To(BeEquivalentTo(ephemeralRunnerSet.Spec.EphemeralRunnerSpec.GitHubServerTLS), "runner tls config should be correct")
runner.Status.Phase = corev1.PodRunning runner.Status.Phase = v1alpha1.EphemeralRunnerRunning
runner.Status.RunnerId = 100 runner.Status.RunnerId = 100
err = k8sClient.Status().Patch(ctx, runner, client.MergeFrom(&runnerList.Items[0])) err = k8sClient.Status().Patch(ctx, runner, client.MergeFrom(&runnerList.Items[0]))
Expect(err).NotTo(HaveOccurred(), "failed to update ephemeral runner status") Expect(err).NotTo(HaveOccurred(), "failed to update ephemeral runner status")

View File

@@ -690,28 +690,20 @@ func scaleSetListenerConfigName(autoscalingListener *v1alpha1.AutoscalingListene
return fmt.Sprintf("%s-config", autoscalingListener.Name) return fmt.Sprintf("%s-config", autoscalingListener.Name)
} }
func hashSuffix(namespace, runnerGroup, configURL string) string { func scaleSetListenerName(autoscalingRunnerSet *v1alpha1.AutoscalingRunnerSet) string {
namespaceHash := hash.FNVHashString(namespace + "@" + runnerGroup + "@" + configURL) namespaceHash := hash.FNVHashString(autoscalingRunnerSet.Namespace)
if len(namespaceHash) > 8 { if len(namespaceHash) > 8 {
namespaceHash = namespaceHash[:8] namespaceHash = namespaceHash[:8]
} }
return namespaceHash return fmt.Sprintf("%v-%v-listener", autoscalingRunnerSet.Name, namespaceHash)
}
func scaleSetListenerName(autoscalingRunnerSet *v1alpha1.AutoscalingRunnerSet) string {
return fmt.Sprintf(
"%v-%v-listener",
autoscalingRunnerSet.Name,
hashSuffix(
autoscalingRunnerSet.Namespace,
autoscalingRunnerSet.Spec.RunnerGroup,
autoscalingRunnerSet.Spec.GitHubConfigUrl,
),
)
} }
func proxyListenerSecretName(autoscalingListener *v1alpha1.AutoscalingListener) string { func proxyListenerSecretName(autoscalingListener *v1alpha1.AutoscalingListener) string {
return autoscalingListener.Name + "-proxy" namespaceHash := hash.FNVHashString(autoscalingListener.Spec.AutoscalingRunnerSetNamespace)
if len(namespaceHash) > 8 {
namespaceHash = namespaceHash[:8]
}
return fmt.Sprintf("%v-%v-listener-proxy", autoscalingListener.Spec.AutoscalingRunnerSetName, namespaceHash)
} }
func proxyEphemeralRunnerSetSecretName(ephemeralRunnerSet *v1alpha1.EphemeralRunnerSet) string { func proxyEphemeralRunnerSetSecretName(ephemeralRunnerSet *v1alpha1.EphemeralRunnerSet) string {

View File

@@ -8,7 +8,7 @@ TARGETPLATFORM ?= $(shell arch)
RUNNER_VERSION ?= 2.329.0 RUNNER_VERSION ?= 2.329.0
RUNNER_CONTAINER_HOOKS_VERSION ?= 0.8.0 RUNNER_CONTAINER_HOOKS_VERSION ?= 0.8.0
DOCKER_VERSION ?= 28.0.4 DOCKER_VERSION ?= 24.0.7
# default list of platforms for which multiarch image is built # default list of platforms for which multiarch image is built
ifeq (${PLATFORMS}, ) ifeq (${PLATFORMS}, )

View File

@@ -5,7 +5,7 @@ ARG RUNNER_VERSION
ARG RUNNER_CONTAINER_HOOKS_VERSION ARG RUNNER_CONTAINER_HOOKS_VERSION
# Docker and Docker Compose arguments # Docker and Docker Compose arguments
ENV CHANNEL=stable ENV CHANNEL=stable
ARG DOCKER_COMPOSE_VERSION=v2.38.2 ARG DOCKER_COMPOSE_VERSION=v2.23.0
ARG DUMB_INIT_VERSION=1.2.5 ARG DUMB_INIT_VERSION=1.2.5
# Other arguments # Other arguments

View File

@@ -5,7 +5,7 @@ ARG RUNNER_VERSION
ARG RUNNER_CONTAINER_HOOKS_VERSION ARG RUNNER_CONTAINER_HOOKS_VERSION
# Docker and Docker Compose arguments # Docker and Docker Compose arguments
ENV CHANNEL=stable ENV CHANNEL=stable
ARG DOCKER_COMPOSE_VERSION=v2.38.2 ARG DOCKER_COMPOSE_VERSION=v2.23.0
ARG DUMB_INIT_VERSION=1.2.5 ARG DUMB_INIT_VERSION=1.2.5
ARG RUNNER_USER_UID=1001 ARG RUNNER_USER_UID=1001

View File

@@ -5,7 +5,7 @@ ARG RUNNER_VERSION
ARG RUNNER_CONTAINER_HOOKS_VERSION ARG RUNNER_CONTAINER_HOOKS_VERSION
# Docker and Docker Compose arguments # Docker and Docker Compose arguments
ENV CHANNEL=stable ENV CHANNEL=stable
ARG DOCKER_COMPOSE_VERSION=v2.38.2 ARG DOCKER_COMPOSE_VERSION=v2.23.0
ARG DUMB_INIT_VERSION=1.2.5 ARG DUMB_INIT_VERSION=1.2.5
ARG RUNNER_USER_UID=1001 ARG RUNNER_USER_UID=1001

View File

@@ -5,8 +5,8 @@ ARG RUNNER_VERSION
ARG RUNNER_CONTAINER_HOOKS_VERSION ARG RUNNER_CONTAINER_HOOKS_VERSION
# Docker and Docker Compose arguments # Docker and Docker Compose arguments
ARG CHANNEL=stable ARG CHANNEL=stable
ARG DOCKER_VERSION=28.0.4 ARG DOCKER_VERSION=24.0.7
ARG DOCKER_COMPOSE_VERSION=v2.38.2 ARG DOCKER_COMPOSE_VERSION=v2.23.0
ARG DUMB_INIT_VERSION=1.2.5 ARG DUMB_INIT_VERSION=1.2.5
# Use 1001 and 121 for compatibility with GitHub-hosted runners # Use 1001 and 121 for compatibility with GitHub-hosted runners

View File

@@ -5,8 +5,8 @@ ARG RUNNER_VERSION
ARG RUNNER_CONTAINER_HOOKS_VERSION ARG RUNNER_CONTAINER_HOOKS_VERSION
# Docker and Docker Compose arguments # Docker and Docker Compose arguments
ARG CHANNEL=stable ARG CHANNEL=stable
ARG DOCKER_VERSION=28.0.4 ARG DOCKER_VERSION=24.0.7
ARG DOCKER_COMPOSE_VERSION=v2.38.2 ARG DOCKER_COMPOSE_VERSION=v2.23.0
ARG DUMB_INIT_VERSION=1.2.5 ARG DUMB_INIT_VERSION=1.2.5
ARG RUNNER_USER_UID=1001 ARG RUNNER_USER_UID=1001
ARG DOCKER_GROUP_GID=121 ARG DOCKER_GROUP_GID=121

View File

@@ -5,8 +5,8 @@ ARG RUNNER_VERSION
ARG RUNNER_CONTAINER_HOOKS_VERSION ARG RUNNER_CONTAINER_HOOKS_VERSION
# Docker and Docker Compose arguments # Docker and Docker Compose arguments
ARG CHANNEL=stable ARG CHANNEL=stable
ARG DOCKER_VERSION=28.0.4 ARG DOCKER_VERSION=24.0.7
ARG DOCKER_COMPOSE_VERSION=v2.38.2 ARG DOCKER_COMPOSE_VERSION=v2.23.0
ARG DUMB_INIT_VERSION=1.2.5 ARG DUMB_INIT_VERSION=1.2.5
ARG RUNNER_USER_UID=1001 ARG RUNNER_USER_UID=1001
ARG DOCKER_GROUP_GID=121 ARG DOCKER_GROUP_GID=121

View File

@@ -5,8 +5,8 @@ ARG RUNNER_VERSION
ARG RUNNER_CONTAINER_HOOKS_VERSION ARG RUNNER_CONTAINER_HOOKS_VERSION
# Docker and Docker Compose arguments # Docker and Docker Compose arguments
ARG CHANNEL=stable ARG CHANNEL=stable
ARG DOCKER_VERSION=28.0.4 ARG DOCKER_VERSION=24.0.7
ARG DOCKER_COMPOSE_VERSION=v2.38.2 ARG DOCKER_COMPOSE_VERSION=v2.23.0
ARG DUMB_INIT_VERSION=1.2.5 ARG DUMB_INIT_VERSION=1.2.5
# Use 1001 and 121 for compatibility with GitHub-hosted runners # Use 1001 and 121 for compatibility with GitHub-hosted runners

View File

@@ -5,8 +5,8 @@ ARG RUNNER_VERSION
ARG RUNNER_CONTAINER_HOOKS_VERSION ARG RUNNER_CONTAINER_HOOKS_VERSION
# Docker and Docker Compose arguments # Docker and Docker Compose arguments
ARG CHANNEL=stable ARG CHANNEL=stable
ARG DOCKER_VERSION=28.0.4 ARG DOCKER_VERSION=24.0.7
ARG DOCKER_COMPOSE_VERSION=v2.38.2 ARG DOCKER_COMPOSE_VERSION=v2.23.0
ARG DUMB_INIT_VERSION=1.2.5 ARG DUMB_INIT_VERSION=1.2.5
ARG RUNNER_USER_UID=1001 ARG RUNNER_USER_UID=1001
ARG DOCKER_GROUP_GID=121 ARG DOCKER_GROUP_GID=121

View File

@@ -5,8 +5,8 @@ ARG RUNNER_VERSION
ARG RUNNER_CONTAINER_HOOKS_VERSION ARG RUNNER_CONTAINER_HOOKS_VERSION
# Docker and Docker Compose arguments # Docker and Docker Compose arguments
ARG CHANNEL=stable ARG CHANNEL=stable
ARG DOCKER_VERSION=28.0.4 ARG DOCKER_VERSION=24.0.7
ARG DOCKER_COMPOSE_VERSION=v2.38.2 ARG DOCKER_COMPOSE_VERSION=v2.23.0
ARG DUMB_INIT_VERSION=1.2.5 ARG DUMB_INIT_VERSION=1.2.5
ARG RUNNER_USER_UID=1001 ARG RUNNER_USER_UID=1001
ARG DOCKER_GROUP_GID=121 ARG DOCKER_GROUP_GID=121

View File

@@ -455,7 +455,7 @@ func buildVars(repo, ubuntuVer string) vars {
runnerRootlessDindImage = testing.Img(runnerRootlessDindImageRepo, runnerImageTag) runnerRootlessDindImage = testing.Img(runnerRootlessDindImageRepo, runnerImageTag)
dindSidecarImageRepo = "docker" dindSidecarImageRepo = "docker"
dindSidecarImageTag = "28.0.4-dind" dindSidecarImageTag = "24.0.7-dind"
dindSidecarImage = testing.Img(dindSidecarImageRepo, dindSidecarImageTag) dindSidecarImage = testing.Img(dindSidecarImageRepo, dindSidecarImageTag)
) )