github.com/goreleaser/goreleaser@v1.25.1/internal/pipe/publish/publish.go (about)

     1  // Package publish contains the publishing pipe.
     2  package publish
     3  
     4  import (
     5  	"fmt"
     6  
     7  	"github.com/goreleaser/goreleaser/internal/middleware/errhandler"
     8  	"github.com/goreleaser/goreleaser/internal/middleware/logging"
     9  	"github.com/goreleaser/goreleaser/internal/middleware/skip"
    10  	"github.com/goreleaser/goreleaser/internal/pipe/artifactory"
    11  	"github.com/goreleaser/goreleaser/internal/pipe/aur"
    12  	"github.com/goreleaser/goreleaser/internal/pipe/blob"
    13  	"github.com/goreleaser/goreleaser/internal/pipe/brew"
    14  	"github.com/goreleaser/goreleaser/internal/pipe/chocolatey"
    15  	"github.com/goreleaser/goreleaser/internal/pipe/custompublishers"
    16  	"github.com/goreleaser/goreleaser/internal/pipe/docker"
    17  	"github.com/goreleaser/goreleaser/internal/pipe/ko"
    18  	"github.com/goreleaser/goreleaser/internal/pipe/krew"
    19  	"github.com/goreleaser/goreleaser/internal/pipe/milestone"
    20  	"github.com/goreleaser/goreleaser/internal/pipe/nix"
    21  	"github.com/goreleaser/goreleaser/internal/pipe/release"
    22  	"github.com/goreleaser/goreleaser/internal/pipe/scoop"
    23  	"github.com/goreleaser/goreleaser/internal/pipe/sign"
    24  	"github.com/goreleaser/goreleaser/internal/pipe/snapcraft"
    25  	"github.com/goreleaser/goreleaser/internal/pipe/upload"
    26  	"github.com/goreleaser/goreleaser/internal/pipe/winget"
    27  	"github.com/goreleaser/goreleaser/internal/skips"
    28  	"github.com/goreleaser/goreleaser/pkg/context"
    29  )
    30  
    31  // Publisher should be implemented by pipes that want to publish artifacts.
    32  type Publisher interface {
    33  	fmt.Stringer
    34  
    35  	// Default sets the configuration defaults
    36  	Publish(ctx *context.Context) error
    37  }
    38  
    39  // New publish pipeline.
    40  func New() Pipe {
    41  	return Pipe{
    42  		pipeline: []Publisher{
    43  			blob.Pipe{},
    44  			upload.Pipe{},
    45  			artifactory.Pipe{},
    46  			custompublishers.Pipe{},
    47  			docker.Pipe{},
    48  			docker.ManifestPipe{},
    49  			ko.Pipe{},
    50  			sign.DockerPipe{},
    51  			snapcraft.Pipe{},
    52  			// This should be one of the last steps
    53  			release.Pipe{},
    54  			// brew et al use the release URL, so, they should be last
    55  			nix.NewPublish(),
    56  			winget.Pipe{},
    57  			brew.Pipe{},
    58  			aur.Pipe{},
    59  			krew.Pipe{},
    60  			scoop.Pipe{},
    61  			chocolatey.Pipe{},
    62  			milestone.Pipe{},
    63  		},
    64  	}
    65  }
    66  
    67  // Pipe that publishes artifacts.
    68  type Pipe struct {
    69  	pipeline []Publisher
    70  }
    71  
    72  func (Pipe) String() string                 { return "publishing" }
    73  func (Pipe) Skip(ctx *context.Context) bool { return skips.Any(ctx, skips.Publish) }
    74  
    75  func (p Pipe) Run(ctx *context.Context) error {
    76  	memo := errhandler.Memo{}
    77  	for _, publisher := range p.pipeline {
    78  		if err := skip.Maybe(
    79  			publisher,
    80  			logging.PadLog(
    81  				publisher.String(),
    82  				errhandler.Handle(publisher.Publish),
    83  			),
    84  		)(ctx); err != nil {
    85  			if ig, ok := publisher.(Continuable); ok && ig.ContinueOnError() && !ctx.FailFast {
    86  				memo.Memorize(fmt.Errorf("%s: %w", publisher.String(), err))
    87  				continue
    88  			}
    89  			return fmt.Errorf("%s: failed to publish artifacts: %w", publisher.String(), err)
    90  		}
    91  	}
    92  	return memo.Error()
    93  }
    94  
    95  type Continuable interface {
    96  	ContinueOnError() bool
    97  }