Skip to content

Commit 44c0638

Browse files
committed
fix rerun and update tests
1 parent da5c5de commit 44c0638

File tree

4 files changed

+235
-113
lines changed

4 files changed

+235
-113
lines changed

models/actions/run.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,14 @@ func UpdateRun(ctx context.Context, run *ActionRun, cols ...string) error {
459459
return nil
460460
}
461461

462+
// UpdateRunEventPayload updates ActionRun.EventPayload for an existing run.
463+
// It is only valid for runs triggered by "workflow_call" (reusable workflows), because only workflow_call runs
464+
// store a reusable-workflow payload whose inputs may need to be refreshed.
465+
func UpdateRunEventPayload(ctx context.Context, repoID, runID int64, payload string) error {
466+
_, err := db.GetEngine(ctx).Exec("UPDATE action_run SET event_payload=? WHERE repo_id=? AND id=? AND trigger_event=?", payload, repoID, runID, "workflow_call")
467+
return err
468+
}
469+
462470
type ActionRunIndex db.ResourceIndex
463471

464472
func GetConcurrentRunsAndJobs(ctx context.Context, repoID int64, concurrencyGroup string, status []Status) ([]*ActionRun, []*ActionRunJob, error) {

services/actions/job_emitter.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ func checkJobsByRunID(ctx context.Context, runID int64) error {
106106
}
107107
}
108108
if job.ChildRunID > 0 && job.Status == actions_model.StatusWaiting {
109+
if err := refreshChildRunEventPayload(ctx, job); err != nil {
110+
log.Error("refresh reusable workflow call payload for parent job %d child run %d: %v", job.ID, job.ChildRunID, err)
111+
}
109112
if err := EmitJobsIfReadyByRun(job.ChildRunID); err != nil {
110113
log.Error("Check jobs of run %d: %v", job.ChildRunID, err)
111114
}

services/actions/reusable_workflow.go

Lines changed: 67 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -73,22 +73,13 @@ func createChildRunFromReusableWorkflow(ctx context.Context, parentJob *actions_
7373
return err
7474
}
7575

76-
workflowCallPayload := &api.WorkflowCallPayload{
77-
Workflow: parentJobRun.WorkflowID,
78-
Ref: parentJobRun.Ref,
79-
Repository: convert.ToRepo(ctx, parentJobRun.Repo, access_model.Permission{AccessMode: perm.AccessModeNone}),
80-
Sender: convert.ToUserWithAccessMode(ctx, parentJobRun.TriggerUser, perm.AccessModeNone),
81-
Inputs: inputsWithDefaults,
82-
Secrets: flattenWorkflowCallSecrets(parentJobRun, secretsMapping),
76+
eventPayload, err := buildWorkflowCallEventPayload(ctx, parentJobRun, inputsWithDefaults, secretsMapping)
77+
if err != nil {
78+
return err
8379
}
8480

8581
childRunTitle := fmt.Sprintf("%s / %s", parentJobRun.Title, parentJob.Name)
8682

87-
var eventPayload []byte
88-
if eventPayload, err = workflowCallPayload.JSONPayload(); err != nil {
89-
return fmt.Errorf("JSONPayload: %w", err)
90-
}
91-
9283
childRun := &actions_model.ActionRun{
9384
Title: childRunTitle,
9485
RepoID: parentJobRun.RepoID,
@@ -119,6 +110,70 @@ func createChildRunFromReusableWorkflow(ctx context.Context, parentJob *actions_
119110
return nil
120111
}
121112

113+
func refreshChildRunEventPayload(ctx context.Context, parentJob *actions_model.ActionRunJob) error {
114+
if parentJob.ChildRunID <= 0 {
115+
return nil
116+
}
117+
if err := parentJob.LoadAttributes(ctx); err != nil {
118+
return err
119+
}
120+
121+
workflowJob, err := parentJob.ParseJob()
122+
if err != nil {
123+
return err
124+
}
125+
ref, err := act_pkg_runner.ParseReusableWorkflowRef(workflowJob.Uses)
126+
if err != nil {
127+
return err
128+
}
129+
content, err := loadReusableWorkflowContent(ctx, parentJob.Run, ref)
130+
if err != nil {
131+
return err
132+
}
133+
134+
vars, err := actions_model.GetVariablesOfRun(ctx, parentJob.Run)
135+
if err != nil {
136+
return err
137+
}
138+
giteaCtx := GenerateGiteaContext(parentJob.Run, parentJob)
139+
inputsWithDefaults, err := buildWorkflowCallInputs(ctx, parentJob, workflowJob, content, vars, giteaCtx)
140+
if err != nil {
141+
return err
142+
}
143+
secretsMapping, err := buildWorkflowCallSecrets(workflowJob, content)
144+
if err != nil {
145+
return err
146+
}
147+
148+
eventPayload, err := buildWorkflowCallEventPayload(ctx, parentJob.Run, inputsWithDefaults, secretsMapping)
149+
if err != nil {
150+
return err
151+
}
152+
153+
return actions_model.UpdateRunEventPayload(ctx, parentJob.RepoID, parentJob.ChildRunID, string(eventPayload))
154+
}
155+
156+
func buildWorkflowCallEventPayload(ctx context.Context, parentRun *actions_model.ActionRun, inputs map[string]any, secretsMapping map[string]string) ([]byte, error) {
157+
if err := parentRun.LoadAttributes(ctx); err != nil {
158+
return nil, err
159+
}
160+
161+
workflowCallPayload := &api.WorkflowCallPayload{
162+
Workflow: parentRun.WorkflowID,
163+
Ref: parentRun.Ref,
164+
Repository: convert.ToRepo(ctx, parentRun.Repo, access_model.Permission{AccessMode: perm.AccessModeNone}),
165+
Sender: convert.ToUserWithAccessMode(ctx, parentRun.TriggerUser, perm.AccessModeNone),
166+
Inputs: inputs,
167+
Secrets: flattenWorkflowCallSecrets(parentRun, secretsMapping),
168+
}
169+
170+
eventPayload, err := workflowCallPayload.JSONPayload()
171+
if err != nil {
172+
return nil, fmt.Errorf("JSONPayload: %w", err)
173+
}
174+
return eventPayload, nil
175+
}
176+
122177
func buildWorkflowCallInputs(ctx context.Context, parentJob *actions_model.ActionRunJob, workflowJob *jobparser.Job, content []byte, vars map[string]string, giteaCtx GiteaContext) (map[string]any, error) {
123178
singleWorkflow := &jobparser.SingleWorkflow{}
124179
if err := yaml.Unmarshal(content, singleWorkflow); err != nil {

0 commit comments

Comments
 (0)