2022-05-02 17:02:51 +08:00
package cmd
import (
"context"
"time"
2022-08-13 22:41:01 +08:00
"gitea.com/gitea/act_runner/client"
2022-10-02 12:33:17 +08:00
"gitea.com/gitea/act_runner/config"
2022-08-13 14:15:21 +08:00
"gitea.com/gitea/act_runner/engine"
2022-08-14 10:34:19 +08:00
"gitea.com/gitea/act_runner/poller"
2022-08-14 13:29:00 +08:00
"gitea.com/gitea/act_runner/runtime"
2022-09-25 18:54:00 +08:00
pingv1 "gitea.com/gitea/proto-go/ping/v1"
2022-10-14 10:06:52 +08:00
runnerv1 "gitea.com/gitea/proto-go/runner/v1"
2022-09-25 18:54:00 +08:00
"github.com/bufbuild/connect-go"
2022-08-13 14:15:21 +08:00
"github.com/joho/godotenv"
log "github.com/sirupsen/logrus"
2022-05-02 17:02:51 +08:00
"github.com/spf13/cobra"
2022-08-14 13:29:00 +08:00
"golang.org/x/sync/errgroup"
2022-05-02 17:02:51 +08:00
)
2022-08-23 20:34:47 +08:00
func runDaemon ( ctx context . Context , task * runtime . Task ) func ( cmd * cobra . Command , args [ ] string ) error {
2022-05-02 17:02:51 +08:00
return func ( cmd * cobra . Command , args [ ] string ) error {
2022-08-13 14:15:21 +08:00
log . Infoln ( "Starting runner daemon" )
2022-08-23 20:34:47 +08:00
_ = godotenv . Load ( task . Input . EnvFile )
2022-10-02 12:33:17 +08:00
cfg , err := config . FromEnviron ( )
2022-08-13 14:15:21 +08:00
if err != nil {
log . WithError ( err ) .
Fatalln ( "invalid configuration" )
}
initLogging ( cfg )
2022-08-23 20:34:47 +08:00
// try to connect to docker daemon
// if failed, exit with error
if err := engine . Start ( ctx ) ; err != nil {
log . WithError ( err ) . Fatalln ( "failed to connect docker daemon engine" )
2022-08-13 22:41:01 +08:00
}
cli := client . New (
cfg . Client . Address ,
cfg . Client . Secret ,
2022-09-25 18:54:00 +08:00
client . WithSkipVerify ( cfg . Client . SkipVerify ) ,
2022-08-14 10:59:09 +08:00
client . WithGRPC ( cfg . Client . GRPC ) ,
client . WithGRPCWeb ( cfg . Client . GRPCWeb ) ,
2022-08-13 22:41:01 +08:00
)
for {
2022-09-25 18:54:00 +08:00
_ , err := cli . Ping ( ctx , connect . NewRequest ( & pingv1 . PingRequest {
Data : cfg . Runner . Name ,
} ) )
2022-08-13 22:41:01 +08:00
select {
case <- ctx . Done ( ) :
return nil
default :
}
if ctx . Err ( ) != nil {
break
}
if err != nil {
log . WithError ( err ) .
Errorln ( "cannot ping the remote server" )
2022-08-23 20:34:47 +08:00
// TODO: if ping failed, retry or exit
2022-08-13 22:41:01 +08:00
time . Sleep ( time . Second )
} else {
log . Infoln ( "successfully pinged the remote server" )
2022-08-13 14:15:21 +08:00
break
2022-05-02 17:02:51 +08:00
}
}
2022-08-13 14:15:21 +08:00
2022-08-14 10:34:19 +08:00
var g errgroup . Group
2022-08-14 13:29:00 +08:00
runner := & runtime . Runner {
Client : cli ,
Machine : cfg . Runner . Name ,
Environ : cfg . Runner . Environ ,
}
2022-08-28 14:05:56 +08:00
poller := poller . New (
cli ,
runner . Run ,
& client . Filter {
2022-10-02 12:33:17 +08:00
OS : cfg . Platform . OS ,
Arch : cfg . Platform . Arch ,
Labels : cfg . Runner . Labels ,
2022-08-28 14:05:56 +08:00
} ,
)
2022-08-14 10:34:19 +08:00
g . Go ( func ( ) error {
log . WithField ( "capacity" , cfg . Runner . Capacity ) .
WithField ( "endpoint" , cfg . Client . Address ) .
WithField ( "os" , cfg . Platform . OS ) .
WithField ( "arch" , cfg . Platform . Arch ) .
Infoln ( "polling the remote server" )
2022-10-02 12:33:17 +08:00
// register new runner
if err := poller . Register ( ctx , cfg . Runner ) ; err != nil {
return err
}
2022-10-14 10:06:52 +08:00
// update runner status to idle
log . Infoln ( "update runner status to idle" )
if _ , err := cli . UpdateRunner (
context . Background ( ) ,
connect . NewRequest ( & runnerv1 . UpdateRunnerRequest {
Status : runnerv1 . RunnerStatus_RUNNER_STATUS_OFFLINE ,
} ) ,
) ; err != nil {
return err
}
2022-08-28 14:05:56 +08:00
return poller . Poll ( ctx , cfg . Runner . Capacity )
2022-08-14 10:34:19 +08:00
} )
2022-10-14 10:06:52 +08:00
g . Go ( func ( ) error {
<- ctx . Done ( )
log . Infoln ( "update runner status to offline" )
_ , err := cli . UpdateRunner (
context . Background ( ) ,
connect . NewRequest ( & runnerv1 . UpdateRunnerRequest {
Status : runnerv1 . RunnerStatus_RUNNER_STATUS_OFFLINE ,
} ) ,
)
return err
} )
2022-08-14 10:34:19 +08:00
err = g . Wait ( )
if err != nil {
log . WithError ( err ) .
Errorln ( "shutting down the server" )
}
return err
2022-05-02 17:02:51 +08:00
}
}