You've already forked goreleaser
mirror of
https://github.com/goreleaser/goreleaser.git
synced 2025-07-17 01:42:37 +02:00
wip multiple builds
This commit is contained in:
@ -99,13 +99,15 @@ type Snapshot struct {
|
|||||||
|
|
||||||
// Project includes all project configuration
|
// Project includes all project configuration
|
||||||
type Project struct {
|
type Project struct {
|
||||||
|
Name string `yaml:",omitempty"`
|
||||||
Release Release `yaml:",omitempty"`
|
Release Release `yaml:",omitempty"`
|
||||||
Brew Homebrew `yaml:",omitempty"`
|
Brew Homebrew `yaml:",omitempty"`
|
||||||
Build Build `yaml:",omitempty"`
|
Builds []Build `yaml:",omitempty"`
|
||||||
Archive Archive `yaml:",omitempty"`
|
Archive Archive `yaml:",omitempty"`
|
||||||
FPM FPM `yaml:",omitempty"`
|
FPM FPM `yaml:",omitempty"`
|
||||||
Snapshot Snapshot `yaml:",omitempty"`
|
Snapshot Snapshot `yaml:",omitempty"`
|
||||||
|
|
||||||
|
// Build Build `yaml:",omitempty"` // deprecated, remove
|
||||||
// test only property indicating the path to the dist folder
|
// test only property indicating the path to the dist folder
|
||||||
Dist string `yaml:"-"`
|
Dist string `yaml:"-"`
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,18 @@
|
|||||||
homepage: &homepage http://goreleaser.github.io
|
homepage: &homepage http://goreleaser.github.io
|
||||||
description: &description Deliver Go binaries as fast and easily as possible
|
description: &description Deliver Go binaries as fast and easily as possible
|
||||||
build:
|
builds:
|
||||||
env:
|
-
|
||||||
- CGO_ENABLED=0
|
env:
|
||||||
goos:
|
- CGO_ENABLED=0
|
||||||
- linux
|
goos:
|
||||||
- darwin
|
- linux
|
||||||
- windows
|
- darwin
|
||||||
goarch:
|
- windows
|
||||||
- 386
|
goarch:
|
||||||
- amd64
|
- 386
|
||||||
- arm
|
- amd64
|
||||||
- arm64
|
- arm
|
||||||
|
- arm64
|
||||||
archive:
|
archive:
|
||||||
name_template: '{{ .Binary }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}'
|
name_template: '{{ .Binary }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}'
|
||||||
replacements:
|
replacements:
|
||||||
|
@ -36,7 +36,7 @@ func (c *githubClient) CreateFile(
|
|||||||
},
|
},
|
||||||
Content: content.Bytes(),
|
Content: content.Bytes(),
|
||||||
Message: github.String(
|
Message: github.String(
|
||||||
ctx.Config.Build.Binary + " version " + ctx.Git.CurrentTag,
|
ctx.Config.Name + " version " + ctx.Git.CurrentTag,
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ func doRun(ctx *context.Context, client client.Client) error {
|
|||||||
log.Warn("skipped because release is marked as draft")
|
log.Warn("skipped because release is marked as draft")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
path := filepath.Join(ctx.Config.Brew.Folder, ctx.Config.Build.Binary+".rb")
|
path := filepath.Join(ctx.Config.Brew.Folder, ctx.Config.Name+".rb")
|
||||||
log.WithField("formula", path).
|
log.WithField("formula", path).
|
||||||
WithField("repo", ctx.Config.Brew.GitHub.String()).
|
WithField("repo", ctx.Config.Brew.GitHub.String()).
|
||||||
Info("pushing")
|
Info("pushing")
|
||||||
|
@ -10,6 +10,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/apex/log"
|
"github.com/apex/log"
|
||||||
|
"github.com/goreleaser/goreleaser/config"
|
||||||
"github.com/goreleaser/goreleaser/context"
|
"github.com/goreleaser/goreleaser/context"
|
||||||
"github.com/goreleaser/goreleaser/internal/ext"
|
"github.com/goreleaser/goreleaser/internal/ext"
|
||||||
"golang.org/x/sync/errgroup"
|
"golang.org/x/sync/errgroup"
|
||||||
@ -25,12 +26,21 @@ func (Pipe) Description() string {
|
|||||||
|
|
||||||
// Run the pipe
|
// Run the pipe
|
||||||
func (Pipe) Run(ctx *context.Context) error {
|
func (Pipe) Run(ctx *context.Context) error {
|
||||||
if err := runHook(ctx.Config.Build.Env, ctx.Config.Build.Hooks.Pre); err != nil {
|
for _, build := range ctx.Config.Builds {
|
||||||
|
if err := runPipeOnBuild(ctx, build); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func runPipeOnBuild(ctx *context.Context, build config.Build) error {
|
||||||
|
if err := runHook(build.Env, build.Hooks.Pre); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
sem := make(chan bool, 4)
|
sem := make(chan bool, 4)
|
||||||
var g errgroup.Group
|
var g errgroup.Group
|
||||||
for _, target := range buildTargets(ctx) {
|
for _, target := range buildTargets(build) {
|
||||||
name, err := nameFor(ctx, target)
|
name, err := nameFor(ctx, target)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -43,13 +53,13 @@ func (Pipe) Run(ctx *context.Context) error {
|
|||||||
defer func() {
|
defer func() {
|
||||||
<-sem
|
<-sem
|
||||||
}()
|
}()
|
||||||
return build(ctx, name, target)
|
return doBuild(ctx, build, name, target)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
if err := g.Wait(); err != nil {
|
if err := g.Wait(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return runHook(ctx.Config.Build.Env, ctx.Config.Build.Hooks.Post)
|
return runHook(build.Env, build.Hooks.Post)
|
||||||
}
|
}
|
||||||
|
|
||||||
func runHook(env []string, hook string) error {
|
func runHook(env []string, hook string) error {
|
||||||
@ -61,23 +71,19 @@ func runHook(env []string, hook string) error {
|
|||||||
return run(runtimeTarget, cmd, env)
|
return run(runtimeTarget, cmd, env)
|
||||||
}
|
}
|
||||||
|
|
||||||
func build(ctx *context.Context, name string, target buildTarget) error {
|
func doBuild(ctx *context.Context, build config.Build, name string, target buildTarget) error {
|
||||||
output := filepath.Join(
|
output := filepath.Join(ctx.Config.Dist, name, build.Binary+ext.For(target.goos))
|
||||||
ctx.Config.Dist,
|
|
||||||
name,
|
|
||||||
ctx.Config.Build.Binary+ext.For(target.goos),
|
|
||||||
)
|
|
||||||
log.WithField("binary", output).Info("building")
|
log.WithField("binary", output).Info("building")
|
||||||
cmd := []string{"go", "build"}
|
cmd := []string{"go", "build"}
|
||||||
if ctx.Config.Build.Flags != "" {
|
if build.Flags != "" {
|
||||||
cmd = append(cmd, strings.Fields(ctx.Config.Build.Flags)...)
|
cmd = append(cmd, strings.Fields(build.Flags)...)
|
||||||
}
|
}
|
||||||
flags, err := ldflags(ctx)
|
flags, err := ldflags(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
cmd = append(cmd, "-ldflags="+flags, "-o", output, ctx.Config.Build.Main)
|
cmd = append(cmd, "-ldflags="+flags, "-o", output, build.Main)
|
||||||
return run(target, cmd, ctx.Config.Build.Env)
|
return run(target, cmd, build.Env)
|
||||||
}
|
}
|
||||||
|
|
||||||
func run(target buildTarget, command, env []string) error {
|
func run(target buildTarget, command, env []string) error {
|
||||||
|
@ -5,7 +5,7 @@ import (
|
|||||||
"runtime"
|
"runtime"
|
||||||
|
|
||||||
"github.com/apex/log"
|
"github.com/apex/log"
|
||||||
"github.com/goreleaser/goreleaser/context"
|
"github.com/goreleaser/goreleaser/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
var runtimeTarget = buildTarget{runtime.GOOS, runtime.GOARCH, ""}
|
var runtimeTarget = buildTarget{runtime.GOOS, runtime.GOARCH, ""}
|
||||||
@ -23,14 +23,14 @@ func (t buildTarget) PrettyString() string {
|
|||||||
return fmt.Sprintf("%v/%v%v", t.goos, t.goarch, t.goarm)
|
return fmt.Sprintf("%v/%v%v", t.goos, t.goarch, t.goarm)
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildTargets(ctx *context.Context) (targets []buildTarget) {
|
func buildTargets(build config.Build) (targets []buildTarget) {
|
||||||
for _, target := range allBuildTargets(ctx) {
|
for _, target := range allBuildTargets(build) {
|
||||||
if !valid(target) {
|
if !valid(target) {
|
||||||
log.WithField("target", target.PrettyString()).
|
log.WithField("target", target.PrettyString()).
|
||||||
Warn("skipped invalid build")
|
Warn("skipped invalid build")
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if ignored(ctx, target) {
|
if ignored(build, target) {
|
||||||
log.WithField("target", target.PrettyString()).
|
log.WithField("target", target.PrettyString()).
|
||||||
Warn("skipped ignored build")
|
Warn("skipped ignored build")
|
||||||
continue
|
continue
|
||||||
@ -40,11 +40,11 @@ func buildTargets(ctx *context.Context) (targets []buildTarget) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func allBuildTargets(ctx *context.Context) (targets []buildTarget) {
|
func allBuildTargets(build config.Build) (targets []buildTarget) {
|
||||||
for _, goos := range ctx.Config.Build.Goos {
|
for _, goos := range build.Goos {
|
||||||
for _, goarch := range ctx.Config.Build.Goarch {
|
for _, goarch := range build.Goarch {
|
||||||
if goarch == "arm" {
|
if goarch == "arm" {
|
||||||
for _, goarm := range ctx.Config.Build.Goarm {
|
for _, goarm := range build.Goarm {
|
||||||
targets = append(targets, buildTarget{goos, goarch, goarm})
|
targets = append(targets, buildTarget{goos, goarch, goarm})
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
@ -55,8 +55,8 @@ func allBuildTargets(ctx *context.Context) (targets []buildTarget) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func ignored(ctx *context.Context, target buildTarget) bool {
|
func ignored(build config.Build, target buildTarget) bool {
|
||||||
for _, ig := range ctx.Config.Build.Ignore {
|
for _, ig := range build.Ignore {
|
||||||
var ignored = buildTarget{ig.Goos, ig.Goarch, ig.Goarm}
|
var ignored = buildTarget{ig.Goos, ig.Goarch, ig.Goarm}
|
||||||
if ignored == target {
|
if ignored == target {
|
||||||
return true
|
return true
|
||||||
|
@ -4,7 +4,10 @@ package defaults
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/apex/log"
|
||||||
|
"github.com/goreleaser/goreleaser/config"
|
||||||
"github.com/goreleaser/goreleaser/context"
|
"github.com/goreleaser/goreleaser/context"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -31,14 +34,23 @@ func (Pipe) Run(ctx *context.Context) error {
|
|||||||
if err := setReleaseDefaults(ctx); err != nil {
|
if err := setReleaseDefaults(ctx); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if ctx.Config.Name == "" {
|
||||||
|
ctx.Config.Name = ctx.Config.Release.GitHub.Name
|
||||||
|
}
|
||||||
setBuildDefaults(ctx)
|
setBuildDefaults(ctx)
|
||||||
if ctx.Config.Brew.Install == "" {
|
if ctx.Config.Brew.Install == "" {
|
||||||
ctx.Config.Brew.Install = fmt.Sprintf(
|
var installs []string
|
||||||
`bin.install "%s"`,
|
for _, build := range ctx.Config.Builds {
|
||||||
ctx.Config.Build.Binary,
|
installs = append(
|
||||||
)
|
installs,
|
||||||
|
fmt.Sprintf(`bin.install "%s"`, build.Binary),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
ctx.Config.Brew.Install = strings.Join(installs, "\n")
|
||||||
}
|
}
|
||||||
return setArchiveDefaults(ctx)
|
err := setArchiveDefaults(ctx)
|
||||||
|
log.WithField("config", ctx.Config).Debug("defaults set")
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func setReleaseDefaults(ctx *context.Context) error {
|
func setReleaseDefaults(ctx *context.Context) error {
|
||||||
@ -54,24 +66,35 @@ func setReleaseDefaults(ctx *context.Context) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func setBuildDefaults(ctx *context.Context) {
|
func setBuildDefaults(ctx *context.Context) {
|
||||||
if ctx.Config.Build.Binary == "" {
|
if len(ctx.Config.Builds) == 0 {
|
||||||
ctx.Config.Build.Binary = ctx.Config.Release.GitHub.Name
|
ctx.Config.Builds = append(ctx.Config.Builds, ctx.Config.Build)
|
||||||
}
|
}
|
||||||
if ctx.Config.Build.Main == "" {
|
ctx.Config.Build = config.Build{}
|
||||||
ctx.Config.Build.Main = "."
|
for i, build := range ctx.Config.Builds {
|
||||||
|
ctx.Config.Builds[i] = buildWithDefaults(ctx, build)
|
||||||
}
|
}
|
||||||
if len(ctx.Config.Build.Goos) == 0 {
|
}
|
||||||
ctx.Config.Build.Goos = []string{"linux", "darwin"}
|
|
||||||
|
func buildWithDefaults(ctx *context.Context, build config.Build) config.Build {
|
||||||
|
if build.Binary == "" {
|
||||||
|
build.Binary = ctx.Config.Release.GitHub.Name
|
||||||
}
|
}
|
||||||
if len(ctx.Config.Build.Goarch) == 0 {
|
if build.Main == "" {
|
||||||
ctx.Config.Build.Goarch = []string{"amd64", "386"}
|
build.Main = "."
|
||||||
}
|
}
|
||||||
if len(ctx.Config.Build.Goarm) == 0 {
|
if len(build.Goos) == 0 {
|
||||||
ctx.Config.Build.Goarm = []string{"6"}
|
build.Goos = []string{"linux", "darwin"}
|
||||||
}
|
}
|
||||||
if ctx.Config.Build.Ldflags == "" {
|
if len(build.Goarch) == 0 {
|
||||||
ctx.Config.Build.Ldflags = "-s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}}"
|
build.Goarch = []string{"amd64", "386"}
|
||||||
}
|
}
|
||||||
|
if len(build.Goarm) == 0 {
|
||||||
|
build.Goarm = []string{"6"}
|
||||||
|
}
|
||||||
|
if build.Ldflags == "" {
|
||||||
|
build.Ldflags = "-s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}}"
|
||||||
|
}
|
||||||
|
return build
|
||||||
}
|
}
|
||||||
|
|
||||||
func setArchiveDefaults(ctx *context.Context) error {
|
func setArchiveDefaults(ctx *context.Context) error {
|
||||||
|
Reference in New Issue
Block a user