mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-11-03 17:43:42 +08:00 
			
		
		
		
	Merge pull request #2327 from tonistiigi/remote-connhelper-fix
remote: fix connhelpers with custom dialer
This commit is contained in:
		@@ -142,7 +142,7 @@ func (b *Builder) LoadNodes(ctx context.Context, opts ...LoadNodesOption) (_ []N
 | 
				
			|||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				d, err := driver.GetDriver(ctx, "buildx_buildkit_"+n.Name, factory, n.Endpoint, dockerapi, imageopt.Auth, kcc, n.BuildkitdFlags, n.Files, n.DriverOpts, n.Platforms, b.opts.contextPathHash, lno.dialMeta)
 | 
									d, err := driver.GetDriver(ctx, driver.BuilderName(n.Name), factory, n.Endpoint, dockerapi, imageopt.Auth, kcc, n.BuildkitdFlags, n.Files, n.DriverOpts, n.Platforms, b.opts.contextPathHash, lno.dialMeta)
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					node.Err = err
 | 
										node.Err = err
 | 
				
			||||||
					return nil
 | 
										return nil
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@ import (
 | 
				
			|||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
	"net"
 | 
						"net"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/docker/buildx/store"
 | 
						"github.com/docker/buildx/store"
 | 
				
			||||||
	"github.com/docker/buildx/util/progress"
 | 
						"github.com/docker/buildx/util/progress"
 | 
				
			||||||
@@ -67,6 +68,19 @@ type Driver interface {
 | 
				
			|||||||
	Config() InitConfig
 | 
						Config() InitConfig
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const builderNamePrefix = "buildx_buildkit_"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func BuilderName(name string) string {
 | 
				
			||||||
 | 
						return builderNamePrefix + name
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func ParseBuilderName(name string) (string, error) {
 | 
				
			||||||
 | 
						if !strings.HasPrefix(name, builderNamePrefix) {
 | 
				
			||||||
 | 
							return "", errors.Errorf("invalid builder name %q, must have %q prefix", name, builderNamePrefix)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return strings.TrimPrefix(name, builderNamePrefix), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Boot(ctx, clientContext context.Context, d *DriverHandle, pw progress.Writer) (*client.Client, error) {
 | 
					func Boot(ctx, clientContext context.Context, d *DriverHandle, pw progress.Writer) (*client.Client, error) {
 | 
				
			||||||
	try := 0
 | 
						try := 0
 | 
				
			||||||
	for {
 | 
						for {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -244,10 +244,10 @@ func (f *factory) AllowsInstances() bool {
 | 
				
			|||||||
// eg. "buildx_buildkit_loving_mendeleev0" -> "loving-mendeleev0"
 | 
					// eg. "buildx_buildkit_loving_mendeleev0" -> "loving-mendeleev0"
 | 
				
			||||||
func buildxNameToDeploymentName(bx string) (string, error) {
 | 
					func buildxNameToDeploymentName(bx string) (string, error) {
 | 
				
			||||||
	// TODO: commands.util.go should not pass "buildx_buildkit_" prefix to drivers
 | 
						// TODO: commands.util.go should not pass "buildx_buildkit_" prefix to drivers
 | 
				
			||||||
	if !strings.HasPrefix(bx, "buildx_buildkit_") {
 | 
						s, err := driver.ParseBuilderName(bx)
 | 
				
			||||||
		return "", errors.Errorf("expected a string with \"buildx_buildkit_\", got %q", bx)
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return "", err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	s := strings.TrimPrefix(bx, "buildx_buildkit_")
 | 
					 | 
				
			||||||
	s = strings.ReplaceAll(s, "_", "-")
 | 
						s = strings.ReplaceAll(s, "_", "-")
 | 
				
			||||||
	return s, nil
 | 
						return s, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,7 @@ func TestFactory_processDriverOpts(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cfg := driver.InitConfig{
 | 
						cfg := driver.InitConfig{
 | 
				
			||||||
		Name:             "buildx_buildkit_test",
 | 
							Name:             driver.BuilderName("test"),
 | 
				
			||||||
		KubeClientConfig: &kcc,
 | 
							KubeClientConfig: &kcc,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	f := factory{}
 | 
						f := factory{}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,6 +13,7 @@ import (
 | 
				
			|||||||
	util "github.com/docker/buildx/driver/remote/util"
 | 
						util "github.com/docker/buildx/driver/remote/util"
 | 
				
			||||||
	"github.com/docker/buildx/util/progress"
 | 
						"github.com/docker/buildx/util/progress"
 | 
				
			||||||
	"github.com/moby/buildkit/client"
 | 
						"github.com/moby/buildkit/client"
 | 
				
			||||||
 | 
						"github.com/moby/buildkit/client/connhelper"
 | 
				
			||||||
	"github.com/moby/buildkit/util/tracing/detect"
 | 
						"github.com/moby/buildkit/util/tracing/detect"
 | 
				
			||||||
	"github.com/pkg/errors"
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -95,7 +96,16 @@ func (d *Driver) Client(ctx context.Context) (*client.Client, error) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (d *Driver) Dial(ctx context.Context) (net.Conn, error) {
 | 
					func (d *Driver) Dial(ctx context.Context) (net.Conn, error) {
 | 
				
			||||||
	network, addr, ok := strings.Cut(d.InitConfig.EndpointAddr, "://")
 | 
						addr := d.InitConfig.EndpointAddr
 | 
				
			||||||
 | 
						ch, err := connhelper.GetConnectionHelper(addr)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if ch != nil {
 | 
				
			||||||
 | 
							return ch.ContextDialer(ctx, addr)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						network, addr, ok := strings.Cut(addr, "://")
 | 
				
			||||||
	if !ok {
 | 
						if !ok {
 | 
				
			||||||
		return nil, errors.Errorf("invalid endpoint address: %s", d.InitConfig.EndpointAddr)
 | 
							return nil, errors.Errorf("invalid endpoint address: %s", d.InitConfig.EndpointAddr)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,9 +1,13 @@
 | 
				
			|||||||
package tests
 | 
					package tests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/docker/buildx/driver"
 | 
				
			||||||
 | 
						"github.com/moby/buildkit/identity"
 | 
				
			||||||
	"github.com/moby/buildkit/util/testutil/integration"
 | 
						"github.com/moby/buildkit/util/testutil/integration"
 | 
				
			||||||
	"github.com/stretchr/testify/require"
 | 
						"github.com/stretchr/testify/require"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -18,6 +22,7 @@ func createCmd(sb integration.Sandbox, opts ...cmdOpt) (string, error) {
 | 
				
			|||||||
var createTests = []func(t *testing.T, sb integration.Sandbox){
 | 
					var createTests = []func(t *testing.T, sb integration.Sandbox){
 | 
				
			||||||
	testCreateMemoryLimit,
 | 
						testCreateMemoryLimit,
 | 
				
			||||||
	testCreateRestartAlways,
 | 
						testCreateRestartAlways,
 | 
				
			||||||
 | 
						testCreateRemoteContainer,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func testCreateMemoryLimit(t *testing.T, sb integration.Sandbox) {
 | 
					func testCreateMemoryLimit(t *testing.T, sb integration.Sandbox) {
 | 
				
			||||||
@@ -57,3 +62,49 @@ func testCreateRestartAlways(t *testing.T, sb integration.Sandbox) {
 | 
				
			|||||||
	require.NoError(t, err, out)
 | 
						require.NoError(t, err, out)
 | 
				
			||||||
	builderName = strings.TrimSpace(out)
 | 
						builderName = strings.TrimSpace(out)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func testCreateRemoteContainer(t *testing.T, sb integration.Sandbox) {
 | 
				
			||||||
 | 
						if sb.Name() != "docker" {
 | 
				
			||||||
 | 
							t.Skip("skipping test for non-docker workers")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ctnBuilderName := "ctn-builder-" + identity.NewID()
 | 
				
			||||||
 | 
						remoteBuilderName := "remote-builder-" + identity.NewID()
 | 
				
			||||||
 | 
						var hasCtnBuilder, hasRemoteBuilder bool
 | 
				
			||||||
 | 
						t.Cleanup(func() {
 | 
				
			||||||
 | 
							if hasCtnBuilder {
 | 
				
			||||||
 | 
								out, err := rmCmd(sb, withArgs(ctnBuilderName))
 | 
				
			||||||
 | 
								require.NoError(t, err, out)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if hasRemoteBuilder {
 | 
				
			||||||
 | 
								out, err := rmCmd(sb, withArgs(remoteBuilderName))
 | 
				
			||||||
 | 
								require.NoError(t, err, out)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						out, err := createCmd(sb, withArgs("--driver", "docker-container", "--name", ctnBuilderName))
 | 
				
			||||||
 | 
						require.NoError(t, err, out)
 | 
				
			||||||
 | 
						hasCtnBuilder = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						out, err = inspectCmd(sb, withArgs("--bootstrap", ctnBuilderName))
 | 
				
			||||||
 | 
						require.NoError(t, err, out)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cmd := dockerCmd(sb, withArgs("container", "inspect", fmt.Sprintf("%s0", driver.BuilderName(ctnBuilderName))))
 | 
				
			||||||
 | 
						cmd.Stderr = os.Stderr
 | 
				
			||||||
 | 
						require.NoError(t, cmd.Run())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						out, err = createCmd(sb, withArgs("--driver", "remote", "--name", remoteBuilderName, fmt.Sprintf("docker-container://%s0", driver.BuilderName(ctnBuilderName))))
 | 
				
			||||||
 | 
						require.NoError(t, err, out)
 | 
				
			||||||
 | 
						hasRemoteBuilder = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						out, err = inspectCmd(sb, withArgs(remoteBuilderName))
 | 
				
			||||||
 | 
						require.NoError(t, err, out)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, line := range strings.Split(out, "\n") {
 | 
				
			||||||
 | 
							if v, ok := strings.CutPrefix(line, "Status:"); ok {
 | 
				
			||||||
 | 
								require.Equal(t, strings.TrimSpace(v), "running")
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						require.Fail(t, "remote builder is not running")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user