Go buildpack

Page last updated:

Supported versions

You can find supported Go versions in the Cloud Foundry release notes.

Push an app

The Go buildpack is automatically detected in the following circumstances:

  • Your app has been packaged with godep using godep save.
  • Your app has a vendor/ directory and has any files ending with .go.
  • Your app has a GOPACKAGENAME environment variable specified and has any files ending with .go.
  • Your app has a glide.yml file and is using glide, starting in buildpack version 1.7.9.
  • Your app has a Gopkg.toml file and is using dep, starting in buildpack version 1.8.9.

If your Cloud Foundry deployment does not have the Go Buildpack installed, or the installed version is out of date, you can use the latest version with the command:

$ cf push my_app -b https://github.com/cloudfoundry/go-buildpack.git

When you specify versions, specify only majoror minor versions, such as Go 1.6, rather than Go 1.6.0. This ensures you receive the most recent patches.

Start command

When pushing Go apps, you can specify a start command for the app. You can place the start command in the Procfile file in root directory of your app. For example, if the binary generated by your Go project is my-go-server, your Procfile could contain the following:

web: my-go-server

For more information about Procfiles, see the Configuring a Production Server topic.

You can also specify the start command for your app in the manifest.yml file in the root directory. For example, your manifest.yml could contain the following:

---
applications:
  - name: my-app-name
    command: my-go-server

If you do not specify a start command in a Procfile, in the manifest, or with the -c flag for cf push, the generated binary is used as the start command. Example: my-go-server

Push an app with Go modules

As of Go 1.11 you can use the go mod vendoring tool that comes with Go. If you are using go mod to package your dependencies, make sure that you have created a valid go.mod file in the root directory of your app by running go mod init.

Go sample app

An example go.mod file:

module go-online

require (
    github.com/BurntSushi/toml v0.3.1
    github.com/satori/go.uuid v1.2.0
)

When your main package is not in the project root

A common project pattern is to place main packages in a subdirectory called cmd like in the example below:

$ tree app-package-name
app-package-name
├── cmd
│   ├── cli
│   │   └── main.go
│   └── server
│       └── main.go
├── go.mod
├── go.sum
├── shared.go
├── shared_test.go
└── manifest.yml

When you configure your project like this, set the environment variable GO_INSTALL_PACKAGE_SPEC to $MODULE_NAME/$MAIN_PACKAGE_PATH.

If the module name for the above app-package-name app is example.com/user/app-package-name, the value of GO_INSTALL_PACKAGE_SPEC must be example.com/user/app-package-name/cmd/server.

If you want to put this in your manifest.yml, see the following example:

---
applications:
- name: app-package-name
  env:
    GO_INSTALL_PACKAGE_SPEC: example.com/user/app-package-name/cmd/server

Push an app with godep

If you are using godep to package your dependencies, make sure that you have created a valid Godeps/Godeps.json file in the root directory of your app by running godep save.

When using godep, you can fix your Go version in GoVersion key of the Godeps/Godeps.json file.

Go sample app

An example Godeps/Godeps.json:

{
    "ImportPath": "go_app",
    "GoVersion": "go1.6",
    "Deps": []
}

Push an app with Glide

If you use glide to specify or package your dependencies, make sure that you have created a valid glide.yml file in the root directory of your app by running glide init.

To vendor your dependencies before pushing, run glide install. This generates a vendor directory and a glide.lock file specifying the latest compatible versions of your dependencies. You must have a glide.lock file when pushing a vendored app. You do not need a glide.lock file when deploying a non-vendored app.

Glide

An example glide.yml file:

package: go_app_with_glide
import:
- package: github.com/ZiCog/shiny-thing
  subpackages:
  - foo

You can specify Go version in the manifest.yml file:

---
applications:
  - name: my-app-name
    env:
      GOVERSION: go1.8

Push an app with dep

If you use dep to specify or package your dependencies, make sure that you have created a valid Gopkg.toml file in the root directory of your app by running dep init.

To vendor your dependencies before pushing, run dep ensure. This generates a vendor directory and a Gopkg.lock file specifying the latest compatible versions of your dependencies. You must have a Gopkg.lock file when pushing a vendored app. You do not need a Gopkg.lock file when deploying a non-vendored app.

dep

An example Gopkg.toml file:

[[constraint]]
  branch = "main"
  name = "github.com/ZiCog/shiny-thing"

You can specify Go version in the manifest.yml file:

---
applications:
  - name: my-app-name
    env:
      GOVERSION: go1.8

Push an app without a vendoring tool

You can use Go without a vendoring tool by packaging all local dependencies in the vendor/ directory, and by specifying the app package name in the GOPACKAGENAME environment variable.

An example manifest.yml:

---
applications:
  - name: my-app-name
    command: go-online
    env:
      GOPACKAGENAME: example.com/user/app-package-name

Pass a symbol and string to the Go Linker

The Go buildpack supports the Go linker’s ability, -X symbol value, to set the value of a string at link time. Set the GO_LINKER_SYMBOL and GO_LINKER_VALUE in the application’s configuration before pushing code.

This can be used to embed the commit SHA or other build-specific data directly into the compiled executable.

For a sample Go app, see the go-buildpack repository on GitHub.

C dependencies

The Go buildpack supports building with C dependencies using cgo. You can set config vars to specify cgo flags to, for example, specify paths for vendored dependencies. As an example, to build gopgsqldriver, add the config var CGO_CFLAGS with the value -I/app/code/vendor/include/postgresql and include the relevant Postgres header files in vendor/include/postgresql/ in your app.

Proxy support

If you need to use a proxy to download dependencies during staging, you can set the http_proxy and/or https_proxy environment variables. For more information, see Using a Proxy.

BOSH configured custom trusted certificate support

Go uses certificates stored in /etc/ssl/certs. Your platform operator can configure the platform to add the custom certificates into the application container.

Help and support

Join the #buildpacks channel in our Slack community if you need any further assistance.

For more information about using and extending the Go buildpack in Cloud Foundry, see the go-buildpack GitHub repository.

You can find current information about this buildpack on the Go buildpack release page in GitHub.

Create a pull request or raise an issue on the source for this page in GitHub