Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions pkg/generator/build_tmpl.go → pkg/generator/build_tmpls.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,24 @@ BUILD_PATH="${REPO_PATH}/cmd/${PROJECT_NAME}"
echo "building "${PROJECT_NAME}"..."
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o ${BIN_DIR}/${PROJECT_NAME} $BUILD_PATH
`

const dockerBuildTmpl = `#!/usr/bin/env bash

if ! which docker > /dev/null; then
echo "docker needs to be installed"
exit 1
fi

: ${IMAGE:?"Need to set IMAGE, e.g. gcr.io/<repo>/<your>-operator"}

echo "building container ${IMAGE}..."
docker build -t "${IMAGE}" -f tmp/build/Dockerfile .
`

const dockerFileTmpl = `FROM alpine:3.6

ADD tmp/_output/bin/{{.ProjectName}} /usr/local/bin/{{.ProjectName}}

RUN adduser -D {{.ProjectName}}
USER {{.ProjectName}}
`
30 changes: 28 additions & 2 deletions pkg/generator/gen_build.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ type Build struct {
ProjectName string
}

// renderBuildFile generates the tmp/build.sh file given a repo path ("github.com/coreos/app-operator")
// renderBuildFile generates the tmp/build/build.sh file given a repo path ("github.com/coreos/app-operator")
// and projectName ("app-operator").
func renderBuildFile(w io.Writer, repo, projectName string) error {
t := template.New("tmp/build.sh")
t := template.New("tmp/build/build.sh")
t, err := t.Parse(buildTmpl)
if err != nil {
return err
Expand All @@ -27,3 +27,29 @@ func renderBuildFile(w io.Writer, repo, projectName string) error {
}
return t.Execute(w, m)
}

// renderDockerBuildFile generates the docker_build.sh script which builds the docker image for this operator.
func renderDockerBuildFile(w io.Writer) error {
_, err := w.Write([]byte(dockerBuildTmpl))
return err
}

// DockerFile contains all the customized data needed to generate tmp/build/Dockerfie
// for a new operator when pairing with dockerFileTmpl template.
type DockerFile struct {
ProjectName string
}

// renderDockerFile generates the tmp/build/Dockerfile file given the projectName ("app-operator").
func renderDockerFile(w io.Writer, projectName string) error {
t := template.New("tmp/build/Dockerfile")
t, err := t.Parse(dockerFileTmpl)
if err != nil {
return err
}

df := DockerFile{
ProjectName: projectName,
}
return t.Execute(w, df)
}
20 changes: 19 additions & 1 deletion pkg/generator/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ const (
register = "register.go"
types = "types.go"
build = "build.sh"
dockerBuild = "docker_build.sh"
dockerfile = "Dockerfile"
boilerplate = "boilerplate.go.txt"
updateGenerated = "update-generated.sh"
)
Expand Down Expand Up @@ -142,7 +144,23 @@ func renderBuildFiles(buildDir, repoPath, projectName string) error {
if err := renderBuildFile(buf, repoPath, projectName); err != nil {
return err
}
return ioutil.WriteFile(filepath.Join(buildDir, build), buf.Bytes(), defaultExecFileMode)
if err := ioutil.WriteFile(filepath.Join(buildDir, build), buf.Bytes(), defaultExecFileMode); err != nil {
return err
}

buf = &bytes.Buffer{}
if err := renderDockerBuildFile(buf); err != nil {
return err
}
if err := ioutil.WriteFile(filepath.Join(buildDir, dockerBuild), buf.Bytes(), defaultExecFileMode); err != nil {
return err
}

buf = &bytes.Buffer{}
if err := renderDockerFile(buf, projectName); err != nil {
return err
}
return ioutil.WriteFile(filepath.Join(buildDir, dockerfile), buf.Bytes(), defaultFileMode)
}

func renderCodegenFiles(codegenDir, repoPath, apiDirName, version, projectName string) error {
Expand Down
29 changes: 28 additions & 1 deletion pkg/generator/generator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -166,15 +166,42 @@ echo "building "${PROJECT_NAME}"..."
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o ${BIN_DIR}/${PROJECT_NAME} $BUILD_PATH
`

const dockerFileExp = `FROM alpine:3.6

ADD tmp/_output/bin/play /usr/local/bin/play

RUN adduser -D play
USER play
`

func TestGenBuild(t *testing.T) {
buf := &bytes.Buffer{}
if err := renderBuildFile(buf, "github.com/coreos/play", "play"); err != nil {
projectName := "play"
if err := renderBuildFile(buf, "github.com/coreos/play", projectName); err != nil {
t.Error(err)
return
}
if buildExp != buf.String() {
t.Errorf("want %v, got %v", buildExp, buf.String())
}

buf = &bytes.Buffer{}
if err := renderDockerBuildFile(buf); err != nil {
t.Error(err)
return
}
if dockerBuildTmpl != buf.String() {
t.Errorf("want %v, got %v", dockerBuildTmpl, buf.String())
}

buf = &bytes.Buffer{}
if err := renderDockerFile(buf, projectName); err != nil {
t.Error(err)
return
}
if dockerFileExp != buf.String() {
t.Errorf("want %v, got %v", dockerFileExp, buf.String())
}
}

const boilerplateExp = `/*
Expand Down