Skip to content
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
* Don't hard-code path to go_binary output location.

rules_go says that this path is not stable

* Also illustrate how one could live-update a nodejs_image

This doesn't produce a single statically-linked executable so it's harder for users to intuit what to do
3 contributors

Users who have contributed to this file

@nicks @maiamcc @alexeagle
# -*- mode: Python -*-
# For more on Extensions, see:
load('ext://restart_process', 'custom_build_with_restart')
load('./bazel.Tiltfile', 'bazel_sourcefile_deps')
# Records the current time, then kicks off a server update.
# Normally, you would let Tilt do deploys automatically, but this
# shows you how to set up a custom workflow that measures it.
# Use Bazel to generate the Kubernetes YAML
for f in bazel_sourcefile_deps('//deployments:example-go'):
k8s_yaml(local('bazel run //deployments:example-go'))
# Use Bazel to build the image
# The go_image BUILD rule
# Where go_binary puts the binary. We query Bazel's action graph and parse the response.
# The path is not necessarily predictable across bazel rulesets, or even across releases
# of the same ruleset. Even configuration flags passed to Bazel can affect the path.
# See
action_graph = decode_json(local([
# Needed for compat with Bazel 3 and 4, see
], quiet=True))
# If the image_target is a go_binary, it will have a GoLink action
go_link_actions = [action for action in action_graph['actions'] if action['mnemonic'] == 'GoLink']
# In our example this isn't used, but if your image were a nodejs_image you'd need the whole Bazel "runfiles"
# which is constructed as a symlink tree
symlink_tree_actions = [action for action in action_graph['actions'] if action['mnemonic'] == 'SymlinkTree']
if len(go_link_actions) == 1:
outputIDs = [outputID for action in go_link_actions for outputID in action['outputIds']]
binary_target_local = [a['execPath'] for a in action_graph['artifacts'] if a['id'] in outputIDs][0]
# Where go_image puts the Go binary in the container. You can determine this
# by shelling into the container with `kubectl exec -it [pod name] -- sh`
container_workdir = '/app/example-go-image.binary.runfiles/__main__/'
binary_target_container = container_workdir + 'example-go-image.binary_/example-go-image.binary'
elif len(symlink_tree_actions) > 0:
outputIDs = [outputID for action in symlink_tree_actions for outputID in action['outputIds']]
outputFiles = [a['execPath'] for a in action_graph['artifacts'] if a['id'] in outputIDs]
# translate from the MANIFEST file path to the first-party monorepo outputs
# the tilt-example-bazel here is the name in our WORKSPACE
# bazel-out/k8-fastbuild/bin/path/to.runfiles/MANIFEST
# ->
# bazel-out/k8-fastbuild/bin/path/to.runfiles/tilt-example-bazel
binary_target_local = outputFiles[0][:-len('/MANIFEST')] + '/tilt-example-bazel'
binary_target_container = '/'
# Where go_image puts the image in Docker (bazel/path/to/target:name)
cmd='bazel build --platforms=@io_bazel_rules_go//go/toolchain:linux_amd64 {binary_target}'.format(binary_target=binary_target),
'bazel run --platforms=@io_bazel_rules_go//go/toolchain:linux_amd64 {image_target} -- --norun && ' +
'docker tag {bazel_image} $EXPECTED_REF').format(image_target=image_target, bazel_image=bazel_image),
deps=['web', binary_target_local],
sync('web', container_workdir + 'web'),
sync(binary_target_local, binary_target_container)
k8s_resource('example-go', port_forwards=8000, resource_deps=['deploy', 'example-go-compile'])