1
0
mirror of https://github.com/goreleaser/goreleaser.git synced 2025-07-15 01:34:21 +02:00

wip multiple builds

This commit is contained in:
Carlos Alexandro Becker
2017-06-27 19:20:08 -03:00
parent cf3197eb40
commit ed5ccf9bdb
7 changed files with 88 additions and 56 deletions

View File

@ -99,13 +99,15 @@ type Snapshot struct {
// Project includes all project configuration
type Project struct {
Name string `yaml:",omitempty"`
Release Release `yaml:",omitempty"`
Brew Homebrew `yaml:",omitempty"`
Build Build `yaml:",omitempty"`
Builds []Build `yaml:",omitempty"`
Archive Archive `yaml:",omitempty"`
FPM FPM `yaml:",omitempty"`
Snapshot Snapshot `yaml:",omitempty"`
// Build Build `yaml:",omitempty"` // deprecated, remove
// test only property indicating the path to the dist folder
Dist string `yaml:"-"`
}

View File

@ -1,6 +1,7 @@
homepage: &homepage http://goreleaser.github.io
description: &description Deliver Go binaries as fast and easily as possible
build:
builds:
-
env:
- CGO_ENABLED=0
goos:

View File

@ -36,7 +36,7 @@ func (c *githubClient) CreateFile(
},
Content: content.Bytes(),
Message: github.String(
ctx.Config.Build.Binary + " version " + ctx.Git.CurrentTag,
ctx.Config.Name + " version " + ctx.Git.CurrentTag,
),
}

View File

@ -106,7 +106,7 @@ func doRun(ctx *context.Context, client client.Client) error {
log.Warn("skipped because release is marked as draft")
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).
WithField("repo", ctx.Config.Brew.GitHub.String()).
Info("pushing")

View File

