serverless-go-build
Version:
Serverless plugin to build your go binaries
145 lines (125 loc) • 5.05 kB
Markdown
[![Serverless][ico-serverless]][link-serverless]
[![License][ico-license]][link-license]
[![NPM][ico-npm]][link-npm]
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
```bash
npm install --save serverless-go-build
```
## Usage
- `serverless build` : Builds _all_ Go binaries listed as function handlers
- `serverless build --function getWidget` : Builds specific Go binaries
- `serverless test` : Runs tests specified in serverless.yml
+ Passes in Environment variables `GO_TEST=serverless` and `stage=testing`
`serverless deploy` will *not* run the builds - run `serverless build` first.
The below is a full serverless.yml example - however the only unique parts are:
- `custom.go-build` - Location of custom overrides (see [below](./README.md#customization))
- `package` - _Optionally_ specify `individually: true` for individual packaging
- `functions.{yourFunction}.handler` - Specify your handler as .go file or module.PublicFunction
```yaml
service: myService
plugins:
- serverless-go-build
custom:
go-build:
testPlugins:
- dynalite:start
tests:
- ./endpoints
provider:
name: aws
runtime: go1.x
stage: ${opt:stage, 'testing'}
package:
individually: true
functions:
getWidget:
handler: entrypoints/widget/get.go
name: myService-${self:provider.stage}-getWidget
events:
- http:
path: widget
method: get
postWidget:
handler: entrypoints/widget/post.go
name: myService-${self:provider.stage}-postWidget
events:
- http:
path: widget
method: post
getPiece:
handler: piece.GetPiece
name: myService-${self:provider.stage}-postWidget
events:
- http:
path: widget
method: post
```
You can override any of these fields inside of `custom.go-build`:
```js
{
// 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: [],
}
```
Will support in the future:
- `serverless test` command supporting running individual test
- Building locally vs for AWS
- 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
[]: http://public.serverless.com/badges/v3.svg
[]: https://img.shields.io/github/license/sean9keenan/serverless-go-build.svg
[]: https://img.shields.io/npm/v/serverless-go-build.svg
[]: http://www.serverless.com/
[]: ./LICENSE
[]: https://www.npmjs.com/package/serverless-go-build