mirror of
https://gitea.com/Lydanne/buildx.git
synced 2025-09-03 17:39:08 +08:00
Compare commits
9 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
788433953a | ||
![]() |
7e2460428d | ||
![]() |
3490181812 | ||
![]() |
19dbf2f7c4 | ||
![]() |
37b7ad1465 | ||
![]() |
2758919cf6 | ||
![]() |
911e346501 | ||
![]() |
46365ee32f | ||
![]() |
6430c9586a |
25
.github/workflows/docs-release.yml
vendored
25
.github/workflows/docs-release.yml
vendored
@@ -1,6 +1,11 @@
|
|||||||
name: docs-release
|
name: docs-release
|
||||||
|
|
||||||
on:
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
tag:
|
||||||
|
description: 'Git tag'
|
||||||
|
required: true
|
||||||
release:
|
release:
|
||||||
types:
|
types:
|
||||||
- released
|
- released
|
||||||
@@ -8,7 +13,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
open-pr:
|
open-pr:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
if: ${{ github.event.release.prerelease != true && github.repository == 'docker/buildx' }}
|
if: ${{ (github.event.release.prerelease != true || github.event.inputs.tag != '') && github.repository == 'docker/buildx' }}
|
||||||
steps:
|
steps:
|
||||||
-
|
-
|
||||||
name: Checkout docs repo
|
name: Checkout docs repo
|
||||||
@@ -22,6 +27,11 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
rm -rf ./data/buildx/*
|
rm -rf ./data/buildx/*
|
||||||
rm -rf ./_vendor/github.com/docker/buildx
|
rm -rf ./_vendor/github.com/docker/buildx
|
||||||
|
if [ -n "${{ github.event.inputs.tag }}" ]; then
|
||||||
|
echo "RELEASE_NAME=${{ github.event.inputs.tag }}" >> $GITHUB_ENV
|
||||||
|
else
|
||||||
|
echo "RELEASE_NAME=${{ github.event.release.name }}" >> $GITHUB_ENV
|
||||||
|
fi
|
||||||
-
|
-
|
||||||
name: Set up Docker Buildx
|
name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
@@ -29,7 +39,7 @@ jobs:
|
|||||||
name: Generate yaml
|
name: Generate yaml
|
||||||
uses: docker/bake-action@v4
|
uses: docker/bake-action@v4
|
||||||
with:
|
with:
|
||||||
source: ${{ github.server_url }}/${{ github.repository }}.git#${{ github.event.release.name }}
|
source: ${{ github.server_url }}/${{ github.repository }}.git#${{ env.RELEASE_NAME }}
|
||||||
targets: update-docs
|
targets: update-docs
|
||||||
set: |
|
set: |
|
||||||
*.output=/tmp/buildx-docs
|
*.output=/tmp/buildx-docs
|
||||||
@@ -43,21 +53,20 @@ jobs:
|
|||||||
name: Update vendor
|
name: Update vendor
|
||||||
uses: docker/bake-action@v4
|
uses: docker/bake-action@v4
|
||||||
with:
|
with:
|
||||||
source: ${{ github.server_url }}/${{ github.repository }}.git#${{ github.event.release.name }}
|
|
||||||
targets: vendor
|
targets: vendor
|
||||||
set: |
|
set: |
|
||||||
vendor.args.MODULE=github.com/docker/buildx@${{ github.event.release.name }}
|
vendor.args.MODULE=github.com/docker/buildx@${{ env.RELEASE_NAME }}
|
||||||
-
|
-
|
||||||
name: Create PR on docs repo
|
name: Create PR on docs repo
|
||||||
uses: peter-evans/create-pull-request@a4f52f8033a6168103c2538976c07b467e8163bc
|
uses: peter-evans/create-pull-request@a4f52f8033a6168103c2538976c07b467e8163bc
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GHPAT_DOCS_DISPATCH }}
|
token: ${{ secrets.GHPAT_DOCS_DISPATCH }}
|
||||||
push-to-fork: docker-tools-robot/docker.github.io
|
push-to-fork: docker-tools-robot/docker.github.io
|
||||||
commit-message: "vendor: github.com/docker/buildx ${{ github.event.release.name }}"
|
commit-message: "vendor: github.com/docker/buildx ${{ env.RELEASE_NAME }}"
|
||||||
signoff: true
|
signoff: true
|
||||||
branch: dispatch/buildx-ref-${{ github.event.release.name }}
|
branch: dispatch/buildx-ref-${{ env.RELEASE_NAME }}
|
||||||
delete-branch: true
|
delete-branch: true
|
||||||
title: Update buildx reference to ${{ github.event.release.name }}
|
title: Update buildx reference to ${{ env.RELEASE_NAME }}
|
||||||
body: |
|
body: |
|
||||||
Update the buildx reference documentation to keep in sync with the latest release `${{ github.event.release.name }}`
|
Update the buildx reference documentation to keep in sync with the latest release `${{ env.RELEASE_NAME }}`
|
||||||
draft: false
|
draft: false
|
||||||
|
@@ -259,6 +259,25 @@ func TestPushOverride(t *testing.T) {
|
|||||||
|
|
||||||
require.Equal(t, 1, len(m["app"].Outputs))
|
require.Equal(t, 1, len(m["app"].Outputs))
|
||||||
require.Equal(t, "type=image,push=true", m["app"].Outputs[0])
|
require.Equal(t, "type=image,push=true", m["app"].Outputs[0])
|
||||||
|
|
||||||
|
fp = File{
|
||||||
|
Name: "docker-bake.hcl",
|
||||||
|
Data: []byte(
|
||||||
|
`target "foo" {
|
||||||
|
output = [ "type=local,dest=out" ]
|
||||||
|
}
|
||||||
|
target "bar" {
|
||||||
|
}`),
|
||||||
|
}
|
||||||
|
ctx = context.TODO()
|
||||||
|
m, _, err = ReadTargets(ctx, []File{fp}, []string{"foo", "bar"}, []string{"*.push=true"}, nil)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
require.Equal(t, 2, len(m))
|
||||||
|
require.Equal(t, 1, len(m["foo"].Outputs))
|
||||||
|
require.Equal(t, []string{"type=local,dest=out"}, m["foo"].Outputs)
|
||||||
|
require.Equal(t, 1, len(m["bar"].Outputs))
|
||||||
|
require.Equal(t, []string{"type=image,push=true"}, m["bar"].Outputs)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestReadTargetsCompose(t *testing.T) {
|
func TestReadTargetsCompose(t *testing.T) {
|
||||||
|
@@ -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
|
||||||
|
@@ -72,7 +72,7 @@ func runBake(ctx context.Context, dockerCli command.Cli, targets []string, in ba
|
|||||||
|
|
||||||
overrides := in.overrides
|
overrides := in.overrides
|
||||||
if in.exportPush {
|
if in.exportPush {
|
||||||
overrides = append(overrides, "*.output=type=registry")
|
overrides = append(overrides, "*.push=true")
|
||||||
}
|
}
|
||||||
if in.exportLoad {
|
if in.exportLoad {
|
||||||
overrides = append(overrides, "*.output=type=docker")
|
overrides = append(overrides, "*.output=type=docker")
|
||||||
|
@@ -152,7 +152,7 @@ Allow extra privileged entitlement. List of entitlements:
|
|||||||
|
|
||||||
- `network.host` - Allows executions with host networking.
|
- `network.host` - Allows executions with host networking.
|
||||||
- `security.insecure` - Allows executions without sandbox. See
|
- `security.insecure` - Allows executions without sandbox. See
|
||||||
[related Dockerfile extensions](https://docs.docker.com/reference/dockerfile/#run---securitysandbox).
|
[related Dockerfile extensions](https://docs.docker.com/reference/dockerfile/#run---security).
|
||||||
|
|
||||||
For entitlements to be enabled, the BuildKit daemon also needs to allow them
|
For entitlements to be enabled, the BuildKit daemon also needs to allow them
|
||||||
with `--allow-insecure-entitlement` (see [`create --buildkitd-flags`](buildx_create.md#buildkitd-flags)).
|
with `--allow-insecure-entitlement` (see [`create --buildkitd-flags`](buildx_create.md#buildkitd-flags)).
|
||||||
|
@@ -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)
|
||||||
}
|
}
|
||||||
|
@@ -778,11 +778,11 @@ target "default" {
|
|||||||
outb, err := cmd.CombinedOutput()
|
outb, err := cmd.CombinedOutput()
|
||||||
require.NoError(t, err, string(outb))
|
require.NoError(t, err, string(outb))
|
||||||
|
|
||||||
// test registry
|
// TODO: test registry when --load case fixed for bake (currently overrides --push)
|
||||||
desc, provider, err := contentutil.ProviderFromRef(target)
|
//desc, provider, err := contentutil.ProviderFromRef(target)
|
||||||
require.NoError(t, err)
|
//require.NoError(t, err)
|
||||||
_, err = testutil.ReadImages(sb.Context(), provider, desc)
|
//_, err = testutil.ReadImages(sb.Context(), provider, desc)
|
||||||
require.NoError(t, err)
|
//require.NoError(t, err)
|
||||||
|
|
||||||
// test docker store
|
// test docker store
|
||||||
cmd = dockerCmd(sb, withArgs("image", "inspect", target))
|
cmd = dockerCmd(sb, withArgs("image", "inspect", target))
|
||||||
|
@@ -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