github.skymusic.top/goreleaser/goreleaser@v0.92.0/pkg/config/config.go (about)

     1  // Package config contains the model and loader of the goreleaser configuration
     2  // file.
     3  package config
     4  
     5  import (
     6  	"io"
     7  	"io/ioutil"
     8  	"os"
     9  	"strings"
    10  
    11  	"github.com/apex/log"
    12  	"gopkg.in/yaml.v2"
    13  )
    14  
    15  // GitHubURLs holds the URLs to be used when using github enterprise
    16  type GitHubURLs struct {
    17  	API      string `yaml:"api,omitempty"`
    18  	Upload   string `yaml:"upload,omitempty"`
    19  	Download string `yaml:"download,omitempty"`
    20  }
    21  
    22  // Repo represents any kind of repo (github, gitlab, etc)
    23  type Repo struct {
    24  	Owner string `yaml:",omitempty"`
    25  	Name  string `yaml:",omitempty"`
    26  }
    27  
    28  // String of the repo, e.g. owner/name
    29  func (r Repo) String() string {
    30  	if r.Owner == "" && r.Name == "" {
    31  		return ""
    32  	}
    33  	return r.Owner + "/" + r.Name
    34  }
    35  
    36  // Homebrew contains the brew section
    37  type Homebrew struct {
    38  	Name             string       `yaml:",omitempty"`
    39  	GitHub           Repo         `yaml:",omitempty"`
    40  	CommitAuthor     CommitAuthor `yaml:"commit_author,omitempty"`
    41  	Folder           string       `yaml:",omitempty"`
    42  	Caveats          string       `yaml:",omitempty"`
    43  	Plist            string       `yaml:",omitempty"`
    44  	Install          string       `yaml:",omitempty"`
    45  	Dependencies     []string     `yaml:",omitempty"`
    46  	Test             string       `yaml:",omitempty"`
    47  	Conflicts        []string     `yaml:",omitempty"`
    48  	Description      string       `yaml:",omitempty"`
    49  	Homepage         string       `yaml:",omitempty"`
    50  	SkipUpload       bool         `yaml:"skip_upload,omitempty"`
    51  	DownloadStrategy string       `yaml:"download_strategy,omitempty"`
    52  	SourceTarball    string       `yaml:"-"`
    53  	URLTemplate      string       `yaml:"url_template,omitempty"`
    54  }
    55  
    56  // Scoop contains the scoop.sh section
    57  type Scoop struct {
    58  	Name         string       `yaml:",omitempty"`
    59  	Bucket       Repo         `yaml:",omitempty"`
    60  	CommitAuthor CommitAuthor `yaml:"commit_author,omitempty"`
    61  	Homepage     string       `yaml:",omitempty"`
    62  	Description  string       `yaml:",omitempty"`
    63  	License      string       `yaml:",omitempty"`
    64  	URLTemplate  string       `yaml:"url_template,omitempty"`
    65  	Persist      []string     `yaml:"persist,omitempty"`
    66  }
    67  
    68  // CommitAuthor is the author of a Git commit
    69  type CommitAuthor struct {
    70  	Name  string `yaml:",omitempty"`
    71  	Email string `yaml:",omitempty"`
    72  }
    73  
    74  // Hooks define actions to run before and/or after something
    75  type Hooks struct {
    76  	Pre  string `yaml:",omitempty"`
    77  	Post string `yaml:",omitempty"`
    78  }
    79  
    80  // IgnoredBuild represents a build ignored by the user
    81  type IgnoredBuild struct {
    82  	Goos, Goarch, Goarm string
    83  }
    84  
    85  // StringArray is a wrapper for an array of strings
    86  type StringArray []string
    87  
    88  // UnmarshalYAML is a custom unmarshaler that wraps strings in arrays
    89  func (a *StringArray) UnmarshalYAML(unmarshal func(interface{}) error) error {
    90  	var strings []string
    91  	if err := unmarshal(&strings); err != nil {
    92  		var str string
    93  		if err := unmarshal(&str); err != nil {
    94  			return err
    95  		}
    96  		*a = []string{str}
    97  	} else {
    98  		*a = strings
    99  	}
   100  	return nil
   101  }
   102  
   103  // FlagArray is a wrapper for an array of strings
   104  type FlagArray []string
   105  
   106  // UnmarshalYAML is a custom unmarshaler that wraps strings in arrays
   107  func (a *FlagArray) UnmarshalYAML(unmarshal func(interface{}) error) error {
   108  	var flags []string
   109  	if err := unmarshal(&flags); err != nil {
   110  		var flagstr string
   111  		if err := unmarshal(&flagstr); err != nil {
   112  			return err
   113  		}
   114  		*a = strings.Fields(flagstr)
   115  	} else {
   116  		*a = flags
   117  	}
   118  	return nil
   119  }
   120  
   121  // Build contains the build configuration section
   122  type Build struct {
   123  	Goos     []string       `yaml:",omitempty"`
   124  	Goarch   []string       `yaml:",omitempty"`
   125  	Goarm    []string       `yaml:",omitempty"`
   126  	Targets  []string       `yaml:",omitempty"`
   127  	Ignore   []IgnoredBuild `yaml:",omitempty"`
   128  	Main     string         `yaml:",omitempty"`
   129  	Ldflags  StringArray    `yaml:",omitempty"`
   130  	Flags    FlagArray      `yaml:",omitempty"`
   131  	Binary   string         `yaml:",omitempty"`
   132  	Hooks    Hooks          `yaml:",omitempty"`
   133  	Env      []string       `yaml:",omitempty"`
   134  	Lang     string         `yaml:",omitempty"`
   135  	Asmflags StringArray    `yaml:",omitempty"`
   136  	Gcflags  StringArray    `yaml:",omitempty"`
   137  }
   138  
   139  // FormatOverride is used to specify a custom format for a specific GOOS.
   140  type FormatOverride struct {
   141  	Goos   string `yaml:",omitempty"`
   142  	Format string `yaml:",omitempty"`
   143  }
   144  
   145  // Archive config used for the archive
   146  type Archive struct {
   147  	NameTemplate string            `yaml:"name_template,omitempty"`
   148  	Replacements map[string]string `yaml:",omitempty"`
   149  
   150  	Format          string           `yaml:",omitempty"`
   151  	FormatOverrides []FormatOverride `yaml:"format_overrides,omitempty"`
   152  	WrapInDirectory bool             `yaml:"wrap_in_directory,omitempty"`
   153  	Files           []string         `yaml:",omitempty"`
   154  }
   155  
   156  // Release config used for the GitHub release
   157  type Release struct {
   158  	GitHub       Repo   `yaml:",omitempty"`
   159  	Draft        bool   `yaml:",omitempty"`
   160  	Prerelease   bool   `yaml:",omitempty"`
   161  	Disable      bool   `yaml:",omitempty"`
   162  	NameTemplate string `yaml:"name_template,omitempty"`
   163  }
   164  
   165  // NFPM config
   166  type NFPM struct {
   167  	NFPMOverridables `yaml:",inline"`
   168  	Overrides        map[string]NFPMOverridables `yaml:"overrides,omitempty"`
   169  
   170  	Formats     []string `yaml:",omitempty"`
   171  	Vendor      string   `yaml:",omitempty"`
   172  	Homepage    string   `yaml:",omitempty"`
   173  	Maintainer  string   `yaml:",omitempty"`
   174  	Description string   `yaml:",omitempty"`
   175  	License     string   `yaml:",omitempty"`
   176  	Bindir      string   `yaml:",omitempty"`
   177  }
   178  
   179  // NFPMScripts is used to specify maintainer scripts
   180  type NFPMScripts struct {
   181  	PreInstall  string `yaml:"preinstall,omitempty"`
   182  	PostInstall string `yaml:"postinstall,omitempty"`
   183  	PreRemove   string `yaml:"preremove,omitempty"`
   184  	PostRemove  string `yaml:"postremove,omitempty"`
   185  }
   186  
   187  // NFPMOverridables is used to specify per package format settings
   188  type NFPMOverridables struct {
   189  	NameTemplate string            `yaml:"name_template,omitempty"`
   190  	Replacements map[string]string `yaml:",omitempty"`
   191  	Dependencies []string          `yaml:",omitempty"`
   192  	Recommends   []string          `yaml:",omitempty"`
   193  	Suggests     []string          `yaml:",omitempty"`
   194  	Conflicts    []string          `yaml:",omitempty"`
   195  	EmptyFolders []string          `yaml:"empty_folders,omitempty"`
   196  	Files        map[string]string `yaml:",omitempty"`
   197  	ConfigFiles  map[string]string `yaml:"config_files,omitempty"`
   198  	Scripts      NFPMScripts       `yaml:"scripts,omitempty"`
   199  }
   200  
   201  // Sign config
   202  type Sign struct {
   203  	Cmd       string   `yaml:"cmd,omitempty"`
   204  	Args      []string `yaml:"args,omitempty"`
   205  	Signature string   `yaml:"signature,omitempty"`
   206  	Artifacts string   `yaml:"artifacts,omitempty"`
   207  }
   208  
   209  // SnapcraftAppMetadata for the binaries that will be in the snap package
   210  type SnapcraftAppMetadata struct {
   211  	Plugs  []string
   212  	Daemon string
   213  	Args   string
   214  }
   215  
   216  // Snapcraft config
   217  type Snapcraft struct {
   218  	NameTemplate string            `yaml:"name_template,omitempty"`
   219  	Replacements map[string]string `yaml:",omitempty"`
   220  	Publish      bool              `yaml:",omitempty"`
   221  
   222  	Name        string                          `yaml:",omitempty"`
   223  	Summary     string                          `yaml:",omitempty"`
   224  	Description string                          `yaml:",omitempty"`
   225  	Grade       string                          `yaml:",omitempty"`
   226  	Confinement string                          `yaml:",omitempty"`
   227  	Apps        map[string]SnapcraftAppMetadata `yaml:",omitempty"`
   228  }
   229  
   230  // Snapshot config
   231  type Snapshot struct {
   232  	NameTemplate string `yaml:"name_template,omitempty"`
   233  }
   234  
   235  // Checksum config
   236  type Checksum struct {
   237  	NameTemplate string `yaml:"name_template,omitempty"`
   238  }
   239  
   240  // Docker image config
   241  type Docker struct {
   242  	Binary             string   `yaml:",omitempty"`
   243  	Goos               string   `yaml:",omitempty"`
   244  	Goarch             string   `yaml:",omitempty"`
   245  	Goarm              string   `yaml:",omitempty"`
   246  	Image              string   `yaml:",omitempty"`
   247  	Dockerfile         string   `yaml:",omitempty"`
   248  	ImageTemplates     []string `yaml:"image_templates,omitempty"`
   249  	SkipPush           bool     `yaml:"skip_push,omitempty"`
   250  	TagTemplates       []string `yaml:"tag_templates,omitempty"`
   251  	Files              []string `yaml:"extra_files,omitempty"`
   252  	BuildFlagTemplates []string `yaml:"build_flag_templates,omitempty"`
   253  }
   254  
   255  // Filters config
   256  type Filters struct {
   257  	Exclude []string `yaml:",omitempty"`
   258  }
   259  
   260  // Changelog Config
   261  type Changelog struct {
   262  	Filters Filters `yaml:",omitempty"`
   263  	Sort    string  `yaml:",omitempty"`
   264  }
   265  
   266  // EnvFiles holds paths to files that contains environment variables
   267  // values like the github token for example
   268  type EnvFiles struct {
   269  	GitHubToken string `yaml:"github_token,omitempty"`
   270  }
   271  
   272  // Git config
   273  type Git struct {
   274  	ShortHash bool `yaml:"short_hash,omitempty"`
   275  }
   276  
   277  // Before config
   278  type Before struct {
   279  	Hooks []string `yaml:",omitempty"`
   280  }
   281  
   282  // S3 contains s3 config
   283  type S3 struct {
   284  	Region   string
   285  	Bucket   string
   286  	Folder   string
   287  	Profile  string
   288  	Endpoint string // used for minio for example
   289  	ACL      string
   290  }
   291  
   292  // Put HTTP upload configuration
   293  type Put struct {
   294  	Name           string `yaml:",omitempty"`
   295  	Target         string `yaml:",omitempty"`
   296  	Username       string `yaml:",omitempty"`
   297  	Mode           string `yaml:",omitempty"`
   298  	ChecksumHeader string `yaml:"checksum_header,omitempty"`
   299  	TrustedCerts   string `yaml:"trusted_certificates,omitempty"`
   300  	Checksum       bool   `yaml:",omitempty"`
   301  	Signature      bool   `yaml:",omitempty"`
   302  }
   303  
   304  // Project includes all project configuration
   305  type Project struct {
   306  	ProjectName   string    `yaml:"project_name,omitempty"`
   307  	Release       Release   `yaml:",omitempty"`
   308  	Brew          Homebrew  `yaml:",omitempty"`
   309  	Scoop         Scoop     `yaml:",omitempty"`
   310  	Builds        []Build   `yaml:",omitempty"`
   311  	Archive       Archive   `yaml:",omitempty"`
   312  	NFPM          NFPM      `yaml:",omitempty"`
   313  	Snapcraft     Snapcraft `yaml:",omitempty"`
   314  	Snapshot      Snapshot  `yaml:",omitempty"`
   315  	Checksum      Checksum  `yaml:",omitempty"`
   316  	Dockers       []Docker  `yaml:",omitempty"`
   317  	Artifactories []Put     `yaml:",omitempty"`
   318  	Puts          []Put     `yaml:",omitempty"`
   319  	S3            []S3      `yaml:"s3,omitempty"`
   320  	Changelog     Changelog `yaml:",omitempty"`
   321  	Dist          string    `yaml:",omitempty"`
   322  	Sign          Sign      `yaml:",omitempty"`
   323  	EnvFiles      EnvFiles  `yaml:"env_files,omitempty"`
   324  	Git           Git       `yaml:",omitempty"`
   325  	Before        Before    `yaml:",omitempty"`
   326  
   327  	// this is a hack ¯\_(ツ)_/¯
   328  	SingleBuild Build `yaml:"build,omitempty"`
   329  
   330  	// should be set if using github enterprise
   331  	GitHubURLs GitHubURLs `yaml:"github_urls,omitempty"`
   332  }
   333  
   334  // Load config file
   335  func Load(file string) (config Project, err error) {
   336  	f, err := os.Open(file) // #nosec
   337  	if err != nil {
   338  		return
   339  	}
   340  	log.WithField("file", file).Info("loading config file")
   341  	return LoadReader(f)
   342  }
   343  
   344  // LoadReader config via io.Reader
   345  func LoadReader(fd io.Reader) (config Project, err error) {
   346  	data, err := ioutil.ReadAll(fd)
   347  	if err != nil {
   348  		return config, err
   349  	}
   350  	err = yaml.UnmarshalStrict(data, &config)
   351  	log.WithField("config", config).Debug("loaded config file")
   352  	return config, err
   353  }