mirror of
https://github.com/goreleaser/goreleaser.git
synced 2025-01-16 03:52:12 +02:00
parent
e2eb83b639
commit
aace3d4813
@ -43,12 +43,24 @@ type Release struct {
|
||||
Repo string
|
||||
}
|
||||
|
||||
// FPMFormat defines a FPM format and how it should be built
|
||||
type FPMFormat struct {
|
||||
Name string
|
||||
Dependencies []string
|
||||
}
|
||||
|
||||
// FPM config
|
||||
type FPM struct {
|
||||
Formats []FPMFormat
|
||||
}
|
||||
|
||||
// Project includes all project configuration
|
||||
type Project struct {
|
||||
Release Release
|
||||
Brew Homebrew
|
||||
Build Build
|
||||
Archive Archive
|
||||
FPM FPM `yaml:"fpm"`
|
||||
}
|
||||
|
||||
// Load config file
|
||||
|
@ -22,6 +22,7 @@ type Context struct {
|
||||
ReleaseRepo Repo
|
||||
BrewRepo Repo
|
||||
Archives map[string]string
|
||||
Version string
|
||||
}
|
||||
|
||||
// New context
|
||||
|
@ -3,3 +3,13 @@ brew:
|
||||
folder: Formula
|
||||
dependencies:
|
||||
- git
|
||||
fpm:
|
||||
formats:
|
||||
-
|
||||
name: deb
|
||||
dependencies:
|
||||
- git
|
||||
-
|
||||
name: rpm
|
||||
dependencies:
|
||||
- git
|
||||
|
2
main.go
2
main.go
@ -12,6 +12,7 @@ import (
|
||||
"github.com/goreleaser/goreleaser/pipeline/build"
|
||||
"github.com/goreleaser/goreleaser/pipeline/defaults"
|
||||
"github.com/goreleaser/goreleaser/pipeline/env"
|
||||
"github.com/goreleaser/goreleaser/pipeline/fpm"
|
||||
"github.com/goreleaser/goreleaser/pipeline/git"
|
||||
"github.com/goreleaser/goreleaser/pipeline/release"
|
||||
"github.com/goreleaser/goreleaser/pipeline/repos"
|
||||
@ -33,6 +34,7 @@ var pipes = []pipeline.Pipe{
|
||||
// real work
|
||||
build.Pipe{},
|
||||
archive.Pipe{},
|
||||
fpm.Pipe{},
|
||||
release.Pipe{},
|
||||
brew.Pipe{},
|
||||
}
|
||||
|
@ -22,7 +22,7 @@ const formula = `class {{ .Name }} < Formula
|
||||
desc "{{ .Desc }}"
|
||||
homepage "{{ .Homepage }}"
|
||||
url "https://github.com/{{ .Repo }}/releases/download/{{ .Tag }}/{{ .File }}.{{ .Format }}"
|
||||
version "{{ .Tag }}"
|
||||
version "{{ .Version }}"
|
||||
sha256 "{{ .SHA256 }}"
|
||||
|
||||
{{- if .Dependencies }}
|
||||
@ -50,6 +50,7 @@ type templateData struct {
|
||||
Homepage string
|
||||
Repo string
|
||||
Tag string
|
||||
Version string
|
||||
BinaryName string
|
||||
Caveats string
|
||||
File string
|
||||
@ -156,6 +157,7 @@ func dataFor(ctx *context.Context, client *github.Client) (result templateData,
|
||||
Homepage: homepage,
|
||||
Repo: ctx.Config.Release.Repo,
|
||||
Tag: ctx.Git.CurrentTag,
|
||||
Version: ctx.Version,
|
||||
BinaryName: ctx.Config.Build.BinaryName,
|
||||
Caveats: ctx.Config.Brew.Caveats,
|
||||
File: file,
|
||||
|
100
pipeline/fpm/fpm.go
Normal file
100
pipeline/fpm/fpm.go
Normal file
@ -0,0 +1,100 @@
|
||||
package fpm
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"log"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
|
||||
"golang.org/x/sync/errgroup"
|
||||
|
||||
"github.com/goreleaser/goreleaser/context"
|
||||
)
|
||||
|
||||
var linuxArchives = []struct {
|
||||
Key string
|
||||
Arch string
|
||||
}{
|
||||
{
|
||||
Key: "linuxamd64",
|
||||
Arch: "x86_64",
|
||||
},
|
||||
{
|
||||
Key: "linux386",
|
||||
Arch: "i386",
|
||||
},
|
||||
}
|
||||
|
||||
// ErrNoFPM is shown when fpm cannot be found in $PATH
|
||||
var ErrNoFPM = errors.New("fpm not present in $PATH")
|
||||
|
||||
// Pipe for fpm packaging
|
||||
type Pipe struct{}
|
||||
|
||||
// Description of the pipe
|
||||
func (Pipe) Description() string {
|
||||
return "Creating Linux packages with fpm"
|
||||
}
|
||||
|
||||
// Run the pipe
|
||||
func (Pipe) Run(ctx *context.Context) error {
|
||||
cmd := exec.Command("which", "fpm")
|
||||
if err := cmd.Run(); err != nil {
|
||||
return ErrNoFPM
|
||||
}
|
||||
if len(ctx.Config.FPM.Formats) == 0 {
|
||||
log.Println("No output formats configured")
|
||||
return nil
|
||||
}
|
||||
var g errgroup.Group
|
||||
for _, format := range ctx.Config.FPM.Formats {
|
||||
for _, archive := range linuxArchives {
|
||||
if ctx.Archives[archive.Key] == "" {
|
||||
continue
|
||||
}
|
||||
archive := archive
|
||||
g.Go(func() error {
|
||||
return create(
|
||||
ctx,
|
||||
format.Name,
|
||||
ctx.Archives[archive.Key],
|
||||
archive.Arch,
|
||||
format.Dependencies,
|
||||
)
|
||||
})
|
||||
}
|
||||
}
|
||||
return g.Wait()
|
||||
}
|
||||
|
||||
func create(ctx *context.Context, format, archive, arch string, deps []string) error {
|
||||
var path = filepath.Join("dist", archive)
|
||||
var file = path + ".deb"
|
||||
var name = ctx.Config.Build.BinaryName
|
||||
log.Println("Creating", file)
|
||||
|
||||
var options = []string{
|
||||
"-s", "dir",
|
||||
"-t", format,
|
||||
"-n", name,
|
||||
"-v", ctx.Version,
|
||||
"-a", arch,
|
||||
"-C", path,
|
||||
"-p", file,
|
||||
"--force",
|
||||
}
|
||||
for _, dep := range deps {
|
||||
options = append(options, "-d", dep)
|
||||
}
|
||||
options = append(options, name+"="+filepath.Join("/usr/local/bin", name))
|
||||
cmd := exec.Command("fpm", options...)
|
||||
log.Println(cmd)
|
||||
var stdout bytes.Buffer
|
||||
cmd.Stdout = &stdout
|
||||
cmd.Stderr = &stdout
|
||||
if err := cmd.Run(); err != nil {
|
||||
return errors.New(stdout.String())
|
||||
}
|
||||
return nil
|
||||
}
|
@ -1,6 +1,10 @@
|
||||
package git
|
||||
|
||||
import "github.com/goreleaser/goreleaser/context"
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/goreleaser/goreleaser/context"
|
||||
)
|
||||
|
||||
// Pipe for brew deployment
|
||||
type Pipe struct{}
|
||||
@ -30,5 +34,7 @@ func (Pipe) Run(ctx *context.Context) (err error) {
|
||||
PreviousTag: previous,
|
||||
Diff: log,
|
||||
}
|
||||
// removes usual `v` prefix
|
||||
ctx.Version = strings.TrimPrefix(tag, "v")
|
||||
return
|
||||
}
|
||||
|
@ -31,9 +31,13 @@ func (Pipe) Run(ctx *context.Context) error {
|
||||
for _, archive := range ctx.Archives {
|
||||
archive := archive
|
||||
g.Go(func() error {
|
||||
return upload(client, *r.ID, archive, ctx)
|
||||
return upload(ctx, client, *r.ID, archive, ctx.Config.Archive.Format)
|
||||
})
|
||||
|
||||
for _, fpm := range ctx.Config.FPM.Formats {
|
||||
g.Go(func() error {
|
||||
return upload(ctx, client, *r.ID, archive, fpm.Name)
|
||||
})
|
||||
}
|
||||
}
|
||||
return g.Wait()
|
||||
}
|
||||
@ -67,8 +71,8 @@ func description(diff string) string {
|
||||
return result + "\nBuilt with " + string(bts)
|
||||
}
|
||||
|
||||
func upload(client *github.Client, releaseID int, archive string, ctx *context.Context) error {
|
||||
archive = archive + "." + ctx.Config.Archive.Format
|
||||
func upload(ctx *context.Context, client *github.Client, releaseID int, archive, format string) error {
|
||||
archive = archive + "." + format
|
||||
file, err := os.Open("dist/" + archive)
|
||||
if err != nil {
|
||||
return err
|
||||
|
Loading…
Reference in New Issue
Block a user