Browse Source

improvements

Luis Figueiredo 8 years ago
parent
commit
bbb136e4bc

+ 5 - 4
Makefile

@@ -1,17 +1,18 @@
 
 
-GOPATH=${CURDIR}/.deps:${CURDIR}
+GOPATH=${CURDIR}/.deps:/home/stdio/go:${CURDIR}
 
 
-all: 
+all: .deps
 	go build -o DIST/builder buildme/cmd/builder
 
-deps: 
-	go get -v buildme/cmd/builder
+deps: .deps
 
 dist: 
 	tar -c DIST |gzip >dist.tar.gz
 
+.deps:
+	go get -v buildme/cmd/builder
 
 clean:
 	rm -f dist.tar.gz

+ 13 - 6
buildme.yml

@@ -1,8 +1,15 @@
-SEQ:
-  - build
-  - test
-  - deploy
-steps:
+meta:
+  project: buildme
+  default: build
+
+images:
+  builder:
+    dockerfile: docker/Dockerfile.build
+
+tasks:
   build:
-    - /docker/Dockerfile.build
+    use: builder
+    command: make dist
+    copy: /dist.tar.gz ./test.tar.gz
+
 

+ 8 - 24
docker/Dockerfile.build

@@ -1,24 +1,8 @@
-#Should be called DIST generator
-
-FROM golang:1.8.1
-
-ADD src/buildme $GOPATH/src/buildme
-
-RUN go get github.com/docker/docker # Prefetch
-
-ENV GOPATH=$GOPATH:/buildme
-
-WORKDIR $GOPATH
-# DEPS
-RUN go get -v buildme/cmd/builder
-# CODE TEST
-# RUN go test something
-# BUILD
-RUN CGO_ENABLED=0 go build -o /DIST/builder buildme/cmd/builder
-# ENV TEST
-
-# DIST
-RUN tar -cz /DIST >dist.tar.gz
-
-# Generate img
-#CMD cat dist.tar.gz
+FROM golang:1.8.1-alpine
+RUN apk add --update make
+RUN apk add --update git
+
+ADD . /buildme
+WORKDIR /buildme
+# Optimize goget
+#RUN go get github.com/docker/docker

+ 0 - 12
docker/Dockerfile.build2

@@ -1,12 +0,0 @@
-FROM golang:1.8.1-alpine
-RUN apk add --update make
-RUN apk add --update git
-
-ADD . /buildme
-WORKDIR /buildme
-# Optimize goget
-RUN go get github.com/docker/docker
-
-RUN make deps
-RUN make dist
-RUN ls .

+ 24 - 0
docker/Dockerfile.build3

@@ -0,0 +1,24 @@
+#Should be called DIST generator
+
+FROM golang:1.8.1
+
+ADD src/buildme $GOPATH/src/buildme
+
+RUN go get -v -u github.com/docker/docker # Prefetch
+
+ENV GOPATH=$GOPATH:/buildme
+
+WORKDIR $GOPATH
+# DEPS
+RUN go get -v buildme/cmd/builder
+# CODE TEST
+# RUN go test something
+# BUILD
+RUN CGO_ENABLED=0 go build -o /DIST/builder buildme/cmd/builder
+# ENV TEST
+
+# DIST
+RUN tar -cz /DIST >dist.tar.gz
+
+# Generate img
+#CMD cat dist.tar.gz

+ 20 - 12
src/buildme/buildme.go

