blob: ffd7323843ee7849acbe929ee49f1d959a53d02d [file] [log] [blame]
//go:build ignore
// +build ignore
package main
import (
"fmt"
"os"
"os/exec"
"path/filepath"
"runtime"
"sketch.dev/dockerimg"
)
func main() {
if runtime.GOOS != "linux" || runtime.GOARCH != "amd64" {
fmt.Fprintf(os.Stderr, "pushdockerimg.go: requires ubuntu linux/amd64\n")
os.Exit(2)
}
// Display setup instructions for vanilla Ubuntu
fmt.Print(`Push a sketch docker image to the public GitHub container registry.
# One-off setup instructions:
sudo apt-get update
sudo apt-get install docker.io docker-buildx qemu-user-static
# Login to Docker with GitHub credentials
# You can get $GH_ACCESS_TOK from github.com or from 'gh auth token'.
# On github.com, User icon in top right...Settings...Developer Settings.
# Choose classic personal access token, add scopes write:packages.
# Make sure the token is configured to write containers for the boldsoftware org.
echo $GH_ACCESS_TOK | docker login ghcr.io -u $GH_USER --password-stdin
This script will build and push multi-architecture Docker images to ghcr.io.
Ensure you have followed the setup instructions above and are logged in to Docker and GitHub.
Press Enter to continue or Ctrl+C to abort...`)
fmt.Scanln()
// Create a temporary directory for building
dir, err := os.MkdirTemp("", "sketch-pushdockerimg-*")
if err != nil {
panic(err)
}
defer os.RemoveAll(dir)
// Get default image information
name, dockerfile, tag := dockerimg.DefaultImage()
// Write the Dockerfile to the temporary directory
if err := os.WriteFile(filepath.Join(dir, "Dockerfile"), []byte(dockerfile), 0o666); err != nil {
panic(err)
}
// Helper function to run commands
run := func(args ...string) {
cmd := exec.Command(args[0], args[1:]...)
cmd.Dir = dir
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
fmt.Printf("running %v\n", cmd.Args)
if err := cmd.Run(); err != nil {
panic(err)
}
}
path := name + ":" + tag
// Set up BuildX for multi-arch builds
run("docker", "buildx", "create", "--name", "multiarch-builder", "--use")
// Make sure the builder is using the proper driver for multi-arch builds
run("docker", "buildx", "inspect", "--bootstrap")
// Build and push the multi-arch image in a single command
run("docker", "buildx", "build",
"--platform", "linux/amd64,linux/arm64",
"-t", path,
"-t", name+":latest",
"--push",
".",
)
// Inspect the built image to verify it contains both architectures
run("docker", "buildx", "imagetools", "inspect", path)
// Clean up the builder
run("docker", "buildx", "rm", "multiarch-builder")
fmt.Printf("\n✅ Successfully built and pushed multi-arch image: %s\n", path)
}