From 1a231887becc0f5c0cde58698760d7202466222e Mon Sep 17 00:00:00 2001 From: ChristopherHX Date: Thu, 16 Feb 2023 15:25:08 +0100 Subject: [PATCH 1/4] Adjust RunnerJobRequest support --- actionsdotnetactcompat/act_runner.go | 4 +--- actionsdotnetactcompat/act_worker.go | 13 ++++-------- actionsrunner/runner.go | 12 +++++++---- actionsrunner/worker_context.go | 31 ++++++++++++++++++++++++++++ main.go | 2 +- 5 files changed, 45 insertions(+), 17 deletions(-) diff --git a/actionsdotnetactcompat/act_runner.go b/actionsdotnetactcompat/act_runner.go index 48f5592..1099c78 100644 --- a/actionsdotnetactcompat/act_runner.go +++ b/actionsdotnetactcompat/act_runner.go @@ -10,10 +10,8 @@ type ActRunner struct { } func (arunner *ActRunner) ExecWorker(run *actionsrunner.RunRunner, wc actionsrunner.WorkerContext, jobreq *protocol.AgentJobRequestMessage, src []byte) error { - jlogger := wc.Logger() - jobExecCtx := wc.JobExecCtx() if len(arunner.WorkerArgs) <= 0 { - ExecWorker(jobreq, jlogger, jobExecCtx) + ExecWorker(jobreq, wc) return nil } return arunner.WorkerRunnerEnvironment.ExecWorker(run, wc, jobreq, src) diff --git a/actionsdotnetactcompat/act_worker.go b/actionsdotnetactcompat/act_worker.go index b9aa31f..5d4dbcf 100644 --- a/actionsdotnetactcompat/act_worker.go +++ b/actionsdotnetactcompat/act_worker.go @@ -100,7 +100,9 @@ func (f *ghaFormatter) Format(entry *logrus.Entry) ([]byte, error) { return b.Bytes(), nil } -func ExecWorker(rqt *protocol.AgentJobRequestMessage, jlogger *protocol.JobLogger, jobExecCtx context.Context) { +func ExecWorker(rqt *protocol.AgentJobRequestMessage, wc actionsrunner.WorkerContext) { + jlogger := wc.Logger() + jobExecCtx := wc.JobExecCtx() logger := logrus.New() logger.SetOutput(jlogger) formatter := &ghaFormatter{ @@ -114,14 +116,7 @@ func ExecWorker(rqt *protocol.AgentJobRequestMessage, jlogger *protocol.JobLogge jlogger.TimelineRecords.Value[0].Complete(result) jlogger.Logger.Close() jlogger.Finish() - finish := &protocol.JobEvent{ - Name: "JobCompleted", - JobID: rqt.JobID, - RequestID: rqt.RequestID, - Result: result, - Outputs: outputs, - } - vssConnection.FinishJob(finish, rqt.Plan) + wc.FinishJob(result, outputs) } finishJob := func(result string) { finishJob2(result, &map[string]protocol.VariableValue{}) diff --git a/actionsrunner/runner.go b/actionsrunner/runner.go index 14a79d1..1569c5d 100644 --- a/actionsrunner/runner.go +++ b/actionsrunner/runner.go @@ -36,6 +36,7 @@ type JobRun struct { Plan *protocol.TaskOrchestrationPlanReference Name string RegistrationURL string + RunServiceURL string } type RunnerEnvironment interface { @@ -439,6 +440,7 @@ func runJob(runnerenv RunnerEnvironment, joblock *sync.Mutex, vssConnection *pro plogger.Printf("%v\n", string(src)) } jobreq := &protocol.AgentJobRequestMessage{} + var runServiceUrl string { if strings.EqualFold(message.MessageType, "RunnerJobRequest") { rjrr := &RunnerJobRequestRef{} @@ -452,13 +454,14 @@ func runJob(runnerenv RunnerEnvironment, joblock *sync.Mutex, vssConnection *pro } else { copy := *vssConnection vssConnection = © - vssConnection.Token = "" - runServiceUrl, _ := url.ParseRequestURI(rjrr.RunServiceUrl) - vssConnection.TenantURL = runServiceUrl.Host + runServiceUrl = rjrr.RunServiceUrl + acquirejobUrl, _ := url.Parse(runServiceUrl) + acquirejobUrl.Path = path.Join(acquirejobUrl.Path, "acquirejob") + vssConnection.TenantURL = runServiceUrl payload := &RunnerServicePayload{ StreamID: rjrr.RunnerRequestId, } - err = vssConnection.RequestWithContext2(jobctx, "POST", rjrr.RunServiceUrl, "", payload, &src) + err = vssConnection.RequestWithContext2(jobctx, "POST", acquirejobUrl.String(), "", payload, &src) } if err == nil { json.Unmarshal(src, jobreq) @@ -476,6 +479,7 @@ func runJob(runnerenv RunnerEnvironment, joblock *sync.Mutex, vssConnection *pro Plan: jobreq.Plan, RegistrationURL: instance.RegistrationURL, Name: instance.Agent.Name, + RunServiceURL: runServiceUrl, } { // TODO multi repository runners can receive multiple job requests at the same time and this protection doesn't work there diff --git a/actionsrunner/worker_context.go b/actionsrunner/worker_context.go index b0a1417..741160b 100644 --- a/actionsrunner/worker_context.go +++ b/actionsrunner/worker_context.go @@ -24,6 +24,37 @@ type DefaultWorkerContext struct { } func (wc *DefaultWorkerContext) FinishJob(result string, outputs *map[string]protocol.VariableValue) { + if strings.EqualFold(wc.Message().MessageType, "RunnerJobRequest") { + payload := struct { + PlanID string + JobID string + Conclusion string + Outputs *map[string]protocol.VariableValue + }{ + PlanID: wc.Message().Plan.PlanID, + JobID: wc.Message().JobID, + Conclusion: result, + Outputs: outputs, + } + + completejobUrl, _ := url.Parse(wc.VssConnection.TenantURL) + completejobUrl.Path = path.Join(completejobUrl.Path, "completejob") + for i := 0; ; i++ { + if err := vssConnection.RequestWithContext2(jobctx, "POST", completejobUrl.String(), "", payload, &src); err != nil { + wc.RunnerLogger.Printf("Failed to finish Job '%v' with Status %v: %v\n", wc.Message().JobDisplayName, result, err.Error()) + } else { + wc.RunnerLogger.Printf("Finished Job '%v' with Status %v\n", wc.Message().JobDisplayName, result) + break + } + if i < 10 { + wc.RunnerLogger.Printf("Retry finishing '%v' in 10 seconds attempt %v of 10\n", wc.Message().JobDisplayName, i+1) + <-time.After(time.Second * 10) + } else { + break + } + } + return + } finish := &protocol.JobEvent{ Name: "JobCompleted", JobID: wc.Message().JobID, diff --git a/main.go b/main.go index aefce8e..c03107b 100644 --- a/main.go +++ b/main.go @@ -303,7 +303,7 @@ func main() { wc.Init() wc.Logger().Append(protocol.CreateTimelineEntry(jobreq.JobID, "__setup", "Set up Job")).Start() wc.Logger().Update() - actionsdotnetactcompat.ExecWorker(jobreq, wc.Logger(), execcontext) + actionsdotnetactcompat.ExecWorker(jobreq, wc) logf.WriteString("Finish Job\n") }() default: From 6434ac42f8fb938704d5210df8b74ccaeebb9392 Mon Sep 17 00:00:00 2001 From: ChristopherHX Date: Thu, 16 Feb 2023 15:36:17 +0100 Subject: [PATCH 2/4] . --- actionsrunner/runner.go | 1 + actionsrunner/worker_context.go | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/actionsrunner/runner.go b/actionsrunner/runner.go index 1569c5d..8dbe7f2 100644 --- a/actionsrunner/runner.go +++ b/actionsrunner/runner.go @@ -12,6 +12,7 @@ import ( "net/http" "net/url" "os" + "path" "runtime" "runtime/debug" "strings" diff --git a/actionsrunner/worker_context.go b/actionsrunner/worker_context.go index 741160b..672b3f4 100644 --- a/actionsrunner/worker_context.go +++ b/actionsrunner/worker_context.go @@ -2,7 +2,10 @@ package actionsrunner import ( "context" + "path" + "strings" "time" + "url" "github.com/ChristopherHX/github-act-runner/protocol" ) @@ -40,7 +43,7 @@ func (wc *DefaultWorkerContext) FinishJob(result string, outputs *map[string]pro completejobUrl, _ := url.Parse(wc.VssConnection.TenantURL) completejobUrl.Path = path.Join(completejobUrl.Path, "completejob") for i := 0; ; i++ { - if err := vssConnection.RequestWithContext2(jobctx, "POST", completejobUrl.String(), "", payload, &src); err != nil { + if err := wc.VssConnection.RequestWithContext2(context.Background(), "POST", completejobUrl.String(), "", payload, nil); err != nil { wc.RunnerLogger.Printf("Failed to finish Job '%v' with Status %v: %v\n", wc.Message().JobDisplayName, result, err.Error()) } else { wc.RunnerLogger.Printf("Finished Job '%v' with Status %v\n", wc.Message().JobDisplayName, result) From 887ecb9dbacfe4a7493eb91e65cef1b8a46d4017 Mon Sep 17 00:00:00 2001 From: ChristopherHX Date: Thu, 16 Feb 2023 15:37:43 +0100 Subject: [PATCH 3/4] . --- actionsrunner/worker_context.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actionsrunner/worker_context.go b/actionsrunner/worker_context.go index 672b3f4..aca667b 100644 --- a/actionsrunner/worker_context.go +++ b/actionsrunner/worker_context.go @@ -5,7 +5,7 @@ import ( "path" "strings" "time" - "url" + "net/url" "github.com/ChristopherHX/github-act-runner/protocol" ) From 056567b403172e4bd44ca3957a11d93f117569af Mon Sep 17 00:00:00 2001 From: ChristopherHX Date: Thu, 16 Feb 2023 15:40:24 +0100 Subject: [PATCH 4/4] . --- actionsdotnetactcompat/act_worker.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actionsdotnetactcompat/act_worker.go b/actionsdotnetactcompat/act_worker.go index 5d4dbcf..20d8344 100644 --- a/actionsdotnetactcompat/act_worker.go +++ b/actionsdotnetactcompat/act_worker.go @@ -2,7 +2,6 @@ package actionsdotnetactcompat import ( "bytes" - "context" "encoding/json" "fmt" "os" @@ -10,6 +9,7 @@ import ( "runtime" "strings" + "github.com/ChristopherHX/github-act-runner/actionsrunner" "github.com/ChristopherHX/github-act-runner/protocol" "github.com/google/uuid" "github.com/nektos/act/pkg/common"