fission/builder image, log collection improvement in builder (#397)

Create a container image with the buidler, so we can avoid copying the builder binary into the env container during the env container build. 

Gather both stdout and stderr of a build into the logs.
 

* Add Dockerfile for builder + update release scripts

* Improve logging of buildermgr and builder

* Add support for environment-scoped buildcmd

* Fix fork/exec wd when package is a file

* Update tests to also include builder image

* Add logging to builder's fork/exec
This commit is contained in:
Erwin van Eyk
2017-11-20 23:58:33 -08:00
committed by Soam Vasani
parent da820186f0
commit b2678783b6
9 changed files with 113 additions and 22 deletions
+7
View File
@@ -12,6 +12,13 @@ cache:
- $HOME/google-cloud-sdk/ - $HOME/google-cloud-sdk/
- $HOME/k8scli - $HOME/k8scli
services:
- docker
before_install:
- sudo apt-get update
- sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce
install: install:
- go get github.com/Masterminds/glide - go get github.com/Masterminds/glide
- hack/travis-kube-setup.sh - hack/travis-kube-setup.sh
+36 -9
View File
@@ -31,6 +31,8 @@ import (
"time" "time"
"github.com/dchest/uniuri" "github.com/dchest/uniuri"
"io"
"path"
) )
const ( const (
@@ -129,43 +131,68 @@ func (builder *Builder) Handler(w http.ResponseWriter, r *http.Request) {
func (builder *Builder) build(command string, srcPkgPath string, deployPkgPath string) (string, error) { func (builder *Builder) build(command string, srcPkgPath string, deployPkgPath string) (string, error) {
cmd := exec.Command(command) cmd := exec.Command(command)
cmd.Dir = srcPkgPath
fi, err := os.Stat(srcPkgPath)
if err != nil {
return "", errors.New(fmt.Sprintf("could not find srcPkgPath: '%s'", srcPkgPath))
}
if fi.IsDir() {
cmd.Dir = srcPkgPath
} else {
cmd.Dir = path.Dir(srcPkgPath)
}
// set env variables for build command // set env variables for build command
cmd.Env = append(os.Environ(), cmd.Env = append(os.Environ(),
fmt.Sprintf("%v=%v", envSrcPkg, srcPkgPath), fmt.Sprintf("%v=%v", envSrcPkg, srcPkgPath),
fmt.Sprintf("%v=%v", envDeployPkg, deployPkgPath), fmt.Sprintf("%v=%v", envDeployPkg, deployPkgPath),
) )
cmdReader, err := cmd.StdoutPipe() stdout, err := cmd.StdoutPipe()
if err != nil { if err != nil {
return "", errors.New(fmt.Sprintf("Error creating stdout pipe for cmd: %v", err.Error())) return "", errors.New(fmt.Sprintf("Error creating stdout pipe for cmd: %v", err.Error()))
} }
scanner := bufio.NewScanner(cmdReader) stderr, err := cmd.StderrPipe()
if err != nil {
return "", errors.New(fmt.Sprintf("Error creating stderr pipe for cmd: %v", err.Error()))
}
var buildLogs string
fmt.Println("\n=== Build Logs ===")
// Init logs
fmt.Printf("command=%v\n", command)
fmt.Printf("env=%v\n", cmd.Env)
out := io.MultiReader(stdout, stderr)
scanner := bufio.NewScanner(out)
err = cmd.Start() err = cmd.Start()
if err != nil { if err != nil {
return "", errors.New(fmt.Sprintf("Error starting cmd: %v", err.Error())) return "", errors.New(fmt.Sprintf("Error starting cmd: %v", err.Error()))
} }
var buildLogs string // Runtime logs
fmt.Println("\n=== Build Logs ===")
for scanner.Scan() { for scanner.Scan() {
output := scanner.Text() output := scanner.Text()
fmt.Println(output) fmt.Println(output)
buildLogs += fmt.Sprintf("%v\n", output) buildLogs += fmt.Sprintf("%v\n", output)
} }
fmt.Println("==================\n")
if err := scanner.Err(); err != nil { if err := scanner.Err(); err != nil {
return "", errors.New(fmt.Sprintf("Error reading cmd output: %v", err.Error())) scanErr := errors.New(fmt.Sprintf("Error reading cmd output: %v", err.Error()))
fmt.Println(scanErr)
return "", scanErr
} }
err = cmd.Wait() err = cmd.Wait()
if err != nil { if err != nil {
return "", errors.New(fmt.Sprintf("Error waiting for cmd: %v", err.Error())) cmdErr := errors.New(fmt.Sprintf("Error waiting for cmd '%v': %v", command, err.Error()))
fmt.Println(cmdErr)
return "", cmdErr
} }
fmt.Println("==================\n")
return buildLogs, nil return buildLogs, nil
} }
+9
View File
@@ -0,0 +1,9 @@
FROM alpine:3.5
RUN apk update
# Install some utility libraries for builders extending image
RUN apk add coreutils binutils findutils grep
ADD builder /builder
EXPOSE 8001
+9 -3
View File
@@ -46,8 +46,9 @@ import (
func buildPackage(fissionClient *crd.FissionClient, kubernetesClient *kubernetes.Clientset, func buildPackage(fissionClient *crd.FissionClient, kubernetesClient *kubernetes.Clientset,
builderNamespace string, storageSvcUrl string, buildReq BuildRequest) (buildLogs string, err error) { builderNamespace string, storageSvcUrl string, buildReq BuildRequest) (buildLogs string, err error) {
pkg, err := fissionClient.Packages( pkg, err := fissionClient.
buildReq.Package.Namespace).Get(buildReq.Package.Name) Packages(buildReq.Package.Namespace).
Get(buildReq.Package.Name)
if err != nil { if err != nil {
e := fmt.Sprintf("Error getting function CRD info: %v", err) e := fmt.Sprintf("Error getting function CRD info: %v", err)
log.Println(e) log.Println(e)
@@ -107,9 +108,14 @@ func buildPackage(fissionClient *crd.FissionClient, kubernetesClient *kubernetes
return e, fission.MakeError(500, e) return e, fission.MakeError(500, e)
} }
buildCmd := pkg.Spec.BuildCommand
if len(buildCmd) == 0 {
buildCmd = env.Spec.Builder.Command
}
pkgBuildReq := &builder.PackageBuildRequest{ pkgBuildReq := &builder.PackageBuildRequest{
SrcPkgFilename: srcPkgFilename, SrcPkgFilename: srcPkgFilename,
BuildCommand: pkg.Spec.BuildCommand, BuildCommand: buildCmd,
} }
log.Printf("Start building with source package: %v", srcPkgFilename) log.Printf("Start building with source package: %v", srcPkgFilename)
+2 -2
View File
@@ -1,4 +1,5 @@
FROM alpine:3.5 ARG BUILDER_IMAGE=fission/builder:latest
FROM ${BUILDER_IMAGE}
RUN apk update RUN apk update
RUN apk add --no-cache python3 python3-dev build-base RUN apk add --no-cache python3 python3-dev build-base
@@ -6,6 +7,5 @@ RUN pip3 install --upgrade pip
RUN rm -r /root/.cache RUN rm -r /root/.cache
ADD defaultBuildCmd /usr/local/bin/build ADD defaultBuildCmd /usr/local/bin/build
ADD builder /builder
EXPOSE 8001 EXPOSE 8001
+20
View File
@@ -93,6 +93,24 @@ push_fetcher_image() {
docker push $tag docker push $tag
} }
build_builder_image() {
version=$1
tag=fission/builder:$version
pushd $DIR/builder/cmd
./build.sh
docker build -t $tag .
popd
}
push_builder_image() {
version=$1
tag=fission/builder:$version
docker push $tag
}
build_and_push_env_image() { build_and_push_env_image() {
version=$1 version=$1
envdir=$2 envdir=$2
@@ -172,6 +190,7 @@ build_all() {
build_fission_bundle_image $version build_fission_bundle_image $version
build_fetcher_image $version build_fetcher_image $version
build_builder_image $version
build_all_cli build_all_cli
build_charts $version build_charts $version
} }
@@ -179,6 +198,7 @@ build_all() {
push_all() { push_all() {
push_fission_bundle_image $version push_fission_bundle_image $version
push_fetcher_image $version push_fetcher_image $version
push_builder_image $version
} }
tag_and_release() { tag_and_release() {
+5 -2
View File
@@ -14,19 +14,22 @@ REPO=gcr.io/fission-ci
IMAGE=$REPO/fission-bundle IMAGE=$REPO/fission-bundle
FETCHER_IMAGE=$REPO/fetcher FETCHER_IMAGE=$REPO/fetcher
FLUENTD_IMAGE=gcr.io/fission-ci/fluentd FLUENTD_IMAGE=gcr.io/fission-ci/fluentd
BUILDER_IMAGE=$REPO/builder
TAG=test TAG=test
dump_system_info
build_and_push_fission_bundle $IMAGE:$TAG build_and_push_fission_bundle $IMAGE:$TAG
build_and_push_fetcher $FETCHER_IMAGE:$TAG build_and_push_fetcher $FETCHER_IMAGE:$TAG
build_builder build_and_push_builder $BUILDER_IMAGE:$TAG
ENV='python' ENV='python'
build_and_push_env_runtime $ENV $REPO/$ENV-env:$TAG build_and_push_env_runtime $ENV $REPO/$ENV-env:$TAG
build_and_push_env_builder $ENV $REPO/$ENV-env-builder:$TAG build_and_push_env_builder $ENV $REPO/$ENV-env-builder:$TAG $BUILDER_IMAGE:$TAG
build_and_push_fluentd $FLUENTD_IMAGE:$TAG build_and_push_fluentd $FLUENTD_IMAGE:$TAG
+20 -4
View File
@@ -50,9 +50,17 @@ build_and_push_fetcher() {
popd popd
} }
build_builder() {
build_and_push_builder() {
image_tag=$1
pushd $ROOT/builder/cmd pushd $ROOT/builder/cmd
./build.sh ./build.sh
docker build -t $image_tag .
gcloud_login
gcloud docker -- push $image_tag
popd popd
} }
@@ -85,12 +93,11 @@ build_and_push_env_runtime() {
build_and_push_env_builder() { build_and_push_env_builder() {
env=$1 env=$1
image_tag=$2 image_tag=$2
builder_image=$3
pushd $ROOT/environments/$env/builder pushd $ROOT/environments/$env/builder
builderDir=${GOPATH}/src/github.com/fission/fission/builder/cmd
cp ${builderDir}/builder .
docker build -t $image_tag . docker build -t $image_tag --build-arg BUILDER_IMAGE=${builder_image} .
gcloud_login gcloud_login
@@ -252,6 +259,15 @@ dump_all_fission_resources() {
echo "--- End objects in the fission namespace $ns ---" echo "--- End objects in the fission namespace $ns ---"
} }
dump_system_info() {
echo "--- System Info ---"
go version
docker version
kubectl version
helm version
echo "--- End System Info ---"
}
dump_logs() { dump_logs() {
id=$1 id=$1
+4 -1
View File
@@ -151,7 +151,10 @@ type (
FunctionEndpointPort int32 `json:"functionendpointport"` FunctionEndpointPort int32 `json:"functionendpointport"`
} }
Builder struct { Builder struct {
Image string `json:"image"` // Image for containing the language runtime.
Image string `json:"image"`
// (Optional) Default build command to run for this build environment.
Command string `json:"command"` Command string `json:"command"`
} }
EnvironmentSpec struct { EnvironmentSpec struct {