Browse Source

changed the projects

luisf 8 years ago
parent
commit
3d32f9a400

+ 7 - 6
buildme.yml

@@ -1,7 +1,8 @@
-BASE: golang/1.8.1-alpine
-PREPARE:
-  - apk add --update make
-  - apk add --update git
-BUILD:
-  - make dist
+SEQ:
+  - build
+  - test
+  - deploy
+steps:
+  build:
+    - /docker/Dockerfile.build
 

+ 18 - 6
docker/Dockerfile.build

@@ -1,10 +1,22 @@
-FROM golang:1.8.1-alpine
-RUN apk add --update make
-RUN apk add --update git
+#Should be called DIST generator
+
+FROM golang:1.8.1
 
 ADD . /buildme
-WORKDIR /buildme
+WORKDIR buildme
+
+ENV GOPATH=/buildme
+
+# 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
 
-RUN make deps
+# DIST
+RUN tar -cz DIST >dist.tar.gz
 
-CMD make dist
+# Generate img
+CMD cat dist.tar.gz

+ 0 - 13
docker/Dockerfile.build2

@@ -1,13 +0,0 @@
-#Should be called DIST generator
-
-FROM golang:1.8.1
-
-ADD src/buildme $GOPATH/src/buildme/
-WORKDIR $GOPATH
-
-# Build steps
-RUN go get -v buildme/cmd/builder
-RUN CGO_ENABLED=0 go build -o DIST/builder buildme/cmd/builder
-
-# Generate img
-CMD tar -cz - bin/builder

+ 10 - 0
docker/Dockerfile.build3

@@ -0,0 +1,10 @@
+FROM golang:1.8.1-alpine
+RUN apk add --update make
+RUN apk add --update git
+
+ADD . /buildme
+WORKDIR /buildme
+
+RUN make deps
+
+CMD make dist

+ 17 - 0
src/buildme/README.md

@@ -1,7 +1,20 @@
 buildme
 =====================
 
+The idea came because i wanted to have a build server inside own docker,    
+I wront a script that simple cloned a repository and execute docker build .  
+The problem was I wanted to have this script inside a container therefor I would have to
+execute something like:
+```
+docker run -v /var/run/docker.sock:/var/run/docker.sock builder ./buildcmd <url>
+```
+
+Theoricaly a git combined with a docker would suffice
+
 Automate builds
+The goal is to maintain an app  being Web Server as a container inside a docker binding to host docker.
+
+cat repo.tar | curl -X POST --data-binary=@- http://localhost:2080/build
 
 
 
@@ -12,4 +25,8 @@ Fetcher operation:
 2. Return a tar file reader
 
 
+###buildme.yml // Descriptions and docker builds
+
+
+
 

+ 33 - 55
src/buildme/buildme.go

