From 7bebd2bbadd10171b355306a25294cb9576ffb9b Mon Sep 17 00:00:00 2001
From: Bo-Yi Wu <appleboy.tw@gmail.com>
Date: Fri, 14 Oct 2022 10:55:49 +0800
Subject: [PATCH] chore(runner): update runner status when start job

---
 poller/poller.go    |  6 ++++--
 runtime/reporter.go |  7 ++-----
 runtime/runtime.go  | 26 ++++++++++++++++++++++++++
 3 files changed, 32 insertions(+), 7 deletions(-)

diff --git a/poller/poller.go b/poller/poller.go
index a4b725a..f9c46bd 100644
--- a/poller/poller.go
+++ b/poller/poller.go
@@ -16,8 +16,10 @@ import (
 	log "github.com/sirupsen/logrus"
 )
 
-const errorRetryCounterLimit = 3
-const errorRetryTimeSleepSecs = 30
+const (
+	errorRetryCounterLimit  = 3
+	errorRetryTimeSleepSecs = 30
+)
 
 var (
 	ErrDataLock   = errors.New("Data Lock Error")
diff --git a/runtime/reporter.go b/runtime/reporter.go
index b530f85..be5c3e5 100644
--- a/runtime/reporter.go
+++ b/runtime/reporter.go
@@ -170,15 +170,12 @@ func (r *Reporter) Close(lastWords string) error {
 	}
 	r.stateM.Unlock()
 
-	if err := retry.Do(func() error {
+	return retry.Do(func() error {
 		if err := r.ReportLog(true); err != nil {
 			return err
 		}
 		return r.ReportState()
-	}, retry.Context(r.ctx)); err != nil {
-		return err
-	}
-	return nil
+	}, retry.Context(r.ctx))
 }
 
 func (r *Reporter) ReportLog(noMore bool) error {
diff --git a/runtime/runtime.go b/runtime/runtime.go
index 37b16c5..18bee20 100644
--- a/runtime/runtime.go
+++ b/runtime/runtime.go
@@ -6,6 +6,7 @@ import (
 	"gitea.com/gitea/act_runner/client"
 	runnerv1 "gitea.com/gitea/proto-go/runner/v1"
 
+	"github.com/bufbuild/connect-go"
 	log "github.com/sirupsen/logrus"
 )
 
@@ -22,5 +23,30 @@ func (s *Runner) Run(ctx context.Context, task *runnerv1.Task) error {
 		WithField("task.id", task.Id)
 	l.Info("start running pipeline")
 
+	// update runner status
+	// running: idle -> active
+	// stopped: active -> idle
+	if _, err := s.Client.UpdateRunner(
+		ctx,
+		connect.NewRequest(&runnerv1.UpdateRunnerRequest{
+			Status: runnerv1.RunnerStatus_RUNNER_STATUS_ACTIVE,
+		}),
+	); err != nil {
+		return err
+	}
+
+	l.Info("update runner status to active")
+	defer func() {
+		if _, err := s.Client.UpdateRunner(
+			ctx,
+			connect.NewRequest(&runnerv1.UpdateRunnerRequest{
+				Status: runnerv1.RunnerStatus_RUNNER_STATUS_IDLE,
+			}),
+		); err != nil {
+			log.Errorln("update status error:", err.Error())
+		}
+		l.Info("update runner status to idle")
+	}()
+
 	return NewTask(task.Id, s.Client).Run(ctx, task)
 }