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

     1  package docker
     2  
     3  import (
     4  	"fmt"
     5  	"regexp"
     6  
     7  	"github.com/goreleaser/goreleaser/pkg/context"
     8  )
     9  
    10  func init() {
    11  	registerManifester(useDocker, dockerManifester{})
    12  
    13  	registerImager(useDocker, dockerImager{})
    14  	registerImager(useBuildx, dockerImager{
    15  		buildx: true,
    16  	})
    17  }
    18  
    19  type dockerManifester struct{}
    20  
    21  func (m dockerManifester) Create(ctx *context.Context, manifest string, images, flags []string) error {
    22  	_ = runCommand(ctx, ".", "docker", "manifest", "rm", manifest)
    23  
    24  	args := []string{"manifest", "create", manifest}
    25  	args = append(args, images...)
    26  	args = append(args, flags...)
    27  
    28  	if err := runCommand(ctx, ".", "docker", args...); err != nil {
    29  		return fmt.Errorf("failed to create %s: %w", manifest, err)
    30  	}
    31  	return nil
    32  }
    33  
    34  func (m dockerManifester) Push(ctx *context.Context, manifest string, flags []string) (string, error) {
    35  	args := []string{"manifest", "push", manifest}
    36  	args = append(args, flags...)
    37  	bts, err := runCommandWithOutput(ctx, ".", "docker", args...)
    38  	if err != nil {
    39  		return "", fmt.Errorf("failed to push %s: %w", manifest, err)
    40  	}
    41  	digest := dockerDigestPattern.FindString(string(bts))
    42  	if digest == "" {
    43  		return "", fmt.Errorf("failed to find docker digest in docker push output: %s", string(bts))
    44  	}
    45  	return digest, nil
    46  }
    47  
    48  type dockerImager struct {
    49  	buildx bool
    50  }
    51  
    52  var dockerDigestPattern = regexp.MustCompile("sha256:[a-z0-9]{64}")
    53  
    54  func (i dockerImager) Push(ctx *context.Context, image string, _ []string) (string, error) {
    55  	bts, err := runCommandWithOutput(ctx, ".", "docker", "push", image)
    56  	if err != nil {
    57  		return "", fmt.Errorf("failed to push %s: %w", image, err)
    58  	}
    59  	digest := dockerDigestPattern.FindString(string(bts))
    60  	if digest == "" {
    61  		return "", fmt.Errorf("failed to find docker digest in docker push output: %s", string(bts))
    62  	}
    63  	return digest, nil
    64  }
    65  
    66  func (i dockerImager) Build(ctx *context.Context, root string, images, flags []string) error {
    67  	if err := runCommand(ctx, root, "docker", i.buildCommand(images, flags)...); err != nil {
    68  		return fmt.Errorf("failed to build %s: %w", images[0], err)
    69  	}
    70  	return nil
    71  }
    72  
    73  func (i dockerImager) buildCommand(images, flags []string) []string {
    74  	base := []string{"build", "."}
    75  	if i.buildx {
    76  		base = []string{"buildx", "build", ".", "--load"}
    77  	}
    78  	for _, image := range images {
    79  		base = append(base, "-t", image)
    80  	}
    81  	base = append(base, flags...)
    82  	return base
    83  }