diff --git a/backend/Dockerfile b/backend/Dockerfile index a5aae4c2a8..ffd64d49b5 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,3 +1,4 @@ +### Builder Stage FROM golang:1.13 AS build ARG service @@ -13,7 +14,9 @@ COPY $service/ /build/$service/ RUN go build . -FROM debian:buster + +### Running Container Stage +FROM debian:buster AS run ARG service WORKDIR /app/ @@ -21,3 +24,10 @@ WORKDIR /app/ COPY --from=build /build/$service/$service /app/service CMD ["./service"] + + +### Scaffolder Stage +### needs extra cookiecutter +FROM run AS scaffolder +RUN apt-get update && apt-get install -y python-pip +RUN pip install cookiecutter==1.7.0 --index-url https://pypi.python.org/simple diff --git a/backend/scaffolder/app/server.go b/backend/scaffolder/app/server.go index b4bcb590ab..24a5af326f 100644 --- a/backend/scaffolder/app/server.go +++ b/backend/scaffolder/app/server.go @@ -3,8 +3,11 @@ package app import ( "context" "fmt" + "github.com/golang/protobuf/jsonpb" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + "log" + "os/exec" identity "github.com/spotify/backstage/backend/proto/identity/v1" pb "github.com/spotify/backstage/backend/proto/scaffolder/v1" @@ -30,20 +33,40 @@ func NewServer() *Server { // Create scaffolds the repo in github and then will create push to the repository func (s *Server) Create(ctx context.Context, req *pb.CreateRequest) (*pb.CreateReply, error) { // first create the repository with github - fmt.Sprintf("Creating repository for Component %s", req.ComponentId) - repo := remote.Repository{ - Name: req.ComponentId, - Org: req.Org, - Private: req.Private, - } - if _, err := s.github.CreateRepository(repo); err != nil { - return nil, status.Error(codes.Internal, fmt.Sprintf("Could not create repository %s/%s", req.Org, req.ComponentId)) - } + log.Printf("Creating repository for Component %s", req.ComponentId) + // repo := remote.Repository{ + // Name: req.ComponentId, + // Org: req.Org, + // Private: req.Private, + // } + + // if _, err := s.github.CreateRepository(repo); err != nil { + // return nil, status.Error(codes.Internal, fmt.Sprintf("Could not create repository %s/%s", req.Org, req.ComponentId)) + // } + + marshaller := &jsonpb.Marshaler{} + d, e := marshaller.MarshalToString(req.Metadata) // move the template into a temporary directory - tempFolder, _ := s.fs.PrepareTemplate(fs.Template{req.TemplateId}) + tempFolder, err := s.fs.PrepareTemplate( + fs.Template{ + ID: req.TemplateId, + Metadata: req.Metadata, + }, + ) + if err != nil { + return nil, status.Error(codes.Internal, fmt.Sprintf("Could not prepare the template")) + } + + log.Printf("Created temporary folder %s", tempFolder) + // TODO(blam): Probably need to wrap this in a timeout or something to avoid waiting to long + cmd := exec.Command("cookiecutter", "--no-input", "-v", tempFolder) + cmd.Dir = tempFolder + err := cmd.Run() + + fmt.Println(output) + fmt.Println(err) - fmt.Sprintf("Created temporary folder %s", tempFolder) // use git bindings to add the remote with access token and push to the directory return nil, nil } diff --git a/backend/scaffolder/cutter/cutter.go b/backend/scaffolder/cutter/cutter.go new file mode 100644 index 0000000000..43857ae99b --- /dev/null +++ b/backend/scaffolder/cutter/cutter.go @@ -0,0 +1,13 @@ +package cutter + +// Cutter is the wrapper around cookiecutter +type Cutter interface { +} + +type Template { + +} +// Run runs cookiecutter in the folder provided +func (c *Cutter) Run() error { + +} diff --git a/backend/scaffolder/fs/fs.go b/backend/scaffolder/fs/fs.go index f7766650ce..de4d720e66 100644 --- a/backend/scaffolder/fs/fs.go +++ b/backend/scaffolder/fs/fs.go @@ -9,7 +9,8 @@ import ( ) // Filesystem Repository -type Filesystem struct{} +type Filesystem struct { +} func file(src, dst string) error { var err error @@ -78,7 +79,6 @@ type Template struct { // and return the temp location func (f *Filesystem) PrepareTemplate(template Template) (string, error) { tempDirectory, _ := ioutil.TempDir(os.TempDir(), template.ID) - fmt.Println(tempDirectory) if err := dir("./templates/"+template.ID, tempDirectory); err != nil { return "", err } diff --git a/docker-compose.yaml b/docker-compose.yaml index d9d5f2490b..d3903a3b15 100755 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -25,6 +25,7 @@ services: container_name: boss-builds build: context: backend + target: run args: service: builds restart: unless-stopped @@ -34,6 +35,7 @@ services: container_name: boss-scaffolder build: context: backend + target: scaffolder args: service: scaffolder restart: unless-stopped diff --git a/tools/cookiecutter/Dockerfile b/tools/cookiecutter/Dockerfile index 9affb40d0f..106337e3a5 100644 --- a/tools/cookiecutter/Dockerfile +++ b/tools/cookiecutter/Dockerfile @@ -1,3 +1,3 @@ -FROM python:3.8-slim +FROM python:3.8-slim AS scaffolder RUN pip install cookiecutter==1.7.0 --index-url https://pypi.python.org/simple ENTRYPOINT [ "cookiecutter" ] \ No newline at end of file