@@ -2,18 +2,15 @@
 package buildme
 
 import (
-	"context"
+	"archive/tar"
 	"errors"
-	"fmt"
-	"io"
+	"io/ioutil"
 	"os"
 	"os/exec"
 
-	"dev.hexasoftware.com/hxs/prettylog"
+	yaml "gopkg.in/yaml.v2"
 
-	"github.com/docker/docker/api/types"
-	"github.com/docker/docker/api/types/container"
-	docker "github.com/docker/docker/client"
+	"dev.hexasoftware.com/hxs/prettylog"
 )
 
 var (
@@ -30,6 +27,33 @@ func New() *BuildMe {
 	return &BuildMe{}
 }*/
 
+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()
+		if err != nil {
+			break
+		}
+		if thead.FileInfo().Name() == "buildme.yml" {
+			break // found
+		}
+	}
+	if thead == nil {
+		return
+	}
+
+	data, err := ioutil.ReadAll(tr)
+	ydata := map[string]interface{}{}
+	yaml.Unmarshal(data, &ydata)
+	log.Println("buildme found, Reading instructions")
+	log.Println("Sequence:", ydata["SEQ"])
+}
+
 //Fetch fetches a Tar file from path/url
 func Fetch(ftype string, fpath string) (*Project, error) {
 	fetcher, ok := fetchers[ftype]
@@ -52,57 +76,11 @@ func Build(ftype string, fpath string) error {
 		return err
 	}
 	defer proj.Close()
+	Prepare(proj)
 
+	proj.Docker()
 	//addDockerfile(proj)
 
-	log.Println("New docker environ")
-	cli, err := docker.NewEnvClient()
-	if err != nil {
-		return err
-	}
-
-	dockertag := fmt.Sprintf("%s-builder", proj.Name)
-	log.Println("Building and tagging:", dockertag)
-	///////////////
-	/// DOCKER OPERATION / BUILDER operation
-	ctx := context.Background()
-	{
-		log.Println("Docker image build dockerfile:", proj.Dockerfile)
-		imageRes, err := cli.ImageBuild(ctx, proj, types.ImageBuildOptions{Tags: []string{dockertag}, Dockerfile: proj.Dockerfile})
-		if err != nil {
-			return err
-		}
-		defer imageRes.Body.Close()
-		io.Copy(os.Stdout, imageRes.Body) // Do some treatment somehow
-		//inf, err := cli.Info(ctx)
-		//log.Println("Info:", inf, err)
-	}
-
-	{
-
-		log.Println("Testing running the builder")
-		containerName := dockertag
-		containerCfg := &container.Config{AttachStdout: true, Cmd: []string{"/bin/sh", "-c", "echo $CMD"}}
-		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")
-		err = cli.ContainerStart(ctx, res.ID, types.ContainerStartOptions{AttachStdout: true})
-		if err != nil {
-			return err
-		}*/
-
-		log.Println("Please execute docker run", containerName, "> dist.tar.gz")
-		log.Println("Trying to remove container", res)
-		err = cli.ContainerRemove(ctx, res.ID, types.ContainerRemoveOptions{})
-		if err != nil {
-			return err
-		}
-	}
-
 	//////////////////////
 	// Docker run builder
 

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

@@ -46,10 +46,14 @@ func (g *Git) Fetch(fpath string) (*buildme.Project, error) {
 	/*tarfile, err := ioutil.TempFile("/tmp", "tarbuildme.")
 	reader, err := utils.TarDir(tmpdir, tarfile)*/
 
-	tarReader, err := utils.TempTar(tmpdir, os.TempDir(), "buildme.tar")
+	tarFile, err := utils.TempTar(tmpdir, os.TempDir(), "buildme.tar")
+	log.Println("Tar file:", tarFile.Name())
 
 	log.Println("Removing dir", tmpdir)
 	os.RemoveAll(tmpdir)
 
-	return &buildme.Project{tarReader, projName, "docker/Dockerfile.build"}, nil
+	proj := buildme.NewProject(projName)
+	proj.SetTarFile(tarFile.Name(), true)
+
+	return proj, nil
 }

+ 7 - 3
src/buildme/fetcher/path/path.go

@@ -37,12 +37,16 @@ func (p *Path) Fetch(fpath string) (*buildme.Project, error) {
 	log.Println("Building path:", fpath)
 	projName := filepath.Base(fpath)
 
-	tmpTarReader, err := utils.Tar(fpath, nil) // in memory
-	//tmpTarReader, err := utils.TempTar(fpath, os.TempDir(), "tarbuildme.")
+	//tmpTarReader, err := utils.Tar(fpath, nil) // in memory
+	tarFile, err := utils.TempTar(fpath, os.TempDir(), "tarbuildme.")
 	if err != nil {
 		return nil, err
 	}
+	tarFile.Close()
+	log.Println("Tar file:", tarFile.Name())
+	proj := buildme.NewProject(projName)
+	proj.SetTarFile(tarFile.Name(), true)
 
-	return &buildme.Project{tmpTarReader, projName, "docker/Dockerfile.build"}, nil
+	return proj, nil
 
 }

+ 112 - 4
src/buildme/project.go

@@ -1,10 +1,118 @@
 package buildme
 
-import "io"
+import (
+	"context"
+	"fmt"
+	"io"
+	"os"
+
+	"github.com/docker/docker/api/types"
+	"github.com/docker/docker/api/types/container"
+	docker "github.com/docker/docker/client"
+)
 
 // Project type
 type Project struct {
-	io.ReadCloser // Tar format? tar reader perhaps
-	Name          string
-	Dockerfile    string
+	tarFile string
+	isTemp  bool
+	//utils.Filer
+	//io.ReadCloser // Tar format? tar reader perhaps
+	Name       string
+	Dockerfile string
+	Steps      string
+}
+
+func NewProject(name string) *Project {
+	return &Project{
+		tarFile:    "",
+		isTemp:     false,
+		Name:       name,
+		Dockerfile: "docker/Dockerfile.build",
+		Steps:      "",
+	}
+}
+func (p *Project) SetTarFile(tarFile string, isTemp bool) *Project {
+	p.tarFile = tarFile
+	p.isTemp = isTemp
+	return p
+}
+func (p *Project) SetName(name string) *Project {
+	p.Name = name
+	return p
+}
+func (p *Project) SetDockerfile(dockerfile string) *Project {
+	p.Dockerfile = dockerfile
+	return p
+}
+
+func (p *Project) Reader() io.ReadCloser {
+	f, _ := os.Open(p.tarFile)
+	return f
+}
+
+func (p *Project) Close() {
+	if p.isTemp {
+		log.Println("Closing temporary file")
+		os.Remove(p.tarFile)
+	}
+	//os.Remove(tarFile) // Should remove??
+}
+
+func (p *Project) Docker() error {
+	log.Println("New docker environ")
+	cli, err := docker.NewEnvClient()
+	if err != nil {
+		return err
+	}
+
+	dockertag := fmt.Sprintf("%s-builder", p.Name)
+	log.Println("Building and tagging:", dockertag)
+	///////////////
+	/// DOCKER OPERATION / BUILDER operation
+	ctx := context.Background()
+	{
+		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 {
+			return err
+		}
+		defer imageRes.Body.Close()
+		io.Copy(os.Stdout, imageRes.Body) // Do some treatment somehow
+		//inf, err := cli.Info(ctx)
+		//log.Println("Info:", inf, err)
+	}
+
+	{
+
+		log.Println("Testing running the builder")
+		containerName := dockertag
+		containerCfg := &container.Config{AttachStdout: true, Cmd: []string{"cat", "/buildme/dist.tar.gz"}}
+		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)
+		}
+		defer cr.Close()
+
+		f, err := os.OpenFile("DIST/test.tar.gz", os.O_CREATE|os.O_WRONLY, os.FileMode(0600))
+		io.Copy(f, cr)
+
+		/*err = cli.ContainerStart(ctx, res.ID, types.ContainerStartOptions{AttachStdout: true})
+		if err != nil {
+			return err
+		}*/
+
+		log.Println("Please execute docker run", containerName, "> dist.tar.gz")
+		log.Println("Trying to remove container", res)
+		err = cli.ContainerRemove(ctx, res.ID, types.ContainerRemoveOptions{})
+		if err != nil {
+			return err
+		}
+	}
+	return nil
 }

