From 9f0c174c6db3394427ad693a07643ac0762f9513 Mon Sep 17 00:00:00 2001 From: Nikola Jokic Date: Fri, 12 Sep 2025 18:16:50 +0200 Subject: [PATCH] Add JobID and actually rely on JobID --- .../v1alpha1/ephemeralrunner_types.go | 6 ++- .../actions.github.com_ephemeralrunners.yaml | 5 +++ cmd/ghalistener/listener/listener.go | 16 +++++--- cmd/ghalistener/listener/listener_test.go | 38 +++++++++---------- cmd/ghalistener/listener/metrics_test.go | 8 ++-- cmd/ghalistener/worker/worker.go | 10 +++-- .../actions.github.com_ephemeralrunners.yaml | 5 +++ .../ephemeralrunner_controller_test.go | 10 ++--- .../ephemeralrunnerset_controller.go | 7 +++- github/actions/types.go | 7 ++-- 10 files changed, 70 insertions(+), 42 deletions(-) diff --git a/apis/actions.github.com/v1alpha1/ephemeralrunner_types.go b/apis/actions.github.com/v1alpha1/ephemeralrunner_types.go index c8dcbd91..28d6545c 100644 --- a/apis/actions.github.com/v1alpha1/ephemeralrunner_types.go +++ b/apis/actions.github.com/v1alpha1/ephemeralrunner_types.go @@ -34,6 +34,7 @@ const EphemeralRunnerContainerName = "runner" // +kubebuilder:printcolumn:JSONPath=".status.jobWorkflowRef",name=JobWorkflowRef,type=string // +kubebuilder:printcolumn:JSONPath=".status.workflowRunId",name=WorkflowRunId,type=number // +kubebuilder:printcolumn:JSONPath=".status.jobDisplayName",name=JobDisplayName,type=string +// +kubebuilder:printcolumn:JSONPath=".status.jobId",name=JobId,type=string // +kubebuilder:printcolumn:JSONPath=".status.message",name=Message,type=string // +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp" @@ -51,7 +52,7 @@ func (er *EphemeralRunner) IsDone() bool { } func (er *EphemeralRunner) HasJob() bool { - return er.Status.WorkflowRunId != 0 + return len(er.Status.JobID) > 0 } func (er *EphemeralRunner) HasContainerHookConfigured() bool { @@ -156,6 +157,9 @@ type EphemeralRunnerStatus struct { // +optional JobRequestId int64 `json:"jobRequestId,omitempty"` + // +optional + JobID string `json:"jobId,omitempty"` + // +optional JobRepositoryName string `json:"jobRepositoryName,omitempty"` diff --git a/charts/gha-runner-scale-set-controller/crds/actions.github.com_ephemeralrunners.yaml b/charts/gha-runner-scale-set-controller/crds/actions.github.com_ephemeralrunners.yaml index ef4ccda9..d2dee230 100644 --- a/charts/gha-runner-scale-set-controller/crds/actions.github.com_ephemeralrunners.yaml +++ b/charts/gha-runner-scale-set-controller/crds/actions.github.com_ephemeralrunners.yaml @@ -36,6 +36,9 @@ spec: - jsonPath: .status.jobDisplayName name: JobDisplayName type: string + - jsonPath: .status.jobId + name: JobId + type: string - jsonPath: .status.message name: Message type: string @@ -7846,6 +7849,8 @@ spec: type: object jobDisplayName: type: string + jobId: + type: string jobRepositoryName: type: string jobRequestId: diff --git a/cmd/ghalistener/listener/listener.go b/cmd/ghalistener/listener/listener.go index a9cf0838..eb43c401 100644 --- a/cmd/ghalistener/listener/listener.go +++ b/cmd/ghalistener/listener/listener.go @@ -361,7 +361,7 @@ func (l *Listener) parseMessage(ctx context.Context, msg *actions.RunnerScaleSet return nil, fmt.Errorf("failed to decode job available: %w", err) } - l.logger.Info("Job available message received", "jobId", jobAvailable.RunnerRequestId) + l.logger.Info("Job available message received", "jobId", jobAvailable.JobID) parsedMsg.jobsAvailable = append(parsedMsg.jobsAvailable, &jobAvailable) case messageTypeJobAssigned: @@ -370,14 +370,14 @@ func (l *Listener) parseMessage(ctx context.Context, msg *actions.RunnerScaleSet return nil, fmt.Errorf("failed to decode job assigned: %w", err) } - l.logger.Info("Job assigned message received", "jobId", jobAssigned.RunnerRequestId) + l.logger.Info("Job assigned message received", "jobId", jobAssigned.JobID) case messageTypeJobStarted: var jobStarted actions.JobStarted if err := json.Unmarshal(msg, &jobStarted); err != nil { return nil, fmt.Errorf("could not decode job started message. %w", err) } - l.logger.Info("Job started message received.", "RequestId", jobStarted.RunnerRequestId, "RunnerId", jobStarted.RunnerId) + l.logger.Info("Job started message received.", "JobID", jobStarted.JobID, "RunnerId", jobStarted.RunnerID) parsedMsg.jobsStarted = append(parsedMsg.jobsStarted, &jobStarted) case messageTypeJobCompleted: @@ -386,7 +386,13 @@ func (l *Listener) parseMessage(ctx context.Context, msg *actions.RunnerScaleSet return nil, fmt.Errorf("failed to decode job completed: %w", err) } - l.logger.Info("Job completed message received.", "RequestId", jobCompleted.RunnerRequestId, "Result", jobCompleted.Result, "RunnerId", jobCompleted.RunnerId, "RunnerName", jobCompleted.RunnerName) + l.logger.Info( + "Job completed message received.", + "JobID", jobCompleted.JobID, + "Result", jobCompleted.Result, + "RunnerId", jobCompleted.RunnerId, + "RunnerName", jobCompleted.RunnerName, + ) parsedMsg.jobsCompleted = append(parsedMsg.jobsCompleted, &jobCompleted) default: @@ -400,7 +406,7 @@ func (l *Listener) parseMessage(ctx context.Context, msg *actions.RunnerScaleSet func (l *Listener) acquireAvailableJobs(ctx context.Context, jobsAvailable []*actions.JobAvailable) ([]int64, error) { ids := make([]int64, 0, len(jobsAvailable)) for _, job := range jobsAvailable { - ids = append(ids, job.RunnerRequestId) + ids = append(ids, job.RunnerRequestID) } l.logger.Info("Acquiring jobs", "count", len(ids), "requestIds", fmt.Sprint(ids)) diff --git a/cmd/ghalistener/listener/listener_test.go b/cmd/ghalistener/listener/listener_test.go index 38c1f40f..af3b256d 100644 --- a/cmd/ghalistener/listener/listener_test.go +++ b/cmd/ghalistener/listener/listener_test.go @@ -627,17 +627,17 @@ func TestListener_acquireAvailableJobs(t *testing.T) { availableJobs := []*actions.JobAvailable{ { JobMessageBase: actions.JobMessageBase{ - RunnerRequestId: 1, + RunnerRequestID: 1, }, }, { JobMessageBase: actions.JobMessageBase{ - RunnerRequestId: 2, + RunnerRequestID: 2, }, }, { JobMessageBase: actions.JobMessageBase{ - RunnerRequestId: 3, + RunnerRequestID: 3, }, }, } @@ -678,17 +678,17 @@ func TestListener_acquireAvailableJobs(t *testing.T) { availableJobs := []*actions.JobAvailable{ { JobMessageBase: actions.JobMessageBase{ - RunnerRequestId: 1, + RunnerRequestID: 1, }, }, { JobMessageBase: actions.JobMessageBase{ - RunnerRequestId: 2, + RunnerRequestID: 2, }, }, { JobMessageBase: actions.JobMessageBase{ - RunnerRequestId: 3, + RunnerRequestID: 3, }, }, } @@ -724,17 +724,17 @@ func TestListener_acquireAvailableJobs(t *testing.T) { availableJobs := []*actions.JobAvailable{ { JobMessageBase: actions.JobMessageBase{ - RunnerRequestId: 1, + RunnerRequestID: 1, }, }, { JobMessageBase: actions.JobMessageBase{ - RunnerRequestId: 2, + RunnerRequestID: 2, }, }, { JobMessageBase: actions.JobMessageBase{ - RunnerRequestId: 3, + RunnerRequestID: 3, }, }, } @@ -809,17 +809,17 @@ func TestListener_acquireAvailableJobs(t *testing.T) { availableJobs := []*actions.JobAvailable{ { JobMessageBase: actions.JobMessageBase{ - RunnerRequestId: 1, + RunnerRequestID: 1, }, }, { JobMessageBase: actions.JobMessageBase{ - RunnerRequestId: 2, + RunnerRequestID: 2, }, }, { JobMessageBase: actions.JobMessageBase{ - RunnerRequestId: 3, + RunnerRequestID: 3, }, }, } @@ -881,7 +881,7 @@ func TestListener_parseMessage(t *testing.T) { JobMessageType: actions.JobMessageType{ MessageType: messageTypeJobAvailable, }, - RunnerRequestId: 1, + RunnerRequestID: 1, }, }, { @@ -890,7 +890,7 @@ func TestListener_parseMessage(t *testing.T) { JobMessageType: actions.JobMessageType{ MessageType: messageTypeJobAvailable, }, - RunnerRequestId: 2, + RunnerRequestID: 2, }, }, } @@ -904,7 +904,7 @@ func TestListener_parseMessage(t *testing.T) { JobMessageType: actions.JobMessageType{ MessageType: messageTypeJobAssigned, }, - RunnerRequestId: 3, + RunnerRequestID: 3, }, }, { @@ -912,7 +912,7 @@ func TestListener_parseMessage(t *testing.T) { JobMessageType: actions.JobMessageType{ MessageType: messageTypeJobAssigned, }, - RunnerRequestId: 4, + RunnerRequestID: 4, }, }, } @@ -926,9 +926,9 @@ func TestListener_parseMessage(t *testing.T) { JobMessageType: actions.JobMessageType{ MessageType: messageTypeJobStarted, }, - RunnerRequestId: 5, + RunnerRequestID: 5, }, - RunnerId: 2, + RunnerID: 2, RunnerName: "runner2", }, } @@ -942,7 +942,7 @@ func TestListener_parseMessage(t *testing.T) { JobMessageType: actions.JobMessageType{ MessageType: messageTypeJobCompleted, }, - RunnerRequestId: 6, + RunnerRequestID: 6, }, Result: "success", RunnerId: 1, diff --git a/cmd/ghalistener/listener/metrics_test.go b/cmd/ghalistener/listener/metrics_test.go index c333615d..975619b9 100644 --- a/cmd/ghalistener/listener/metrics_test.go +++ b/cmd/ghalistener/listener/metrics_test.go @@ -123,9 +123,9 @@ func TestHandleMessageMetrics(t *testing.T) { JobMessageType: actions.JobMessageType{ MessageType: messageTypeJobStarted, }, - RunnerRequestId: 8, + RunnerRequestID: 8, }, - RunnerId: 3, + RunnerID: 3, RunnerName: "runner3", }, } @@ -139,7 +139,7 @@ func TestHandleMessageMetrics(t *testing.T) { JobMessageType: actions.JobMessageType{ MessageType: messageTypeJobCompleted, }, - RunnerRequestId: 6, + RunnerRequestID: 6, }, Result: "success", RunnerId: 1, @@ -150,7 +150,7 @@ func TestHandleMessageMetrics(t *testing.T) { JobMessageType: actions.JobMessageType{ MessageType: messageTypeJobCompleted, }, - RunnerRequestId: 7, + RunnerRequestID: 7, }, Result: "success", RunnerId: 2, diff --git a/cmd/ghalistener/worker/worker.go b/cmd/ghalistener/worker/worker.go index 9d6266bf..1f2322f9 100644 --- a/cmd/ghalistener/worker/worker.go +++ b/cmd/ghalistener/worker/worker.go @@ -100,10 +100,11 @@ func (w *Worker) HandleJobStarted(ctx context.Context, jobInfo *actions.JobStart "runnerName", jobInfo.RunnerName, "ownerName", jobInfo.OwnerName, "repoName", jobInfo.RepositoryName, + "jobId", jobInfo.JobID, "workflowRef", jobInfo.JobWorkflowRef, - "workflowRunId", jobInfo.WorkflowRunId, + "workflowRunId", jobInfo.WorkflowRunID, "jobDisplayName", jobInfo.JobDisplayName, - "requestId", jobInfo.RunnerRequestId) + "requestId", jobInfo.RunnerRequestID) original, err := json.Marshal(&v1alpha1.EphemeralRunner{}) if err != nil { @@ -113,9 +114,10 @@ func (w *Worker) HandleJobStarted(ctx context.Context, jobInfo *actions.JobStart patch, err := json.Marshal( &v1alpha1.EphemeralRunner{ Status: v1alpha1.EphemeralRunnerStatus{ - JobRequestId: jobInfo.RunnerRequestId, + JobRequestId: jobInfo.RunnerRequestID, JobRepositoryName: fmt.Sprintf("%s/%s", jobInfo.OwnerName, jobInfo.RepositoryName), - WorkflowRunId: jobInfo.WorkflowRunId, + JobID: jobInfo.JobID, + WorkflowRunId: jobInfo.WorkflowRunID, JobWorkflowRef: jobInfo.JobWorkflowRef, JobDisplayName: jobInfo.JobDisplayName, }, diff --git a/config/crd/bases/actions.github.com_ephemeralrunners.yaml b/config/crd/bases/actions.github.com_ephemeralrunners.yaml index ef4ccda9..d2dee230 100644 --- a/config/crd/bases/actions.github.com_ephemeralrunners.yaml +++ b/config/crd/bases/actions.github.com_ephemeralrunners.yaml @@ -36,6 +36,9 @@ spec: - jsonPath: .status.jobDisplayName name: JobDisplayName type: string + - jsonPath: .status.jobId + name: JobId + type: string - jsonPath: .status.message name: Message type: string @@ -7846,6 +7849,8 @@ spec: type: object jobDisplayName: type: string + jobId: + type: string jobRepositoryName: type: string jobRequestId: diff --git a/controllers/actions.github.com/ephemeralrunner_controller_test.go b/controllers/actions.github.com/ephemeralrunner_controller_test.go index 497045a1..a19f272f 100644 --- a/controllers/actions.github.com/ephemeralrunner_controller_test.go +++ b/controllers/actions.github.com/ephemeralrunner_controller_test.go @@ -213,22 +213,22 @@ var _ = Describe("EphemeralRunner", func() { ).Should(Succeed(), "failed to get ephemeral runner") // update job id to simulate job assigned - er.Status.WorkflowRunId = 1 + er.Status.JobID = "1" err := k8sClient.Status().Update(ctx, er) Expect(err).To(BeNil(), "failed to update ephemeral runner status") er = new(v1alpha1.EphemeralRunner) Eventually( - func() (int64, error) { + func() (string, error) { err := k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunner.Name, Namespace: ephemeralRunner.Namespace}, er) if err != nil { - return 0, err + return "", err } - return er.Status.WorkflowRunId, nil + return er.Status.JobID, nil }, ephemeralRunnerTimeout, ephemeralRunnerInterval, - ).Should(BeEquivalentTo(int64(1))) + ).Should(BeEquivalentTo("1")) pod := new(corev1.Pod) Eventually(func() (bool, error) { diff --git a/controllers/actions.github.com/ephemeralrunnerset_controller.go b/controllers/actions.github.com/ephemeralrunnerset_controller.go index 8707152d..22730c96 100644 --- a/controllers/actions.github.com/ephemeralrunnerset_controller.go +++ b/controllers/actions.github.com/ephemeralrunnerset_controller.go @@ -454,7 +454,12 @@ func (r *EphemeralRunnerSetReconciler) deleteIdleEphemeralRunners(ctx context.Co } if !isDone && ephemeralRunner.HasJob() { - log.Info("Skipping ephemeral runner since it is running a job", "name", ephemeralRunner.Name, "workflowRunId", ephemeralRunner.Status.WorkflowRunId) + log.Info( + "Skipping ephemeral runner since it is running a job", + "name", ephemeralRunner.Name, + "workflowRunId", ephemeralRunner.Status.WorkflowRunId, + "jobId", ephemeralRunner.Status.JobID, + ) continue } diff --git a/github/actions/types.go b/github/actions/types.go index a77197f6..713096ba 100644 --- a/github/actions/types.go +++ b/github/actions/types.go @@ -37,7 +37,7 @@ type JobAssigned struct { } type JobStarted struct { - RunnerId int `json:"runnerId"` + RunnerID int `json:"runnerId"` RunnerName string `json:"runnerName"` JobMessageBase } @@ -55,12 +55,13 @@ type JobMessageType struct { type JobMessageBase struct { JobMessageType - RunnerRequestId int64 `json:"runnerRequestId"` + RunnerRequestID int64 `json:"runnerRequestId"` RepositoryName string `json:"repositoryName"` OwnerName string `json:"ownerName"` + JobID string `json:"jobId"` JobWorkflowRef string `json:"jobWorkflowRef"` JobDisplayName string `json:"jobDisplayName"` - WorkflowRunId int64 `json:"workflowRunId"` + WorkflowRunID int64 `json:"workflowRunId"` EventName string `json:"eventName"` RequestLabels []string `json:"requestLabels"` QueueTime time.Time `json:"queueTime"`