From 45de6199d12626de6c934444624c24e8f887e8f6 Mon Sep 17 00:00:00 2001 From: fuxiaohei Date: Thu, 17 Nov 2022 19:43:26 +0800 Subject: [PATCH] feat: parse register arguments and do register when non-interactive mode --- cmd/cmd.go | 8 ++++--- cmd/register.go | 64 +++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 59 insertions(+), 13 deletions(-) diff --git a/cmd/cmd.go b/cmd/cmd.go index 0744eb8..2220103 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -45,9 +45,11 @@ func Execute(ctx context.Context) { Args: cobra.MaximumNArgs(0), RunE: runRegister(ctx, ®Args, gArgs.EnvFile), // must use a pointer to regArgs } - registerCmd.Flags().BoolVarP(®Args.NoInteractive, "no-interactive", "", false, "Disable interactive mode") - registerCmd.Flags().StringVarP(®Args.InstanceAddr, "instance", "", "", "Gitea instance address") - registerCmd.Flags().StringVarP(®Args.Token, "token", "", "", "Runner token") + registerCmd.Flags().BoolVar(®Args.NoInteractive, "no-interactive", false, "Disable interactive mode") + registerCmd.Flags().StringVar(®Args.InstanceAddr, "instance", "", "Gitea instance address") + registerCmd.Flags().StringVar(®Args.Token, "token", "", "Runner token") + registerCmd.Flags().StringVar(®Args.RunnerName, "name", "", "Runner name") + registerCmd.Flags().StringVar(®Args.Labels, "labels", "", "Runner tags, comma separated") rootCmd.AddCommand(registerCmd) // ./act_runner daemon diff --git a/cmd/register.go b/cmd/register.go index 9af4fa3..c8c8554 100644 --- a/cmd/register.go +++ b/cmd/register.go @@ -3,6 +3,7 @@ package cmd import ( "bufio" "context" + "fmt" "os" "os/signal" "runtime" @@ -41,18 +42,24 @@ func runRegister(ctx context.Context, regArgs *registerArgs, envFile string) fun log.Warnf("Runner in user-mode.") } - go func() { - if err := registerInteractive(envFile); err != nil { - // log.Errorln(err) - os.Exit(2) - return + if regArgs.NoInteractive { + if err := registerNoInteractive(envFile, regArgs); err != nil { + return err } - os.Exit(0) - }() + } else { + go func() { + if err := registerInteractive(envFile); err != nil { + // log.Errorln(err) + os.Exit(2) + return + } + os.Exit(0) + }() - c := make(chan os.Signal, 1) - signal.Notify(c, os.Interrupt) - <-c + c := make(chan os.Signal, 1) + signal.Notify(c, os.Interrupt) + <-c + } return nil } @@ -63,6 +70,8 @@ type registerArgs struct { NoInteractive bool InstanceAddr string Token string + RunnerName string + Labels string } type registerStage int8 @@ -85,6 +94,16 @@ type registerInputs struct { CustomLabels []string } +func (r *registerInputs) validate() error { + if r.InstanceAddr == "" { + return fmt.Errorf("instance address is empty") + } + if r.Token == "" { + return fmt.Errorf("token is empty") + } + return nil +} + func (r *registerInputs) assignToNext(stage registerStage, value string) registerStage { // must set instance address and token. @@ -191,6 +210,31 @@ func printStageHelp(stage registerStage) { } } +func registerNoInteractive(envFile string, regArgs *registerArgs) error { + _ = godotenv.Load(envFile) + cfg, _ := config.FromEnviron() + inputs := ®isterInputs{ + InstanceAddr: regArgs.InstanceAddr, + Token: regArgs.Token, + RunnerName: regArgs.RunnerName, + CustomLabels: strings.Split(regArgs.Labels, ","), + } + if inputs.RunnerName == "" { + inputs.RunnerName, _ = os.Hostname() + log.Infof("Runner name is empty, use hostname '%s'.", inputs.RunnerName) + } + if err := inputs.validate(); err != nil { + log.WithError(err).Errorf("Invalid input, please re-run act command.") + return nil + } + if err := doRegister(&cfg, inputs); err != nil { + log.Errorf("Failed to register runner: %v", err) + return err + } + log.Infof("Runner registered successfully.") + return nil +} + func doRegister(cfg *config.Config, inputs *registerInputs) error { ctx := context.Background()