mirror of
https://github.com/goreleaser/goreleaser.git
synced 2025-02-09 13:36:56 +02:00
Merge pull request #6 from goreleaser/pipe
reorganized code as a pipeline
This commit is contained in:
commit
1bb471d8ec
@ -5,6 +5,7 @@ import (
|
||||
"io/ioutil"
|
||||
"os"
|
||||
|
||||
"github.com/goreleaser/releaser/config/git"
|
||||
yaml "gopkg.in/yaml.v1"
|
||||
)
|
||||
|
||||
@ -22,6 +23,12 @@ type BuildConfig struct {
|
||||
Main string
|
||||
}
|
||||
|
||||
type GitInfo struct {
|
||||
CurrentTag string
|
||||
PreviousTag string
|
||||
Diff string
|
||||
}
|
||||
|
||||
type ProjectConfig struct {
|
||||
Repo string
|
||||
BinaryName string `yaml:"binary_name"`
|
||||
@ -29,6 +36,7 @@ type ProjectConfig struct {
|
||||
Brew HomebrewDeploy
|
||||
Token string
|
||||
Build BuildConfig
|
||||
Git GitInfo `yaml:"_"`
|
||||
}
|
||||
|
||||
func Load(file string) (config ProjectConfig, err error) {
|
||||
@ -38,6 +46,10 @@ func Load(file string) (config ProjectConfig, err error) {
|
||||
}
|
||||
err = yaml.Unmarshal(data, &config)
|
||||
config = fix(config)
|
||||
config, err = fillGitData(config)
|
||||
if err != nil {
|
||||
return config, err
|
||||
}
|
||||
if config.BinaryName == "" {
|
||||
return config, errors.New("missing binary_name")
|
||||
}
|
||||
@ -72,6 +84,26 @@ func fix(config ProjectConfig) ProjectConfig {
|
||||
return config
|
||||
}
|
||||
|
||||
func fillGitData(config ProjectConfig) (ProjectConfig, error) {
|
||||
tag, err := git.CurrentTag()
|
||||
if err != nil {
|
||||
return config, err
|
||||
}
|
||||
previous, err := git.PreviousTag(tag)
|
||||
if err != nil {
|
||||
return config, err
|
||||
}
|
||||
log, err := git.Log(previous, tag)
|
||||
if err != nil {
|
||||
return config, err
|
||||
}
|
||||
|
||||
config.Git.CurrentTag = tag
|
||||
config.Git.PreviousTag = previous
|
||||
config.Git.Diff = log
|
||||
return config, nil
|
||||
}
|
||||
|
||||
func contains(s string, ss []string) bool {
|
||||
for _, sx := range ss {
|
||||
if sx == s {
|
||||
|
46
main.go
46
main.go
@ -1,15 +1,14 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
"github.com/goreleaser/releaser/brew"
|
||||
"github.com/goreleaser/releaser/build"
|
||||
"github.com/goreleaser/releaser/compress"
|
||||
"github.com/goreleaser/releaser/config"
|
||||
"github.com/goreleaser/releaser/git"
|
||||
"github.com/goreleaser/releaser/release"
|
||||
"github.com/goreleaser/releaser/pipeline"
|
||||
"github.com/goreleaser/releaser/pipeline/brew"
|
||||
"github.com/goreleaser/releaser/pipeline/build"
|
||||
"github.com/goreleaser/releaser/pipeline/compress"
|
||||
"github.com/goreleaser/releaser/pipeline/release"
|
||||
)
|
||||
|
||||
var version = "master"
|
||||
@ -19,34 +18,15 @@ func main() {
|
||||
if err != nil {
|
||||
log.Fatalln("Failed to load goreleaser.yml:", err.Error())
|
||||
}
|
||||
tag, err := git.CurrentTag()
|
||||
if err != nil {
|
||||
log.Fatalln("Failed to get current tag name", err.Error())
|
||||
var pipeline = []pipeline.Pipe{
|
||||
build.Pipe{},
|
||||
compress.Pipe{},
|
||||
release.Pipe{},
|
||||
brew.Pipe{},
|
||||
}
|
||||
fmt.Println("Building", tag, "...")
|
||||
err = build.Build(tag, config)
|
||||
if err != nil {
|
||||
log.Fatalln("Failed to diff current and previous tags", err.Error())
|
||||
}
|
||||
err = compress.ArchiveAll(version, config)
|
||||
if err != nil {
|
||||
log.Fatalln("Failed to create archives", err.Error())
|
||||
}
|
||||
previousTag, err := git.PreviousTag(tag)
|
||||
if err != nil {
|
||||
log.Fatalln("Failed to get previous tag name", err.Error())
|
||||
}
|
||||
diff, err := git.Log(previousTag, tag)
|
||||
if err != nil {
|
||||
log.Fatalln("Failed to diff current and previous tags", err.Error())
|
||||
}
|
||||
err = release.Release(tag, diff, config)
|
||||
if err != nil {
|
||||
log.Fatalln("Failed to create GitHub release", err.Error())
|
||||
}
|
||||
if config.Brew.Repo != "" {
|
||||
if err := brew.Brew(tag, config); err != nil {
|
||||
log.Fatalln("Failed to create homebrew formula", err.Error())
|
||||
for _, pipe := range pipeline {
|
||||
if err := pipe.Work(config); err != nil {
|
||||
log.Fatalln(pipe.Name(), "failed:", err.Error())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -11,6 +11,7 @@ import (
|
||||
"github.com/google/go-github/github"
|
||||
"github.com/goreleaser/releaser/config"
|
||||
"golang.org/x/oauth2"
|
||||
"log"
|
||||
)
|
||||
|
||||
const formulae = `class {{ .Name }} < Formula
|
||||
@ -34,8 +35,17 @@ type templateData struct {
|
||||
Name, Desc, Homepage, Repo, Tag, BinaryName, Caveats string
|
||||
}
|
||||
|
||||
func Brew(version string, config config.ProjectConfig) error {
|
||||
fmt.Println("Updating brew formulae...")
|
||||
type Pipe struct{}
|
||||
|
||||
func (Pipe) Name() string {
|
||||
return "Homebrew"
|
||||
}
|
||||
|
||||
func (Pipe) Work(config config.ProjectConfig) error {
|
||||
if config.Brew.Repo == "" {
|
||||
return nil
|
||||
}
|
||||
log.Println("Updating brew formulae...")
|
||||
ts := oauth2.StaticTokenSource(
|
||||
&oauth2.Token{AccessToken: config.Token},
|
||||
)
|
||||
@ -43,7 +53,7 @@ func Brew(version string, config config.ProjectConfig) error {
|
||||
client := github.NewClient(tc)
|
||||
parts := strings.Split(config.Brew.Repo, "/")
|
||||
|
||||
data, err := dataFor(version, config, client)
|
||||
data, err := dataFor(config, client)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -72,7 +82,7 @@ func Brew(version string, config config.ProjectConfig) error {
|
||||
Email: github.String("bot@goreleaser"),
|
||||
},
|
||||
Content: out.Bytes(),
|
||||
Message: github.String(config.BinaryName + " version " + version),
|
||||
Message: github.String(config.BinaryName + " version " + config.Git.CurrentTag),
|
||||
SHA: sha,
|
||||
},
|
||||
)
|
||||
@ -89,7 +99,7 @@ func buildFormulae(data templateData) (bytes.Buffer, error) {
|
||||
return out, err
|
||||
}
|
||||
|
||||
func dataFor(version string, config config.ProjectConfig, client *github.Client) (result templateData, err error) {
|
||||
func dataFor(config config.ProjectConfig, client *github.Client) (result templateData, err error) {
|
||||
var homepage string
|
||||
var description string
|
||||
parts := strings.Split(config.Repo, "/")
|
||||
@ -112,7 +122,7 @@ func dataFor(version string, config config.ProjectConfig, client *github.Client)
|
||||
Desc: description,
|
||||
Homepage: homepage,
|
||||
Repo: config.Repo,
|
||||
Tag: version,
|
||||
Tag: config.Git.CurrentTag,
|
||||
BinaryName: config.BinaryName,
|
||||
Caveats: config.Brew.Caveats,
|
||||
}, err
|
@ -3,7 +3,7 @@ package build
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"os/exec"
|
||||
|
||||
@ -12,26 +12,32 @@ import (
|
||||
"golang.org/x/sync/errgroup"
|
||||
)
|
||||
|
||||
func Build(version string, config config.ProjectConfig) error {
|
||||
type Pipe struct{}
|
||||
|
||||
func (Pipe) Name() string {
|
||||
return "Build"
|
||||
}
|
||||
|
||||
func (Pipe) Work(config config.ProjectConfig) error {
|
||||
var g errgroup.Group
|
||||
for _, bos := range config.Build.Oses {
|
||||
for _, arch := range config.Build.Arches {
|
||||
bos := bos
|
||||
arch := arch
|
||||
g.Go(func() error {
|
||||
return build(bos, arch, version, config)
|
||||
return build(bos, arch, config)
|
||||
})
|
||||
}
|
||||
}
|
||||
return g.Wait()
|
||||
}
|
||||
|
||||
func build(bos, arch, version string, config config.ProjectConfig) error {
|
||||
fmt.Println("Building", bos+"/"+arch, "...")
|
||||
func build(bos, arch string, config config.ProjectConfig) error {
|
||||
log.Println("Building", bos+"/"+arch, "...")
|
||||
cmd := exec.Command(
|
||||
"go",
|
||||
"build",
|
||||
"-ldflags=-s -w -X main.version="+version,
|
||||
"-ldflags=-s -w -X main.version="+config.Git.CurrentTag,
|
||||
"-o", target(bos, arch, config.BinaryName),
|
||||
config.Build.Main,
|
||||
)
|
@ -5,13 +5,22 @@ import (
|
||||
"compress/gzip"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"os"
|
||||
|
||||
"github.com/goreleaser/releaser/config"
|
||||
"github.com/goreleaser/releaser/uname"
|
||||
)
|
||||
|
||||
func ArchiveAll(version string, config config.ProjectConfig) error {
|
||||
type Pipe struct{}
|
||||
|
||||
func (Pipe) Name() string {
|
||||
return "Compress"
|
||||
}
|
||||
|
||||
func (Pipe) Work(config config.ProjectConfig) error {
|
||||
log.Println("Creating archives...")
|
||||
// TODO use a errgroup here?
|
||||
for _, system := range config.Build.Oses {
|
||||
for _, arch := range config.Build.Arches {
|
||||
if err := create(system, arch, config); err != nil {
|
8
pipeline/pipe.go
Normal file
8
pipeline/pipe.go
Normal file
@ -0,0 +1,8 @@
|
||||
package pipeline
|
||||
|
||||
import "github.com/goreleaser/releaser/config"
|
||||
|
||||
type Pipe interface {
|
||||
Name() string
|
||||
Work(config config.ProjectConfig) error
|
||||
}
|
@ -2,7 +2,7 @@ package release
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"os/exec"
|
||||
"strings"
|
||||
@ -14,8 +14,14 @@ import (
|
||||
"golang.org/x/sync/errgroup"
|
||||
)
|
||||
|
||||
func Release(version, diff string, config config.ProjectConfig) error {
|
||||
fmt.Println("Creating release", version, "on repo", config.Repo, "...")
|
||||
type Pipe struct{}
|
||||
|
||||
func (Pipe) Name() string {
|
||||
return "GithubRelease"
|
||||
}
|
||||
|
||||
func (Pipe) Work(config config.ProjectConfig) error {
|
||||
log.Println("Creating release", config.Git.CurrentTag, "on repo", config.Repo, "...")
|
||||
ts := oauth2.StaticTokenSource(
|
||||
&oauth2.Token{AccessToken: config.Token},
|
||||
)
|
||||
@ -24,12 +30,11 @@ func Release(version, diff string, config config.ProjectConfig) error {
|
||||
|
||||
owner := strings.Split(config.Repo, "/")[0]
|
||||
repo := strings.Split(config.Repo, "/")[1]
|
||||
releaseData := &github.RepositoryRelease{
|
||||
Name: github.String(version),
|
||||
TagName: github.String(version),
|
||||
Body: github.String(description(diff)),
|
||||
}
|
||||
r, _, err := client.Repositories.CreateRelease(owner, repo, releaseData)
|
||||
r, _, err := client.Repositories.CreateRelease(owner, repo, &github.RepositoryRelease{
|
||||
Name: github.String(config.Git.CurrentTag),
|
||||
TagName: github.String(config.Git.CurrentTag),
|
||||
Body: github.String(description(config.Git.Diff)),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -63,7 +68,7 @@ func upload(client *github.Client, releaseID int, owner, repo, system, arch, bin
|
||||
return err
|
||||
}
|
||||
defer file.Close()
|
||||
fmt.Println("Uploading", file.Name(), "...")
|
||||
log.Println("Uploading", file.Name(), "...")
|
||||
_, _, err = client.Repositories.UploadReleaseAsset(owner, repo, releaseID, &github.UploadOptions{
|
||||
Name: name,
|
||||
}, file)
|
Loading…
x
Reference in New Issue
Block a user