Serverless Go Builds
A Serverless v1.x plugin to making building Go easy!
Use your serverless.yml file as your build script, allowing specifying public functions or .go files as your entry points. Also can start other serverless plugins before running tests, and of course properly packages the built binary for upload (by default even individually packages each binary for increased performance!).
Features
- Runs build for all go files listed as handlers (no separate build script!)
- Specify go files or Public Functions directly (or continue to use path to binary)
- Allows specifying packageName.FunctionName as function handler
- Runs go tests
- Can start serverless plugins before tests
- eg: S3 or Dynalite test server - these can initialize resources based on yaml file
- Individually packages each function for minimum lambda code size
- Instead of sending one zip up with all binaries
- Heavily customizable!
- Doesn't even have to build Go!
Installation
npm install --save serverless-go-build
Usage
serverless build
: Builds all Go binaries listed as function handlersserverless build --function getWidget
: Builds specific Go binariesserverless test
: Runs tests specified in serverless.yml- Passes in Environment variables
GO_TEST=serverless
andstage=testing
- Passes in Environment variables
serverless deploy
will not run the builds - run serverless build
first.
Example serverless.yml
The below is a full serverless.yml example - however the only unique parts are:
custom.go-build
- Location of custom overrides (see below)package
- Optionally specifyindividually: true
for individual packagingfunctions.{yourFunction}.handler
- Specify your handler as .go file or module.PublicFunction
service: myServiceplugins: - serverless-go-buildcustom: go-build: # Example where we start "serverless-dynalite" prior to testing testPlugins: - dynalite:start # Run tests defined in endpoints module/folder tests: - ./endpointsprovider: name: aws runtime: go1.x stage: ${opt:stage, 'testing'}package: individually: true # No need to include / exclude globally as each function # specifies it's include / excludefunctions: getWidget: # In this case this file must be a main package with main() handler: entrypoints/widget/get.go name: myService-${self:provider.stage}-getWidget events: - http: path: widget method: get postWidget: # In this case this file must be a main package with main() handler: entrypoints/widget/post.go name: myService-${self:provider.stage}-postWidget events: - http: path: widget method: post getPiece: # Shows how to call into a modules public function handler: piece.GetPiece name: myService-${self:provider.stage}-postWidget events: - http: path: widget method: post
Customization
You can override any of these fields inside of custom.go-build
:
{ // Prefix used for building for AWS awsbuildPrefix: 'GOOS=linux ', // Build command - followed by bin dest and input path buildCmd: `go build -ldflags="-s -w" -o %2 %1`, // Test command - followed by value in tests array below testCmd: `stage=testing GO_TEST=serverless go test %1`, // Path to store build results binPath: 'bin', // Runtime to require runtime: "go1.x", // The path to aws-lambda-go/lambda - autogenerated include in main.go // (needed when referring to module/PubFunction) pathToAWSLambda: "github.com/aws/aws-lambda-go/lambda", // Path to put generated main.go files (module/PubFunction) generatedMainPath: "generatedEntrypoints", // Location of go path - needed for (module/PubFunction) // Must point fully to the /src segment of the path // (By default pulls it from $GOPATH) goPath: undefined, // Pass this to minimize the package uploaded to just the binary // for that endpoint minimizePackage: true, // Test plugins to start before running testPlugins: [], // Delay in milliseconds between starting plugins and starting tests testStartDelay: 0, // Array of tests to run tests: [],}
Coming Soon
Will support in the future:
serverless test
command supporting running individual test- Building locally vs for AWS
Important Notes
- If you override
package
for a function you must include the bin file- We do not override package or add to it if you specify it explicitly