2022-10-02 12:33:17 +08:00
package config
import (
"fmt"
"net/url"
"os"
"runtime"
"github.com/joho/godotenv"
"github.com/kelseyhightower/envconfig"
)
type (
// Config provides the system configuration.
Config struct {
Debug bool ` envconfig:"GITEA_DEBUG" `
Trace bool ` envconfig:"GITEA_TRACE" `
Client Client
Runner Runner
Platform Platform
}
Client struct {
Address string ` ignored:"true" `
Proto string ` envconfig:"GITEA_RPC_PROTO" default:"http" `
Host string ` envconfig:"GITEA_RPC_HOST" `
Secret string ` envconfig:"GITEA_RPC_SECRET" `
SkipVerify bool ` envconfig:"GITEA_RPC_SKIP_VERIFY" `
GRPC bool ` envconfig:"GITEA_RPC_GRPC" default:"true" `
GRPCWeb bool ` envconfig:"GITEA_RPC_GRPC_WEB" `
}
Runner struct {
Name string ` envconfig:"GITEA_RUNNER_NAME" `
2022-10-07 20:59:02 +08:00
URL string ` envconfig:"GITEA_RUNNER_URL" required:"true" `
Token string ` envconfig:"GITEA_RUNNER_TOKEN" required:"true" `
2022-10-02 12:33:17 +08:00
Capacity int ` envconfig:"GITEA_RUNNER_CAPACITY" default:"1" `
Environ map [ string ] string ` envconfig:"GITEA_RUNNER_ENVIRON" `
EnvFile string ` envconfig:"GITEA_RUNNER_ENV_FILE" `
Labels [ ] string ` envconfig:"GITEA_RUNNER_LABELS" `
}
Platform struct {
OS string ` envconfig:"GITEA_PLATFORM_OS" `
Arch string ` envconfig:"GITEA_PLATFORM_ARCH" `
Kernel string ` envconfig:"GITEA_PLATFORM_KERNEL" `
Variant string ` envconfig:"GITEA_PLATFORM_VARIANT" `
}
)
// FromEnviron returns the settings from the environment.
func FromEnviron ( ) ( Config , error ) {
cfg := Config { }
if err := envconfig . Process ( "" , & cfg ) ; err != nil {
return cfg , err
}
// check runner remote url
u , err := url . Parse ( cfg . Runner . URL )
if err != nil {
return cfg , err
}
cfg . Client . Proto = u . Scheme
cfg . Client . Host = u . Host
cfg . Client . Secret = cfg . Runner . Token
// runner config
if cfg . Runner . Environ == nil {
cfg . Runner . Environ = map [ string ] string { }
}
if cfg . Runner . Name == "" {
cfg . Runner . Name , _ = os . Hostname ( )
}
// platform config
if cfg . Platform . OS == "" {
cfg . Platform . OS = runtime . GOOS
}
if cfg . Platform . Arch == "" {
cfg . Platform . Arch = runtime . GOARCH
}
cfg . Client . Address = fmt . Sprintf (
"%s://%s" ,
cfg . Client . Proto ,
cfg . Client . Host ,
)
if file := cfg . Runner . EnvFile ; file != "" {
envs , err := godotenv . Read ( file )
if err != nil {
return cfg , err
}
for k , v := range envs {
cfg . Runner . Environ [ k ] = v
}
}
return cfg , err
}