Skip to content

Commit

Permalink
use ssh for remote builders
Browse files Browse the repository at this point in the history
  • Loading branch information
michaeldwan committed Mar 4, 2021
1 parent 824a66b commit 94adcb3
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 19 deletions.
52 changes: 33 additions & 19 deletions docker/build.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package docker

import (
"errors"
"encoding/base64"
"fmt"
"io"
"net/http"
Expand All @@ -14,14 +14,15 @@ import (

"github.com/dustin/go-humanize"
"github.com/jpillora/backoff"
"github.com/pkg/errors"
"github.com/superfly/flyctl/api"
"github.com/superfly/flyctl/builtinsupport"
"github.com/superfly/flyctl/cmdctx"
"golang.org/x/net/context"
"golang.org/x/net/http/httpproxy"

"github.com/briandowns/spinner"
"github.com/buildpacks/pack"
"github.com/docker/cli/cli/connhelper"
"github.com/docker/docker/builder/dockerignore"
"github.com/docker/docker/client"
"github.com/docker/docker/pkg/fileutils"
Expand Down Expand Up @@ -337,11 +338,12 @@ func (op *BuildOperation) BuildWithPack(cmdCtx *cmdctx.CmdContext, buildArgs map
}

err := c.Build(op.ctx, pack.BuildOptions{
AppPath: cwd,
Builder: appConfig.Build.Builder,
Image: op.imageTag,
Buildpacks: appConfig.Build.Buildpacks,
Env: env,
AppPath: cwd,
Builder: appConfig.Build.Builder,
Image: op.imageTag,
Buildpacks: appConfig.Build.Buildpacks,
Env: env,
TrustBuilder: true,
})

if err != nil {
Expand Down Expand Up @@ -451,25 +453,37 @@ func setRemoteBuilder(ctx context.Context, cmdCtx *cmdctx.CmdContext, dockerClie
terminal.Debugf("Remote Docker builder URL: %s\n", rawURL)
terminal.Debugf("Remote Docker builder release: %+v\n", release)

dockerClient.docker, err = newDockerClient(client.WithHost(fmt.Sprintf("tcp://%s", cmdCtx.AppName)))
builderURL, err := url.Parse(rawURL)
if err != nil {
return fmt.Errorf("error resetting docker client to use remote builder config: %v", err)
return errors.Wrap(err, "error parsing remote builder url")
}

dockerTransport, ok := dockerClient.docker.HTTPClient().Transport.(*http.Transport)
if !ok {
return fmt.Errorf("Docker client transport was not an HTTP transport, don't know what to do with that")
}
builderURL, err := url.Parse(rawURL)
user := base64.RawStdEncoding.EncodeToString([]byte(url.UserPassword(cmdCtx.AppName, flyctl.GetAPIToken()).String()))
daemonURL := fmt.Sprintf("ssh://%s@%s:%d", user, builderURL.Hostname(), 10000)

helper, err := connhelper.GetConnectionHelperWithSSHOpts(daemonURL, []string{"-o", "StrictHostKeyChecking=no"})

if err != nil {
return fmt.Errorf("Could not parse builder url '%s': %v", rawURL, err)
return errors.Wrap(err, "error parsing remote builder connection")
}

builderURL.User = url.UserPassword(cmdCtx.AppName, flyctl.GetAPIToken())
httpClient := &http.Client{
Transport: &http.Transport{
DialContext: helper.Dialer,
},
}

var clientOpts []client.Opt

clientOpts = []client.Opt{
client.WithHTTPClient(httpClient),
client.WithHost(helper.Host),
client.WithDialContext(helper.Dialer),
}

proxyCfg := &httpproxy.Config{HTTPProxy: builderURL.String()}
dockerTransport.Proxy = func(req *http.Request) (*url.URL, error) {
return proxyCfg.ProxyFunc()(req.URL)
dockerClient.docker, err = newDockerClient(clientOpts...)
if err != nil {
return fmt.Errorf("error resetting docker client to use remote builder config: %v", err)
}

deadline := time.After(5 * time.Minute)
Expand Down
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ require (
github.com/briandowns/spinner v1.12.0
github.com/buildpacks/pack v0.17.0
github.com/containerd/console v1.0.1
github.com/docker/cli v20.10.4+incompatible // indirect
github.com/docker/docker v20.10.0-beta1.0.20201110211921-af34b94a78a1+incompatible
github.com/dustin/go-humanize v1.0.0
github.com/ejcx/sshcert v1.0.1
Expand All @@ -37,6 +38,7 @@ require (
github.com/stretchr/testify v1.7.0
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad
golang.org/x/net v0.0.0-20210119194325-5f4716e94777
golang.org/x/sys v0.0.0-20210226181700-f36f78243c0c // indirect
gopkg.in/yaml.v2 v2.4.0
)

Expand Down
4 changes: 4 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,8 @@ github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop
github.com/docker/cli v0.0.0-20200312141509-ef2f64abbd37/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
github.com/docker/cli v20.10.0-beta1.0.20201029214301-1d20b15adc38+incompatible h1:r99CiNpN5pxrSuSH36suYxrbLxFOhBvQ0sEH6624MHs=
github.com/docker/cli v20.10.0-beta1.0.20201029214301-1d20b15adc38+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
github.com/docker/cli v20.10.4+incompatible h1:0sFFJ07gYe3E+XYxJkYTDkoi7yTD+Zl42LrqVV5JS6A=
github.com/docker/cli v20.10.4+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY=
github.com/docker/distribution v2.6.0-rc.1.0.20180327202408-83389a148052+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug=
Expand Down Expand Up @@ -1329,6 +1331,8 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20201013081832-0aaa2718063a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210226181700-f36f78243c0c h1:Stq64DYWAFeYzD3+NSVDBisCYn5P9VyxxgHIov440m8=
golang.org/x/sys v0.0.0-20210226181700-f36f78243c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
Expand Down

0 comments on commit 94adcb3

Please sign in to comment.