|
@@ -0,0 +1,117 @@
|
|
|
+/* buildme context */
|
|
|
+package buildme
|
|
|
+
|
|
|
+import (
|
|
|
+ "context"
|
|
|
+ "errors"
|
|
|
+ "fmt"
|
|
|
+ "io"
|
|
|
+ "os"
|
|
|
+ "os/exec"
|
|
|
+
|
|
|
+ "dev.hexasoftware.com/hxs/prettylog"
|
|
|
+
|
|
|
+ "github.com/docker/docker/api/types"
|
|
|
+ "github.com/docker/docker/api/types/container"
|
|
|
+ docker "github.com/docker/docker/client"
|
|
|
+)
|
|
|
+
|
|
|
+var (
|
|
|
+ //ErrFetcherNotFound In case fetcher is not found
|
|
|
+ ErrFetcherNotFound = errors.New("Fetcher not found")
|
|
|
+ log = prettylog.New("buildme")
|
|
|
+)
|
|
|
+
|
|
|
+//BuildMe context
|
|
|
+/*type BuildMe struct{}
|
|
|
+
|
|
|
+//New buildme context
|
|
|
+func New() *BuildMe {
|
|
|
+ return &BuildMe{}
|
|
|
+}*/
|
|
|
+
|
|
|
+//Fetch fetches a Tar file from path/url
|
|
|
+func Fetch(ftype string, fpath string) (*Project, error) {
|
|
|
+ fetcher, ok := fetchers[ftype]
|
|
|
+ if !ok {
|
|
|
+ return nil, ErrFetcherNotFound
|
|
|
+ }
|
|
|
+ log.Println("Fetching:", fpath)
|
|
|
+
|
|
|
+ return fetcher.Fetch(fpath)
|
|
|
+}
|
|
|
+
|
|
|
+// Build Fetch url/path and run docker build
|
|
|
+///////////////////////////////////////////////////////////////// BUILD
|
|
|
+func Build(ftype string, fpath string) error {
|
|
|
+ var err error
|
|
|
+
|
|
|
+ // Fetch proj from tar
|
|
|
+ proj, err := Fetch(ftype, fpath)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ defer proj.Close()
|
|
|
+
|
|
|
+ //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
|
|
|
+
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func mexec(cmdname string, args ...string) {
|
|
|
+ cmd := exec.Command(cmdname, args...)
|
|
|
+ cmd.Stderr = os.Stderr
|
|
|
+ cmd.Stdout = os.Stdout
|
|
|
+ cmd.Run()
|
|
|
+}
|