Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 18 additions & 2 deletions .drone.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ steps:
- name: vet
image: golang:1.22
commands:
- sh buildkit/release.sh linux/amd64
- go vet ./...
environment:

Expand All @@ -24,6 +25,7 @@ steps:
- name: test
image: golang:1.22
commands:
- sh buildkit/release.sh linux/amd64
- go test -cover ./...
environment:

Expand Down Expand Up @@ -59,6 +61,7 @@ steps:
environment:
CGO_ENABLED: 0
commands:
- sh buildkit/release.sh linux/amd64
- go build -o release/windows/amd64/drone-docker.exe ./cmd/drone-docker
- name: build docker plugin
image: plugins/docker@sha256:f0233d950ae87ee6cb5500b2d5497fe02aa338201c0bdce2619f443fd174cfa4
Expand Down Expand Up @@ -102,6 +105,7 @@ steps:
environment:
CGO_ENABLED: 0
commands:
- sh buildkit/release.sh linux/amd64
- go build -o release/windows/amd64/drone-docker.exe ./cmd/drone-docker
- name: build docker plugin
image: plugins/docker
Expand Down Expand Up @@ -143,6 +147,7 @@ steps:
- name: build-push
image: golang:1.22
commands:
- sh buildkit/release.sh linux/amd64
- 'go build -v -ldflags "-X main.version=${DRONE_COMMIT_SHA:0:8}" -a -tags netgo -o release/linux/amd64/drone-docker ./cmd/drone-docker'
environment:
CGO_ENABLED: 0
Expand All @@ -154,6 +159,7 @@ steps:
- name: build-tag
image: golang:1.22
commands:
- sh buildkit/release.sh linux/amd64
- 'go build -v -ldflags "-X main.version=${DRONE_TAG##v}" -a -tags netgo -o release/linux/amd64/drone-docker ./cmd/drone-docker'
environment:
CGO_ENABLED: 0
Expand All @@ -164,6 +170,7 @@ steps:
- name: executable
image: golang:1.22
commands:
- sh buildkit/release.sh linux/amd64
- ./release/linux/amd64/drone-docker --help

- name: publish
Expand Down Expand Up @@ -208,6 +215,7 @@ steps:
- name: build-push
image: golang:1.22
commands:
- sh buildkit/release.sh linux/arm64
- 'go build -v -ldflags "-X main.version=${DRONE_COMMIT_SHA:0:8}" -a -tags netgo -o release/linux/arm64/drone-docker ./cmd/drone-docker'
environment:
CGO_ENABLED: 0
Expand All @@ -219,6 +227,7 @@ steps:
- name: build-tag
image: golang:1.22
commands:
- sh buildkit/release.sh linux/arm64
- 'go build -v -ldflags "-X main.version=${DRONE_TAG##v}" -a -tags netgo -o release/linux/arm64/drone-docker ./cmd/drone-docker'
environment:
CGO_ENABLED: 0
Expand All @@ -229,6 +238,7 @@ steps:
- name: executable
image: golang:1.22
commands:
- sh buildkit/release.sh linux/arm64
- ./release/linux/arm64/drone-docker --help

