2023-02-28 18:44:46 +08:00
// Copyright 2022 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
2022-10-02 12:33:17 +08:00
package config
import (
2023-04-02 22:41:48 +08:00
"fmt"
2022-10-02 12:33:17 +08:00
"os"
2023-04-02 22:41:48 +08:00
"path/filepath"
"time"
2022-11-24 11:55:52 +08:00
2022-10-02 12:33:17 +08:00
"github.com/joho/godotenv"
2023-04-02 22:41:48 +08:00
"gopkg.in/yaml.v3"
2022-10-02 12:33:17 +08:00
)
2023-04-02 22:41:48 +08:00
type Config struct {
Log struct {
Level string ` yaml:"level" `
} ` yaml:"log" `
2022-10-02 12:33:17 +08:00
Runner struct {
2023-04-06 10:57:36 +08:00
File string ` yaml:"file" `
Capacity int ` yaml:"capacity" `
Envs map [ string ] string ` yaml:"envs" `
EnvFile string ` yaml:"env_file" `
Timeout time . Duration ` yaml:"timeout" `
Insecure bool ` yaml:"insecure" `
FetchTimeout time . Duration ` yaml:"fetch_timeout" `
FetchInterval time . Duration ` yaml:"fetch_interval" `
2023-04-02 22:41:48 +08:00
} ` yaml:"runner" `
Cache struct {
Enabled * bool ` yaml:"enabled" ` // pointer to distinguish between false and not set, and it will be true if not set
Dir string ` yaml:"dir" `
Host string ` yaml:"host" `
Port uint16 ` yaml:"port" `
} ` yaml:"cache" `
2023-04-04 14:32:01 +08:00
Container struct {
2023-04-28 22:03:52 +08:00
NetworkMode string ` yaml:"network_mode" `
Privileged bool ` yaml:"privileged" `
Options string ` yaml:"options" `
WorkdirParent string ` yaml:"workdir_parent" `
2023-04-11 10:58:12 +08:00
} ` yaml:"container" `
2023-04-02 22:41:48 +08:00
}
2022-10-02 12:33:17 +08:00
2023-04-02 22:41:48 +08:00
// LoadDefault returns the default configuration.
// If file is not empty, it will be used to load the configuration.
func LoadDefault ( file string ) ( * Config , error ) {
cfg := & Config { }
if file != "" {
f , err := os . Open ( file )
if err != nil {
return nil , err
2022-11-15 22:42:41 +08:00
}
2023-04-02 22:41:48 +08:00
defer f . Close ( )
decoder := yaml . NewDecoder ( f )
if err := decoder . Decode ( & cfg ) ; err != nil {
return nil , err
2023-02-15 16:51:14 +08:00
}
2022-10-15 16:40:35 +08:00
}
2023-04-02 22:41:48 +08:00
compatibleWithOldEnvs ( file != "" , cfg )
2022-10-02 12:33:17 +08:00
2023-04-02 22:41:48 +08:00
if cfg . Runner . EnvFile != "" {
if stat , err := os . Stat ( cfg . Runner . EnvFile ) ; err == nil && ! stat . IsDir ( ) {
envs , err := godotenv . Read ( cfg . Runner . EnvFile )
if err != nil {
return nil , fmt . Errorf ( "read env file %q: %w" , cfg . Runner . EnvFile , err )
}
for k , v := range envs {
cfg . Runner . Envs [ k ] = v
}
2022-11-04 17:23:59 +08:00
}
2022-10-02 12:33:17 +08:00
}
2023-04-02 22:41:48 +08:00
if cfg . Log . Level == "" {
cfg . Log . Level = "info"
2022-10-02 12:33:17 +08:00
}
2023-04-02 22:41:48 +08:00
if cfg . Runner . File == "" {
cfg . Runner . File = ".runner"
2022-10-02 12:33:17 +08:00
}
2023-04-02 22:41:48 +08:00
if cfg . Runner . Capacity <= 0 {
cfg . Runner . Capacity = 1
}
if cfg . Runner . Timeout <= 0 {
cfg . Runner . Timeout = 3 * time . Hour
}
if cfg . Cache . Enabled == nil {
b := true
cfg . Cache . Enabled = & b
}
if * cfg . Cache . Enabled {
if cfg . Cache . Dir == "" {
home , _ := os . UserHomeDir ( )
cfg . Cache . Dir = filepath . Join ( home , ".cache" , "actcache" )
2022-10-02 12:33:17 +08:00
}
}
2023-04-04 21:32:04 +08:00
if cfg . Container . NetworkMode == "" {
cfg . Container . NetworkMode = "bridge"
2023-04-04 14:32:01 +08:00
}
2023-04-28 22:03:52 +08:00
if cfg . Container . WorkdirParent == "" {
cfg . Container . WorkdirParent = "workspace"
}
2023-04-06 10:57:36 +08:00
if cfg . Runner . FetchTimeout <= 0 {
cfg . Runner . FetchTimeout = 5 * time . Second
}
if cfg . Runner . FetchInterval <= 0 {
cfg . Runner . FetchInterval = 2 * time . Second
}
2022-10-02 12:33:17 +08:00
2022-10-15 16:12:32 +08:00
return cfg , nil
2022-10-02 12:33:17 +08:00
}