1
0
mirror of https://github.com/goreleaser/goreleaser.git synced 2025-01-16 03:52:12 +02:00

added fpm support

closes #10
This commit is contained in:
Carlos Alexandro Becker 2017-01-29 21:55:32 -02:00
parent e2eb83b639
commit aace3d4813
No known key found for this signature in database
GPG Key ID: E61E2F7DC14AB940
8 changed files with 143 additions and 6 deletions

View File

@ -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

View File

@ -22,6 +22,7 @@ type Context struct {
ReleaseRepo Repo
BrewRepo Repo
Archives map[string]string
Version string
}
// New context

View File

@ -3,3 +3,13 @@ brew:
folder: Formula
dependencies:
- git
fpm:
formats:
-
name: deb
dependencies:
- git
-
name: rpm
dependencies:
- git

View File

@ -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{},
}

View File

@ -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
View 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
}

View File

@ -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
}

View File

@ -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