1
0
mirror of https://github.com/goreleaser/goreleaser.git synced 2025-01-10 03:47:03 +02:00
goreleaser/pipeline/s3/s3.go

118 lines
2.8 KiB
Go
Raw Normal View History

2018-05-13 18:08:14 +02:00
// Package s3 provides a Pipe that push artifacts to s3/minio
package s3
import (
"os"
"path/filepath"
"github.com/apex/log"
"github.com/aws/aws-sdk-go/aws"
2018-05-13 20:56:36 +02:00
"github.com/aws/aws-sdk-go/aws/credentials"
2018-05-13 18:08:14 +02:00
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/goreleaser/goreleaser/config"
"github.com/goreleaser/goreleaser/context"
"github.com/goreleaser/goreleaser/internal/artifact"
"github.com/goreleaser/goreleaser/internal/semerrgroup"
"github.com/goreleaser/goreleaser/internal/tmpl"
"github.com/goreleaser/goreleaser/pipeline"
2018-05-13 18:08:14 +02:00
)
// Pipe for Artifactory
type Pipe struct{}
// String returns the description of the pipe
func (Pipe) String() string {
return "releasing to s3"
}
// Default sets the pipe defaults
func (Pipe) Default(ctx *context.Context) error {
for i := range ctx.Config.S3 {
s3 := &ctx.Config.S3[i]
2018-05-13 19:44:49 +02:00
if s3.Bucket == "" {
continue
}
2018-05-13 18:08:14 +02:00
if s3.Folder == "" {
s3.Folder = "{{ .ProjectName }}/{{ .Tag }}"
}
if s3.Region == "" {
s3.Region = "us-east-1"
}
2018-07-22 00:07:20 +02:00
if s3.ACL == "" {
s3.ACL = "private"
}
2018-05-13 18:08:14 +02:00
}
return nil
}
// Run the pipe
func (Pipe) Run(ctx *context.Context) error {
if ctx.SkipPublish {
return pipeline.ErrSkipPublishEnabled
}
var g = semerrgroup.New(ctx.Parallelism)
2018-05-13 18:08:14 +02:00
for _, conf := range ctx.Config.S3 {
conf := conf
g.Go(func() error {
return upload(ctx, conf)
})
}
return g.Wait()
}
func upload(ctx *context.Context, conf config.S3) error {
2018-05-13 20:40:14 +02:00
var awsConfig = aws.NewConfig()
2018-05-13 20:56:36 +02:00
// TODO: add a test for this
2018-05-13 19:22:03 +02:00
if conf.Endpoint != "" {
awsConfig.Endpoint = aws.String(conf.Endpoint)
awsConfig.S3ForcePathStyle = aws.Bool(true)
}
awsConfig.Credentials = credentials.NewChainCredentials([]credentials.Provider{
&credentials.EnvProvider{},
&credentials.SharedCredentialsProvider{
Profile: conf.Profile,
},
})
2018-05-13 20:40:14 +02:00
sess := session.Must(session.NewSession(awsConfig))
2018-05-13 18:08:14 +02:00
svc := s3.New(sess, &aws.Config{
Region: aws.String(conf.Region),
})
folder, err := tmpl.New(ctx).Apply(conf.Folder)
2018-05-13 18:08:14 +02:00
if err != nil {
return err
}
var g = semerrgroup.New(ctx.Parallelism)
2018-05-13 18:08:14 +02:00
for _, artifact := range ctx.Artifacts.Filter(
artifact.Or(
artifact.ByType(artifact.UploadableArchive),
artifact.ByType(artifact.UploadableBinary),
artifact.ByType(artifact.Checksum),
artifact.ByType(artifact.Signature),
artifact.ByType(artifact.LinuxPackage),
),
).List() {
artifact := artifact
g.Go(func() error {
f, err := os.Open(artifact.Path)
if err != nil {
return err
}
log.WithFields(log.Fields{
"bucket": conf.Bucket,
"folder": folder,
"artifact": artifact.Name,
}).Info("uploading")
_, err = svc.PutObjectWithContext(ctx, &s3.PutObjectInput{
Bucket: aws.String(conf.Bucket),
Key: aws.String(filepath.Join(folder, artifact.Name)),
Body: f,
2018-07-22 00:07:20 +02:00
ACL: aws.String(conf.ACL),
2018-05-13 18:08:14 +02:00
})
return err
})
}
return g.Wait()
}