Add runtime => run
This commit is contained in:
		
							
								
								
									
										93
									
								
								runtime/package/docker/docker.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								runtime/package/docker/docker.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | ||||
| // Package docker builds docker images | ||||
| package docker | ||||
|  | ||||
| import ( | ||||
| 	"archive/tar" | ||||
| 	"bytes" | ||||
| 	"io/ioutil" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
|  | ||||
| 	"github.com/fsouza/go-dockerclient" | ||||
| 	"github.com/micro/go-log" | ||||
| 	"github.com/micro/go-run/package" | ||||
| ) | ||||
|  | ||||
| type Packager struct { | ||||
| 	Options packager.Options | ||||
| 	Client  *docker.Client | ||||
| } | ||||
|  | ||||
| func (d *Packager) Compile(s *packager.Source) (*packager.Binary, error) { | ||||
| 	image := filepath.Join(s.Repository.Path, s.Repository.Name) | ||||
|  | ||||
| 	buf := new(bytes.Buffer) | ||||
| 	tw := tar.NewWriter(buf) | ||||
| 	defer tw.Close() | ||||
|  | ||||
| 	dockerFile := "Dockerfile" | ||||
|  | ||||
| 	// open docker file | ||||
| 	f, err := os.Open(filepath.Join(s.Repository.Path, s.Repository.Name, dockerFile)) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	// read docker file | ||||
| 	by, err := ioutil.ReadAll(f) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	tarHeader := &tar.Header{ | ||||
| 		Name: dockerFile, | ||||
| 		Size: int64(len(by)), | ||||
| 	} | ||||
| 	err = tw.WriteHeader(tarHeader) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	_, err = tw.Write(by) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	tr := bytes.NewReader(buf.Bytes()) | ||||
|  | ||||
| 	err = d.Client.BuildImage(docker.BuildImageOptions{ | ||||
| 		Name:           image, | ||||
| 		Dockerfile:     dockerFile, | ||||
| 		InputStream:    tr, | ||||
| 		OutputStream:   ioutil.Discard, | ||||
| 		RmTmpContainer: true, | ||||
| 		SuppressOutput: true, | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return &packager.Binary{ | ||||
| 		Name:   image, | ||||
| 		Path:   image, | ||||
| 		Type:   "docker", | ||||
| 		Source: s, | ||||
| 	}, nil | ||||
| } | ||||
|  | ||||
| func (d *Packager) Delete(b *packager.Binary) error { | ||||
| 	image := filepath.Join(b.Path, b.Name) | ||||
| 	return d.Client.RemoveImage(image) | ||||
| } | ||||
|  | ||||
| func NewPackager(opts ...packager.Option) packager.Packager { | ||||
| 	options := packager.Options{} | ||||
| 	for _, o := range opts { | ||||
| 		o(&options) | ||||
| 	} | ||||
| 	endpoint := "unix:///var/run/docker.sock" | ||||
| 	client, err := docker.NewClient(endpoint) | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err) | ||||
| 	} | ||||
| 	return &Packager{ | ||||
| 		Options: options, | ||||
| 		Client:  client, | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										70
									
								
								runtime/package/go/golang.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								runtime/package/go/golang.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | ||||
| // Package golang is a go package manager | ||||
| package golang | ||||
|  | ||||
| import ( | ||||
| 	"os" | ||||
| 	"os/exec" | ||||
| 	"path/filepath" | ||||
|  | ||||
| 	"github.com/micro/go-run/package" | ||||
| ) | ||||
|  | ||||
| type Packager struct { | ||||
| 	Options packager.Options | ||||
| 	Cmd     string | ||||
| 	Path    string | ||||
| } | ||||
|  | ||||
| // whichGo locates the go command | ||||
| func whichGo() string { | ||||
| 	// check GOROOT | ||||
| 	if gr := os.Getenv("GOROOT"); len(gr) > 0 { | ||||
| 		return filepath.Join(gr, "bin", "go") | ||||
| 	} | ||||
|  | ||||
| 	// check path | ||||
| 	for _, p := range filepath.SplitList(os.Getenv("PATH")) { | ||||
| 		bin := filepath.Join(p, "go") | ||||
| 		if _, err := os.Stat(bin); err == nil { | ||||
| 			return bin | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// best effort | ||||
| 	return "go" | ||||
| } | ||||
|  | ||||
| func (g *Packager) Compile(s *packager.Source) (*packager.Binary, error) { | ||||
| 	binary := filepath.Join(g.Path, s.Repository.Name) | ||||
| 	source := filepath.Join(s.Repository.Path, s.Repository.Name) | ||||
|  | ||||
| 	cmd := exec.Command(g.Cmd, "build", "-o", binary, source) | ||||
| 	if err := cmd.Run(); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return &packager.Binary{ | ||||
| 		Name:   s.Repository.Name, | ||||
| 		Path:   binary, | ||||
| 		Type:   "go", | ||||
| 		Source: s, | ||||
| 	}, nil | ||||
| } | ||||
|  | ||||
| func (g *Packager) Delete(b *packager.Binary) error { | ||||
| 	binary := filepath.Join(b.Path, b.Name) | ||||
| 	return os.Remove(binary) | ||||
| } | ||||
|  | ||||
| func NewPackager(opts ...packager.Option) packager.Packager { | ||||
| 	options := packager.Options{ | ||||
| 		Path: os.TempDir(), | ||||
| 	} | ||||
| 	for _, o := range opts { | ||||
| 		o(&options) | ||||
| 	} | ||||
| 	return &Packager{ | ||||
| 		Options: options, | ||||
| 		Cmd:     whichGo(), | ||||
| 		Path:    options.Path, | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										15
									
								
								runtime/package/options.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								runtime/package/options.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| package packager | ||||
|  | ||||
| type Options struct { | ||||
| 	// local path to download source | ||||
| 	Path string | ||||
| } | ||||
|  | ||||
| type Option func(o *Options) | ||||
|  | ||||
| // Local path for repository | ||||
| func Path(p string) Option { | ||||
| 	return func(o *Options) { | ||||
| 		o.Path = p | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										34
									
								
								runtime/package/package.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								runtime/package/package.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| // Package packager creates a binary image. Due to package being a reserved keyword we use packager. | ||||
| package packager | ||||
|  | ||||
| import ( | ||||
| 	"github.com/micro/go-run/source" | ||||
| ) | ||||
|  | ||||
| // Package builds binaries | ||||
| type Packager interface { | ||||
| 	// Compile builds a binary | ||||
| 	Compile(*Source) (*Binary, error) | ||||
| 	// Deletes the binary | ||||
| 	Delete(*Binary) error | ||||
| } | ||||
|  | ||||
| // Source is the source of a build | ||||
| type Source struct { | ||||
| 	// Language is the language of code | ||||
| 	Language string | ||||
| 	// Location of the source | ||||
| 	Repository *source.Repository | ||||
| } | ||||
|  | ||||
| // Binary is the representation of a binary | ||||
| type Binary struct { | ||||
| 	// Name of the binary | ||||
| 	Name string | ||||
| 	// Location of the binary | ||||
| 	Path string | ||||
| 	// Type of binary | ||||
| 	Type string | ||||
| 	// Source of the binary | ||||
| 	Source *Source | ||||
| } | ||||
		Reference in New Issue
	
	Block a user