+ 7 - 0
src/buildme/utils/noprwcloser.go

@@ -12,3 +12,10 @@ func (*nopRWCloser) Close() error {
 func NopRWCloser(rw io.ReadWriter) io.ReadWriteCloser {
 	return &nopRWCloser{rw}
 }
+
+type Filer interface {
+	io.Reader
+	io.Writer
+	io.Seeker
+	io.Closer
+}

+ 10 - 17
src/buildme/utils/tardir.go

@@ -2,7 +2,6 @@ package utils
 
 import (
 	"archive/tar"
-	"bytes"
 	"errors"
 	"io"
 	"io/ioutil"
@@ -12,18 +11,13 @@ import (
 )
 
 //Tar tar a folder and return a reader?
-func Tar(fpath string, f *os.File) (io.ReadWriteCloser, error) {
+func Tar(fpath string, f *os.File) error {
 	var err error
 
-	var w io.ReadWriteCloser
-	if f == nil { // if not file we do memory
-		w = NopRWCloser(&bytes.Buffer{})
-	} else {
-		w = f
-	}
+	w := f
 
 	if !filepath.IsAbs(fpath) {
-		return nil, errors.New("Path must be absolute")
+		return errors.New("Path must be absolute")
 	}
 	// Add slash to path end so files can be relative
 	if fpath[len(fpath)-1] != '/' {
@@ -64,30 +58,29 @@ func Tar(fpath string, f *os.File) (io.ReadWriteCloser, error) {
 		return nil
 	})
 	if err != nil {
-		return nil, err
+		return err
 	}
 	tw.Flush()
-	if f != nil {
-		f.Seek(0, os.SEEK_SET)
-	}
 
-	return w, nil
+	f.Seek(0, os.SEEK_SET)
+
+	return nil
 }
 
 //TempTar will delete temporary tar file on close
-func TempTar(fpath string, tmppath string, prefix string) (io.ReadCloser, error) {
+func TempTar(fpath string, tmppath string, prefix string) (*os.File, error) {
 
 	tarFile, err := ioutil.TempFile(tmppath, prefix)
 	if err != nil {
 		return nil, err
 	}
 
-	tarReader, err := Tar(fpath, tarFile)
+	err = Tar(fpath, tarFile)
 	if err != nil {
 		return nil, err
 	}
 
-	return &tarCloseDelete{tarReader, tarFile.Name()}, nil
+	return tarFile, nil
 
 }