@ -10,6 +10,7 @@ import (
"strings"
"github.com/apex/log"
"github.com/goreleaser/goreleaser/config"
"github.com/goreleaser/goreleaser/context"
"github.com/goreleaser/goreleaser/internal/ext"
"golang.org/x/sync/errgroup"
@ -25,12 +26,21 @@ func (Pipe) Description() string {
// Run the pipe
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
}
sem := make(chan bool, 4)
var g errgroup.Group
for _, target := range buildTargets(ctx) {
for _, target := range buildTargets(build) {
name, err := nameFor(ctx, target)
if err != nil {
return err
@ -43,13 +53,13 @@ func (Pipe) Run(ctx *context.Context) error {
defer func() {
<-sem
}()
return build(ctx, name, target)
return doBuild(ctx, build, name, target)
})
}
if err := g.Wait(); err != nil {
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 {
@ -61,23 +71,19 @@ func runHook(env []string, hook string) error {
return run(runtimeTarget, cmd, env)
}
func build(ctx *context.Context, name string, target buildTarget) error {
output := filepath.Join(
ctx.Config.Dist,
name,
ctx.Config.Build.Binary+ext.For(target.goos),
)
func doBuild(ctx *context.Context, build config.Build, name string, target buildTarget) error {
output := filepath.Join(ctx.Config.Dist, name, build.Binary+ext.For(target.goos))
log.WithField("binary", output).Info("building")
cmd := []string{"go", "build"}
if ctx.Config.Build.Flags != "" {
cmd = append(cmd, strings.Fields(ctx.Config.Build.Flags)...)
if build.Flags != "" {
cmd = append(cmd, strings.Fields(build.Flags)...)
}
flags, err := ldflags(ctx)
if err != nil {
return err
}
cmd = append(cmd, "-ldflags="+flags, "-o", output, ctx.Config.Build.Main)
return run(target, cmd, ctx.Config.Build.Env)
cmd = append(cmd, "-ldflags="+flags, "-o", output, build.Main)
return run(target, cmd, build.Env)
}
func run(target buildTarget, command, env []string) error {

View File

@ -5,7 +5,7 @@ import (
"runtime"
"github.com/apex/log"
"github.com/goreleaser/goreleaser/context"
"github.com/goreleaser/goreleaser/config"
)
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)
}
func buildTargets(ctx *context.Context) (targets []buildTarget) {
for _, target := range allBuildTargets(ctx) {
func buildTargets(build config.Build) (targets []buildTarget) {
for _, target := range allBuildTargets(build) {
if !valid(target) {
log.WithField("target", target.PrettyString()).
Warn("skipped invalid build")
continue
}
if ignored(ctx, target) {
if ignored(build, target) {
log.WithField("target", target.PrettyString()).
Warn("skipped ignored build")
continue
@ -40,11 +40,11 @@ func buildTargets(ctx *context.Context) (targets []buildTarget) {
return
}
func allBuildTargets(ctx *context.Context) (targets []buildTarget) {
for _, goos := range ctx.Config.Build.Goos {
for _, goarch := range ctx.Config.Build.Goarch {
func allBuildTargets(build config.Build) (targets []buildTarget) {
for _, goos := range build.Goos {
for _, goarch := range build.Goarch {
if goarch == "arm" {
for _, goarm := range ctx.Config.Build.Goarm {
for _, goarm := range build.Goarm {
targets = append(targets, buildTarget{goos, goarch, goarm})
}
continue
@ -55,8 +55,8 @@ func allBuildTargets(ctx *context.Context) (targets []buildTarget) {
return
}
func ignored(ctx *context.Context, target buildTarget) bool {
for _, ig := range ctx.Config.Build.Ignore {
func ignored(build config.Build, target buildTarget) bool {
for _, ig := range build.Ignore {
var ignored = buildTarget{ig.Goos, ig.Goarch, ig.Goarm}
if ignored == target {
return true

View File

@ -4,7 +4,10 @@ package defaults
import (
"fmt"
"strings"
"github.com/apex/log"
"github.com/goreleaser/goreleaser/config"
"github.com/goreleaser/goreleaser/context"
)
@ -31,14 +34,23 @@ func (Pipe) Run(ctx *context.Context) error {
if err := setReleaseDefaults(ctx); err != nil {
return err
}
if ctx.Config.Name == "" {
ctx.Config.Name = ctx.Config.Release.GitHub.Name
}
setBuildDefaults(ctx)
if ctx.Config.Brew.Install == "" {
ctx.Config.Brew.Install = fmt.Sprintf(
`bin.install "%s"`,
ctx.Config.Build.Binary,
var installs []string
for _, build := range ctx.Config.Builds {
installs = append(
installs,
fmt.Sprintf(`bin.install "%s"`, build.Binary),
)
}
return setArchiveDefaults(ctx)
ctx.Config.Brew.Install = strings.Join(installs, "\n")
}
err := setArchiveDefaults(ctx)
log.WithField("config", ctx.Config).Debug("defaults set")
return err
}
func setReleaseDefaults(ctx *context.Context) error {
@ -54,24 +66,35 @@ func setReleaseDefaults(ctx *context.Context) error {
}
func setBuildDefaults(ctx *context.Context) {
if ctx.Config.Build.Binary == "" {
ctx.Config.Build.Binary = ctx.Config.Release.GitHub.Name
if len(ctx.Config.Builds) == 0 {
ctx.Config.Builds = append(ctx.Config.Builds, ctx.Config.Build)
}
if ctx.Config.Build.Main == "" {
ctx.Config.Build.Main = "."
ctx.Config.Build = config.Build{}
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 {
ctx.Config.Build.Goarch = []string{"amd64", "386"}
if build.Main == "" {
build.Main = "."
}
if len(ctx.Config.Build.Goarm) == 0 {
ctx.Config.Build.Goarm = []string{"6"}
if len(build.Goos) == 0 {
build.Goos = []string{"linux", "darwin"}
}
if ctx.Config.Build.Ldflags == "" {
ctx.Config.Build.Ldflags = "-s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}}"
if len(build.Goarch) == 0 {
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 {