func/pkg/builders/s2i/assemblers.go

67 lines
1.8 KiB
Go

package s2i
import (
"fmt"
fn "knative.dev/func/pkg/functions"
)
// GoAssembler
//
// Adapted from /usr/libexec/s2i/assemble within the UBI-8 go-toolchain
// such that the "go build" command builds subdirectory .s2i/builds/last
// (where main resides) rather than the root.
// TODO: many apps use the pattern of having main in a subdirectory, for
// example the idiomatic "./cmd/myapp/main.go". It would therefore be
// beneficial to submit a patch to the go-toolchain source allowing this
// path to be customized with an environment variable instead
const GoAssembler = `
#!/bin/bash
set -e
pushd /tmp/src
if [[ $(go list -f {{.Incomplete}}) == "true" ]]; then
INSTALL_URL=${INSTALL_URL:-$IMPORT_URL}
if [[ ! -z "$IMPORT_URL" ]]; then
popd
echo "Assembling GOPATH"
export GOPATH=$(realpath $HOME/go)
mkdir -p $GOPATH/src/$IMPORT_URL
mv /tmp/src/* $GOPATH/src/$IMPORT_URL
if [[ -d /tmp/artifacts/pkg ]]; then
echo "Restoring previous build artifacts"
mv /tmp/artifacts/pkg $GOPATH
fi
# Resolve dependencies, ignore if vendor present
if [[ ! -d $GOPATH/src/$INSTALL_URL/vendor ]]; then
echo "Resolving dependencies"
pushd $GOPATH/src/$INSTALL_URL
go get
popd
fi
# lets build
pushd $GOPATH/src/$INSTALL_URL
echo "Building"
go install -i $INSTALL_URL
mv $GOPATH/bin/* /opt/app-root/gobinary
popd
exit
fi
exec /$STI_SCRIPTS_PATH/usage
else
pushd .s2i/builds/last
go get f
go build -o /opt/app-root/gobinary
popd
popd
fi
`
func assembler(f fn.Function) (string, error) {
switch f.Runtime {
case "go":
return GoAssembler, nil
default:
return "", fmt.Errorf("no assembler defined for runtime %q", f.Runtime)
}
}