drone-docker-buildx/main.go

162 lines
3.5 KiB
Go
Raw Normal View History

2015-05-15 05:12:50 +00:00
package main
import (
"fmt"
"io/ioutil"
"os"
"os/exec"
"strings"
"time"
"github.com/drone/drone-plugin-go/plugin"
)
type Docker struct {
Storage string `json:"storage_driver"`
2015-05-15 05:12:50 +00:00
Registry string `json:"registry"`
2015-09-03 05:14:57 +00:00
Insecure bool `json:"insecure"`
2015-05-15 05:12:50 +00:00
Username string `json:"username"`
Password string `json:"password"`
Email string `json:"email"`
2015-05-16 00:18:07 +00:00
Auth string `json:"auth"`
2015-05-15 05:12:50 +00:00
Repo string `json:"repo"`
Tag string `json:"tag"`
File string `json:"file"`
}
func main() {
2015-09-02 22:30:42 +00:00
workspace := plugin.Workspace{}
build := plugin.Build{}
2015-05-15 05:12:50 +00:00
vargs := Docker{}
2015-09-02 22:30:42 +00:00
plugin.Param("workspace", &workspace)
plugin.Param("build", &build)
2015-05-15 05:12:50 +00:00
plugin.Param("vargs", &vargs)
2015-09-02 22:30:42 +00:00
plugin.MustParse()
2015-05-15 05:12:50 +00:00
// Set the storage driver
if len(vargs.Storage) == 0 {
2015-05-15 07:14:39 +00:00
vargs.Storage = "aufs"
}
2015-05-15 06:20:26 +00:00
stop := func() {
cmd := exec.Command("start-stop-daemon", "--stop", "--pidfile", "/var/run/docker.pid")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
trace(cmd)
cmd.Run()
}
defer stop()
2015-05-15 05:12:50 +00:00
// Starts the Docker daemon
go func() {
2015-05-15 06:20:26 +00:00
cmd := exec.Command("/bin/bash", "/bin/wrapdocker")
cmd.Stdout = ioutil.Discard
cmd.Stderr = ioutil.Discard
cmd.Run()
2015-09-03 05:14:57 +00:00
args := []string{"-d", "-s", vargs.Storage}
if vargs.Insecure && len(vargs.Registry) != 0 {
args = append(args, "--insecure-registry", vargs.Registry)
}
cmd = exec.Command("docker", args...)
2015-05-15 05:12:50 +00:00
cmd.Stdout = ioutil.Discard
cmd.Stderr = ioutil.Discard
2015-05-15 06:20:26 +00:00
trace(cmd)
2015-05-15 05:12:50 +00:00
cmd.Run()
}()
// Sleep for a few seconds
time.Sleep(5 * time.Second)
// Set the Registry value
if len(vargs.Registry) == 0 {
vargs.Registry = "https://index.docker.io/v1/"
}
// Set the Dockerfile path
if len(vargs.File) == 0 {
vargs.File = "."
}
// Set the Tag value
2015-09-03 05:14:57 +00:00
if len(vargs.Tag) == 0 {
2015-05-15 05:12:50 +00:00
vargs.Tag = "latest"
}
vargs.Repo = fmt.Sprintf("%s:%s", vargs.Repo, vargs.Tag)
2015-05-15 16:56:27 +00:00
// Login to Docker
2015-09-03 05:14:57 +00:00
if len(vargs.Username) != 0 {
cmd := exec.Command("docker", "login", "-u", vargs.Username, "-p", vargs.Password, "-e", vargs.Email, vargs.Registry)
cmd.Dir = workspace.Path
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Run()
if err != nil {
stop()
os.Exit(1)
}
} else {
fmt.Printf("A username was not specified. Assuming anoynmous publishing.\n")
2015-05-15 05:12:50 +00:00
}
2015-05-16 00:18:07 +00:00
// Docker environment info
2015-09-03 05:14:57 +00:00
cmd := exec.Command("docker", "version")
2015-05-16 00:18:07 +00:00
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
trace(cmd)
cmd.Run()
cmd = exec.Command("docker", "info")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
trace(cmd)
cmd.Run()
2015-05-15 16:56:27 +00:00
// Build the container
cmd = exec.Command("docker", "build", "--pull=true", "--rm=true", "-t", vargs.Repo, vargs.File)
2015-09-02 22:30:42 +00:00
cmd.Dir = workspace.Path
2015-05-15 05:12:50 +00:00
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
2015-05-15 16:56:27 +00:00
trace(cmd)
2015-09-03 05:14:57 +00:00
err := cmd.Run()
2015-05-15 05:12:50 +00:00
if err != nil {
2015-05-15 06:20:26 +00:00
stop()
2015-05-15 05:12:50 +00:00
os.Exit(1)
}
// Push the container
cmd = exec.Command("docker", "push", vargs.Repo)
2015-09-02 22:30:42 +00:00
cmd.Dir = workspace.Path
2015-05-15 05:12:50 +00:00
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
trace(cmd)
err = cmd.Run()
if err != nil {
2015-05-15 06:20:26 +00:00
stop()
2015-05-15 05:12:50 +00:00
os.Exit(1)
}
}
// Trace writes each command to standard error (preceded by a $ ) before it
// is executed. Used for debugging your build.
func trace(cmd *exec.Cmd) {
fmt.Println("$", strings.Join(cmd.Args, " "))
}
2015-05-16 00:18:07 +00:00
// authorize is a helper function that authorizes the Docker client
// by manually creating the Docker authentication file.
func authorize(d *Docker) error {
var path = "/root/.dockercfg" // TODO should probably use user.Home() for good measure
var data = fmt.Sprintf(dockerconf, d.Registry, d.Auth, d.Email)
return ioutil.WriteFile(path, []byte(data), 0644)
}
var dockerconf = `
{
"%s": {
"auth": "%s",
"email": "%s"
}
}
`