- name: publish
Expand Down Expand Up @@ -308,6 +318,7 @@ steps:
- name: build-push
image: golang:1.22
commands:
- sh buildkit/release.sh linux/amd64
- 'go build -v -ldflags "-X main.version=${DRONE_COMMIT_SHA:0:8}" -a -tags netgo -o release/linux/amd64/drone-heroku ./cmd/drone-heroku'
environment:
CGO_ENABLED: 0
Expand All @@ -318,6 +329,7 @@ steps:
- name: build-tag
image: golang:1.22
commands:
- sh buildkit/release.sh linux/amd64
- 'go build -v -ldflags "-X main.version=${DRONE_TAG##v}" -a -tags netgo -o release/linux/amd64/drone-heroku ./cmd/drone-heroku'
environment:
CGO_ENABLED: 0
Expand Down Expand Up @@ -367,6 +379,7 @@ steps:
- name: build-push
image: golang:1.22
commands:
- sh buildkit/release.sh linux/arm64
- 'go build -v -ldflags "-X main.version=${DRONE_COMMIT_SHA:0:8}" -a -tags netgo -o release/linux/arm64/drone-heroku ./cmd/drone-heroku'
environment:
CGO_ENABLED: 0
Expand All @@ -377,6 +390,7 @@ steps:
- name: build-tag
image: golang:1.22
commands:
- sh buildkit/release.sh linux/arm64
- 'go build -v -ldflags "-X main.version=${DRONE_TAG##v}" -a -tags netgo -o release/linux/arm64/drone-heroku ./cmd/drone-heroku'
environment:
CGO_ENABLED: 0
Expand Down Expand Up @@ -456,11 +470,13 @@ steps:
pull: always
image: golang:1.22
commands:
- sh buildkit/release.sh linux/amd64
- GOOS=linux GOARCH=amd64 go build -ldflags "-s -w" -a -tags netgo -o release/drone-buildx-linux-amd64 ./cmd/drone-docker
- GOOS=linux GOARCH=arm64 go build -ldflags "-s -w" -a -tags netgo -o release/drone-buildx-linux-arm64 ./cmd/drone-docker
- GOOS=darwin GOARCH=amd64 go build -ldflags "-s -w" -a -tags netgo -o release/drone-buildx-darwin-amd64 ./cmd/drone-docker
- GOOS=darwin GOARCH=arm64 go build -ldflags "-s -w" -a -tags netgo -o release/drone-buildx-darwin-arm64 ./cmd/drone-docker
- GOOS=windows GOARCH=amd64 go build -ldflags "-s -w" -a -tags netgo -o release/drone-buildx-windows-amd64 ./cmd/drone-docker
- sh buildkit/release.sh linux/arm64
- GOOS=linux GOARCH=arm64 go build -ldflags "-s -w" -a -tags netgo -o release/drone-buildx-linux-arm64 ./cmd/drone-docker
- GOOS=darwin GOARCH=arm64 go build -ldflags "-s -w" -a -tags netgo -o release/drone-buildx-darwin-arm64 ./cmd/drone-docker

environment:
CGO_ENABLED: 0
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ coverage.out
vendor
.vscode/
Dockerfile
buildkit/*.tar
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,20 @@

Drone plugin uses Docker-in-Docker to build and publish Docker images to a container registry. For the usage information and a listing of the available options please take a look at [the docs](http://plugins.drone.io/drone-plugins/drone-docker/).

## Updating Buildkit Version

If you want to update the buildkit version that is bundled with the plugin then update the version in the buildkit/version.json file and also run the following pipeline to upload the assets in the correct place: https://harness0.harness.io/ng/account/l7B_kbSEQD2wjrM7PShm5w/all/orgs/PROD/projects/CI/pipelines/Buildkit_Tarball_Uploader/pipeline-studio?storeType=INLINE

## Build

buildkit/version.json is the source of truth for the buildkit version to be used for self hosted. Please update this to use a newer buildkit version

Run the release script for buildkit. Give the argument according to the infra you are compiling for

```console
sh buildkit/release.sh linux/amd64
```

Build the binaries with the following commands:

```console
Expand Down
18 changes: 12 additions & 6 deletions app.go
Original file line number Diff line number Diff line change
Expand Up @@ -369,6 +369,11 @@ func Run() {
Usage: "access token",
EnvVar: "ACCESS_TOKEN",
},
cli.BoolTFlag{
Name: "use-loaded-buildkit",
Usage: "Use preloaded buildkit image. Default is true.",
EnvVar: "PLUGIN_USE_LOADED_BUILDKIT",
},
}

if err := app.Run(os.Args); err != nil {
Expand Down Expand Up @@ -445,12 +450,13 @@ func run(c *cli.Context) error {
ArtifactRegistry: c.String("artifact.registry"),
},
Builder: Builder{
Name: c.String("builder-name"),
DaemonConfig: c.String("builder-daemon-config"),
Driver: c.String("builder-driver"),
DriverOpts: c.Generic("builder-driver-opts").(*CustomStringSliceFlag).GetValue(),
DriverOptsNew: c.Generic("builder-driver-opts-new").(*CustomStringSliceFlag).GetValue(),
RemoteConn: c.String("builder-remote-conn"),
Name: c.String("builder-name"),
DaemonConfig: c.String("builder-daemon-config"),
Driver: c.String("builder-driver"),
DriverOpts: c.Generic("builder-driver-opts").(*CustomStringSliceFlag).GetValue(),
DriverOptsNew: c.Generic("builder-driver-opts-new").(*CustomStringSliceFlag).GetValue(),
RemoteConn: c.String("builder-remote-conn"),
UseLoadedBuildkit: c.BoolT("use-loaded-buildkit"),
},
BaseImageRegistry: c.String("docker.baseimageregistry"),
BaseImageUsername: c.String("docker.baseimageusername"),
Expand Down
29 changes: 29 additions & 0 deletions buildkit/release.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#!/bin/bash

# Usage: ./release.sh <platform>
# Example: ./release.sh linux/amd64

set -e

# Default platform
platform="${1:-linux/amd64}"

# Extract the full buildkit version (e.g., "harness/buildkit:1.0.6") without jq or grep -P
full_buildkit_version=$(grep '"buildkit_version"' buildkit/version.json | awk -F'"' '{print $4}')

# Extract only the version number (e.g., "1.0.6")
buildkit_version=${full_buildkit_version##*:}

# Parse platform components
os=${platform%%/*}
arch=${platform##*/}

