|
@@ -1,8 +1,17 @@
|
|
|
package buildme
|
|
|
|
|
|
import (
|
|
|
+ "bufio"
|
|
|
+ "context"
|
|
|
+ "encoding/json"
|
|
|
+ "fmt"
|
|
|
"io"
|
|
|
"os"
|
|
|
+ "strings"
|
|
|
+
|
|
|
+ "github.com/docker/docker/api/types"
|
|
|
+ "github.com/docker/docker/api/types/container"
|
|
|
+ docker "github.com/docker/docker/client"
|
|
|
)
|
|
|
|
|
|
// Project type
|
|
@@ -13,7 +22,9 @@ type Project struct {
|
|
|
//io.ReadCloser // Tar format? tar reader perhaps
|
|
|
Name string
|
|
|
Dockerfile string
|
|
|
- Steps string
|
|
|
+
|
|
|
+ conf ProjectConf
|
|
|
+ // Meta YML data
|
|
|
}
|
|
|
|
|
|
func NewProject(name string) *Project {
|
|
@@ -22,7 +33,7 @@ func NewProject(name string) *Project {
|
|
|
isTemp: false,
|
|
|
Name: name,
|
|
|
Dockerfile: "docker/Dockerfile.build",
|
|
|
- Steps: "",
|
|
|
+ conf: ProjectConf{},
|
|
|
}
|
|
|
}
|
|
|
func (p *Project) SetTarFile(tarFile string, isTemp bool) *Project {
|
|
@@ -39,6 +50,11 @@ func (p *Project) SetDockerfile(dockerfile string) *Project {
|
|
|
return p
|
|
|
}
|
|
|
|
|
|
+func (p *Project) SetConf(projConf ProjectConf) *Project {
|
|
|
+ p.conf = projConf
|
|
|
+ return p
|
|
|
+}
|
|
|
+
|
|
|
func (p *Project) Reader() io.ReadCloser {
|
|
|
f, _ := os.Open(p.tarFile)
|
|
|
return f
|
|
@@ -51,3 +67,108 @@ func (p *Project) Close() {
|
|
|
}
|
|
|
//os.Remove(tarFile) // Should remove??
|
|
|
}
|
|
|
+
|
|
|
+func (p *Project) Task(name string) error {
|
|
|
+
|
|
|
+ log.Printf("Proj: %s Running task: %s", p.Name, name)
|
|
|
+
|
|
|
+ taskconf, ok := p.conf.Tasks[name]
|
|
|
+ if !ok {
|
|
|
+ return fmt.Errorf("Task '%s' not found\nTasks: %s", name, p.conf.Tasks)
|
|
|
+ }
|
|
|
+ log.Println("Task found", taskconf)
|
|
|
+
|
|
|
+ // Running task:
|
|
|
+ log.Println("Using image:", taskconf.Use)
|
|
|
+ imgconf, ok := p.conf.Images[taskconf.Use]
|
|
|
+ if !ok {
|
|
|
+ return fmt.Errorf("Image '%s' not found\nImages: %s", taskconf.Use, p.conf.Images)
|
|
|
+ }
|
|
|
+
|
|
|
+ // Task kind docker
|
|
|
+ // Stupid docker cli
|
|
|
+ dockerhost := os.Getenv("DOCKER_HOST")
|
|
|
+ if !strings.Contains(dockerhost, "://") {
|
|
|
+ os.Setenv("DOCKER_HOST", "http://"+dockerhost)
|
|
|
+ }
|
|
|
+
|
|
|
+ cli, err := docker.NewEnvClient()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ ctx := context.Background()
|
|
|
+ dockertag := p.Name + "-" + name
|
|
|
+ {
|
|
|
+ // Check if container exists
|
|
|
+
|
|
|
+ /*r, err := cli.ContainerInspect(ctx, dockertag)
|
|
|
+ if err != nil {
|
|
|
+ log.Println("Error loading container", err)
|
|
|
+ } else {
|
|
|
+ log.Println("Container FOUND state:", r.State)
|
|
|
+ }*/
|
|
|
+ // Execute inside container
|
|
|
+
|
|
|
+ res, err := cli.ImageBuild(ctx, p.Reader(), types.ImageBuildOptions{Tags: []string{dockertag}, Dockerfile: imgconf.Dockerfile})
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ defer res.Body.Close()
|
|
|
+
|
|
|
+ br := bufio.NewReader(res.Body)
|
|
|
+ for {
|
|
|
+ jdata, _, err := br.ReadLine()
|
|
|
+ if err != nil {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ mdata := map[string]interface{}{}
|
|
|
+ json.Unmarshal(jdata, &mdata)
|
|
|
+
|
|
|
+ msg, ok := mdata["stream"]
|
|
|
+ if !ok {
|
|
|
+ msg = mdata["error"] // Error if exists
|
|
|
+ }
|
|
|
+ log.Println(msg)
|
|
|
+ }
|
|
|
+
|
|
|
+ /*out := prettylog.NewWriter("logger")
|
|
|
+ _, err = io.Copy(out, res.Body)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }*/
|
|
|
+
|
|
|
+ // Just output
|
|
|
+
|
|
|
+ }
|
|
|
+ {
|
|
|
+ log.Println("Testing running the builder")
|
|
|
+ containerName := dockertag
|
|
|
+ containerCfg := &container.Config{AttachStdout: true, Cmd: []string{taskconf.Command}}
|
|
|
+ res, err := cli.ContainerCreate(ctx, containerCfg, nil, nil, containerName)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ log.Println("Created container ID:", res)
|
|
|
+ log.Println("Starting container test")
|
|
|
+
|
|
|
+ cr, _, err := cli.CopyFromContainer(ctx, res.ID, "/buildme/dist.tar.gz")
|
|
|
+ if err != nil {
|
|
|
+ log.Println("Copy error", err)
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ defer cr.Close()
|
|
|
+
|
|
|
+ log.Println("Creating writing file")
|
|
|
+ f, err := os.OpenFile("test.tar.gz", os.O_CREATE|os.O_WRONLY, os.FileMode(0600))
|
|
|
+ if err != nil {
|
|
|
+ log.Println("Error opening file", err)
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ defer f.Close()
|
|
|
+
|
|
|
+ io.Copy(f, cr)
|
|
|
+ f.Sync()
|
|
|
+ }
|
|
|
+
|
|
|
+ return nil
|
|
|
+}
|