@@ -7,6 +7,7 @@ import (
 	"io/ioutil"
 	"os"
 	"os/exec"
+	"path"
 
 	yaml "gopkg.in/yaml.v2"
 
@@ -19,6 +20,13 @@ var (
 	log                = prettylog.New("buildme")
 )
 
+func TempDir() string {
+	tmpDir := path.Join(os.TempDir(), "buildme")
+	os.MkdirAll(tmpDir, os.FileMode(0700))
+
+	return tmpDir
+}
+
 //BuildMe context
 /*type BuildMe struct{}
 
@@ -27,12 +35,14 @@ func New() *BuildMe {
 	return &BuildMe{}
 }*/
 
+// Actually load buildme.yml
 func Prepare(p *Project) {
 	var err error
 	var thead *tar.Header
 
 	pr := p.Reader()
 	defer pr.Close()
+
 	tr := tar.NewReader(pr)
 	for {
 		thead, err = tr.Next()
@@ -48,10 +58,15 @@ func Prepare(p *Project) {
 	}
 
 	data, err := ioutil.ReadAll(tr)
-	ydata := map[string]interface{}{}
-	yaml.Unmarshal(data, &ydata)
-	log.Println("buildme found, Reading instructions")
-	log.Println("Sequence:", ydata["SEQ"])
+
+	projConf := ProjectConf{}
+	err = yaml.Unmarshal(data, &projConf)
+	if err != nil {
+		log.Println("Error parsing yaml:", err)
+	}
+	p.SetConf(projConf)
+	p.Name = projConf.Meta.Project
+	log.Println("ProjConf:", projConf)
 }
 
 //Fetch fetches a Tar file from path/url
@@ -69,7 +84,6 @@ func Fetch(ftype string, fpath string) (*Project, error) {
 ///////////////////////////////////////////////////////////////// BUILD
 func Build(ftype string, fpath string, projName string) error {
 	var err error
-
 	// Fetch proj from tar
 	proj, err := Fetch(ftype, fpath)
 	if err != nil {
@@ -81,13 +95,7 @@ func Build(ftype string, fpath string, projName string) error {
 		proj.SetName(projName)
 	}
 
-	DockerBuild(proj)
-	//addDockerfile(proj)
-
-	//////////////////////
-	// Docker run builder
-
-	return nil
+	return DockerBuild(proj)
 }
 
 func mexec(cmdname string, args ...string) {

+ 15 - 4
src/buildme/cmd/builder/main.go

@@ -3,6 +3,7 @@ package main
 import (
 	"buildme"
 	"flag"
+	"strings"
 
 	_ "buildme/fetcher/git"
 	_ "buildme/fetcher/path"
@@ -15,6 +16,8 @@ var (
 )
 
 func main() {
+
+	strings.Fields("make \"myself and I \"")
 	var fetchType string
 	var fetchPath string
 	var fetchName string
@@ -32,12 +35,20 @@ func main() {
 
 	log.Println("Testing new build")
 
-	/*err = buildme.BuildTest(fetchType, fetchPath)
+	/* Ideal:
+	proj, err := buildme.Fetch(fetchType,fetchUrl)
+	proj.Task("which")
+	*/
+
+	proj, err := buildme.Fetch(fetchType, fetchPath)
 	if err != nil {
-		log.Println("Error building", err)
-	}*/
+		log.Println("Error fetching", err)
+		return
+	}
+	buildme.Prepare(proj) //XXX: This will change
+	err = proj.Task("build")
 
-	err = buildme.Build(fetchType, fetchPath, fetchName)
+	/*err = buildme.Build(fetchType, fetchPath, fetchName)*/
 	if err != nil {
 		log.Println("Error building", err)
 	}

+ 2 - 1
src/buildme/docker.go

@@ -15,6 +15,7 @@ func DockerBuild(p *Project) error {
 	log.Println("New docker environ")
 	cli, err := docker.NewEnvClient()
 	if err != nil {
+		log.Println("Docker failed", err)
 		return err
 	}
 
@@ -27,6 +28,7 @@ func DockerBuild(p *Project) error {
 		log.Println("Docker image build dockerfile:", p.Dockerfile)
 		imageRes, err := cli.ImageBuild(ctx, p.Reader(), types.ImageBuildOptions{Tags: []string{dockertag}, Dockerfile: p.Dockerfile})
 		if err != nil {
+			log.Println("Error building image:", err)
 			return err
 		}
 		defer imageRes.Body.Close()
@@ -36,7 +38,6 @@ func DockerBuild(p *Project) error {
 	}
 
 	{
-
 		log.Println("Testing running the builder")
 		containerName := dockertag
 		containerCfg := &container.Config{AttachStdout: true, Cmd: []string{"cat", "/buildme/dist.tar.gz"}}

+ 2 - 2
src/buildme/fetcher/git/git.go

@@ -37,7 +37,7 @@ func (g *Git) Fetch(fpath string) (*buildme.Project, error) {
 	}
 
 	// Create tmpdir to clone project
-	tmpdirname, err := ioutil.TempDir("/tmp", "buildme.")
+	tmpdirname, err := ioutil.TempDir(buildme.TempDir(), "buildme.")
 	if err != nil {
 		return nil, err
 	}
@@ -56,7 +56,7 @@ func (g *Git) Fetch(fpath string) (*buildme.Project, error) {
 	/*tarfile, err := ioutil.TempFile("/tmp", "tarbuildme.")
 	reader, err := utils.TarDir(tmpdir, tarfile)*/
 	// Create a temporary tar file from tmpdirname
-	tarFile, err := utils.TempTar(tmpdirname, os.TempDir(), "buildme.tar")
+	tarFile, err := utils.TempTar(tmpdirname, buildme.TempDir(), "buildme.tar")
 	log.Println("Tar file:", tarFile.Name())
 
 	log.Println("Removing dir", tmpdirname)

+ 1 - 1
src/buildme/fetcher/path/path.go

@@ -38,7 +38,7 @@ func (p *Path) Fetch(fpath string) (*buildme.Project, error) {
 	projName := filepath.Base(fpath)
 
 	//tmpTarReader, err := utils.Tar(fpath, nil) // in memory
-	tarFile, err := utils.TempTar(fpath, os.TempDir(), "tarbuildme.")
+	tarFile, err := utils.TempTar(fpath, buildme.TempDir(), "tarbuildme.")
 	if err != nil {
 		return nil, err
 	}

+ 123 - 2
src/buildme/project.go

@@ -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
+}

+ 21 - 0
src/buildme/project_conf.go

@@ -0,0 +1,21 @@
+package buildme
+
+type ProjectConf struct {
+	Meta   MetaConf             `yaml:"meta"`
+	Images map[string]ImageConf `yaml:"images"`
+	Tasks  map[string]TaskConf  `yaml:"tasks"`
+}
+
+type MetaConf struct {
+	Project string `yaml:"project"`
+	Default string `yaml:"default"`
+}
+type ImageConf struct {
+	Dockerfile string `yaml:"dockerfile"`
+}
+
+type TaskConf struct {
+	Use     string `yaml:"use"`
+	Command string `yaml:"command"`
+	//Copy after run
+}