# Construct GCS tarball URL
tarball_url="https://storage.cloud.google.com/harness-ti/buildkit/${buildkit_version}/harness-buildkit-${buildkit_version}-${os}-${arch}.tar"

# Download the tarball
echo "Downloading Buildkit tarball from ${tarball_url}..."
mkdir -p buildkit
curl -L -o buildkit/buildkit.tar "${tarball_url}"

echo "Buildkit tarball downloaded to buildkit/buildkit.tar"
3 changes: 3 additions & 0 deletions buildkit/version.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"buildkit_version": "harness/buildkit:1.0.6"
}
106 changes: 90 additions & 16 deletions docker.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package docker

import (
"bytes"
"embed"
"encoding/json"
"fmt"
"os"
Expand Down Expand Up @@ -34,12 +36,13 @@ type (
}

Builder struct {
Name string // Buildx builder name
DaemonConfig string // Buildx daemon config file path
Driver string // Buildx driver type
DriverOpts []string // Buildx driver opts
DriverOptsNew []string // Buildx driver opts new
RemoteConn string // Buildx remote connection endpoint
Name string // Buildx builder name
DaemonConfig string // Buildx daemon config file path
Driver string // Buildx driver type
DriverOpts []string // Buildx driver opts
DriverOptsNew []string // Buildx driver opts new
RemoteConn string // Buildx remote connection endpoint
UseLoadedBuildkit bool // Use loaded buildkit or no
}

// Login defines Docker login parameters.
Expand Down Expand Up @@ -129,16 +132,25 @@ type (
TagStruct struct {
Tag string `json:"Tag"`
}

BuildKitConfig struct {
BuildkitVersion string `json:"buildkit_version"`
}
)

//go:embed buildkit/buildkit.tar
var buildkitTarball embed.FS

//go:embed buildkit/version.json
var buildKitVersionFile embed.FS

// Exec executes the plugin step
func (p Plugin) Exec() error {

// start the Docker daemon server
if !p.Daemon.Disabled {
p.startDaemon()
}

// poll the docker daemon until it is started. This ensures the daemon is
// ready to accept connections before we proceed.
for i := 0; ; i++ {
Expand Down Expand Up @@ -231,33 +243,90 @@ func (p Plugin) Exec() error {
p.Builder.Driver = dockerContainerDriver
}

loadedBuildkitVersion := true
loadedBuildkitTarball := true
var config BuildKitConfig

if p.Builder.UseLoadedBuildkit {
configData, err := buildKitVersionFile.ReadFile("buildkit/version.json")
if err != nil {
fmt.Printf("Failed to read embedded buildkit version.json: %v\n", err)
loadedBuildkitVersion = false
}

if err := json.Unmarshal(configData, &config); err != nil {
fmt.Printf("Failed to read buildkit version.json: %v\n", err)
loadedBuildkitVersion = false
}

// Read the tarball from the embedded filesystem
data, err := buildkitTarball.ReadFile("buildkit/buildkit.tar")
if err != nil {
fmt.Printf("Failed to load buildkit tarball: %v\n", err)
loadedBuildkitTarball = false
}

loadCmd := commandLoad()
loadCmd.Stdin = bytes.NewReader(data)
if loadedBuildkitTarball {
if err := loadCmd.Run(); err != nil {
fmt.Printf("error while loading buildkit image: %s\n", err)
loadedBuildkitTarball = false
}
}
} else {
loadedBuildkitVersion = false
loadedBuildkitTarball = false
}

if p.Builder.Driver != "" && p.Builder.Driver != defaultDriver {
var (
raw []byte
err error
)

shouldFallback := true
if len(p.Builder.DriverOptsNew) != 0 {
createCmd := cmdSetupBuildx(p.Builder, p.Builder.DriverOptsNew)
raw, err = createCmd.Output()
if err == nil {
shouldFallback = false
} else {
if err != nil {
fmt.Printf("Unable to setup buildx with new driver opts: %s\n", err)
// Mark that the fallback will be used
shouldFallback = true
} else {
p.Builder.Name = strings.TrimSuffix(string(raw), "\n")
// If builder creation is successful, inspect the builder
inspectCmd := cmdInspectBuildx(p.Builder.Name)
if err := inspectCmd.Run(); err != nil {
fmt.Printf("Error while inspecting buildx builder with new driver opts: %s\n", err)
// Mark that the fallback will be used
shouldFallback = true
} else {
shouldFallback = false
}
}
}
if shouldFallback {
// Replace the image in driver opts with the buildkit version
if p.Builder.UseLoadedBuildkit && loadedBuildkitTarball && loadedBuildkitVersion {
fmt.Printf("Using BuildKit Version: %s\n", config.BuildkitVersion)
for i, opt := range p.Builder.DriverOpts {
if strings.HasPrefix(opt, "image=") {
// Replace the part after image= with config.BuildkitVersion
p.Builder.DriverOpts[i] = fmt.Sprintf("image=%s", config.BuildkitVersion)
}
}
}
createCmd := cmdSetupBuildx(p.Builder, p.Builder.DriverOpts)
raw, err = createCmd.Output()
if err != nil {
return fmt.Errorf("error while creating buildx builder: %s and err: %s", string(raw), err)
}
}
p.Builder.Name = strings.TrimSuffix(string(raw), "\n")

inspectCmd := cmdInspectBuildx(p.Builder.Name)
if err := inspectCmd.Run(); err != nil {
return fmt.Errorf("error while bootstraping buildx builder: %s", err)
p.Builder.Name = strings.TrimSuffix(string(raw), "\n")
inspectCmd := cmdInspectBuildx(p.Builder.Name)
if err := inspectCmd.Run(); err != nil {
return fmt.Errorf("error while bootstraping buildx builder: %s", err)
}
}

removeCmd := cmdRemoveBuildx(p.Builder.Name)
Expand All @@ -270,6 +339,7 @@ func (p Plugin) Exec() error {
addProxyBuildArgs(&p.Build)

var cmds []*exec.Cmd

cmds = append(cmds, commandVersion()) // docker version
cmds = append(cmds, commandInfo()) // docker info

Expand Down Expand Up @@ -743,6 +813,10 @@ func commandRmi(tag string) *exec.Cmd {
return exec.Command(dockerExe, "rmi", tag)
}

func commandLoad() *exec.Cmd {
return exec.Command(dockerExe, "image", "load")
}

func writeSSHPrivateKey(key string) (path string, err error) {
home, err := os.UserHomeDir()
if err != nil {
Expand Down