mirror of
https://github.com/luxfi/node.git
synced 2026-07-27 03:39:39 +00:00
124 lines
4.7 KiB
Bash
124 lines
4.7 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
|
|
# This script defines helper functions to enable building images for antithesis test setups. It is
|
|
# intended to be reusable by repos other than node so almost all inputs are accepted as parameters
|
|
# rather than being discovered from the environment.
|
|
#
|
|
# Since this file only defines functions, it is intended to be sourced rather than executed.
|
|
|
|
# Build the image that enables compiling golang binaries for the node and workload image
|
|
# builds. The builder image is intended to enable building instrumented binaries if built
|
|
# on amd64 and non-instrumented binaries if built on arm64.
|
|
function build_antithesis_builder_image {
|
|
local go_version=$1
|
|
local image_name=$2
|
|
local node_path=$3
|
|
local target_path=$4
|
|
|
|
local base_dockerfile="${node_path}/tests/antithesis/Dockerfile"
|
|
local builder_dockerfile="${base_dockerfile}.builder-instrumented"
|
|
if [[ "$(go env GOARCH)" == "arm64" ]]; then
|
|
# Antithesis instrumentation is only supported on amd64. On apple silicon (arm64),
|
|
# an uninstrumented Dockerfile will be used to enable local test development.
|
|
builder_dockerfile="${base_dockerfile}.builder-uninstrumented"
|
|
fi
|
|
|
|
docker buildx build --build-arg GO_VERSION="${go_version}" -t "${image_name}" -f "${builder_dockerfile}" "${target_path}"
|
|
}
|
|
|
|
# Build the antithesis node, workload, and config images.
|
|
function build_antithesis_images {
|
|
local go_version=$1
|
|
local image_prefix=$2
|
|
local base_image_name=$3
|
|
local image_tag=$4
|
|
local node_image_tag=$5
|
|
local base_dockerfile=$6
|
|
local uninstrumented_node_dockerfile=$7
|
|
local target_path=$8
|
|
local node_only=${9:-}
|
|
local node_commit=${10:-}
|
|
|
|
# Define image names
|
|
if [[ -n "${image_prefix}" ]]; then
|
|
base_image_name="${image_prefix}/${base_image_name}"
|
|
fi
|
|
local node_image_name="${base_image_name}-node:${image_tag}"
|
|
local workload_image_name="${base_image_name}-workload:${image_tag}"
|
|
local config_image_name="${base_image_name}-config:${image_tag}"
|
|
|
|
# Define dockerfiles
|
|
local node_dockerfile="${base_dockerfile}.node"
|
|
# Working directory for instrumented builds
|
|
local builder_workdir="/instrumented/customer"
|
|
if [[ "$(go env GOARCH)" == "arm64" ]]; then
|
|
# Antithesis instrumentation is only supported on amd64. On apple silicon (arm64),
|
|
# uninstrumented Dockerfiles will be used to enable local test development.
|
|
node_dockerfile="${uninstrumented_node_dockerfile}"
|
|
# Working directory for uninstrumented builds
|
|
builder_workdir="/build"
|
|
fi
|
|
|
|
# Define default build command
|
|
local docker_cmd="docker buildx build\
|
|
--build-arg GO_VERSION=${go_version}\
|
|
--build-arg BUILDER_IMAGE_TAG=${image_tag}\
|
|
--build-arg BUILDER_WORKDIR=${builder_workdir}"
|
|
if [[ -n "${node_commit}" ]]; then
|
|
docker_cmd="${docker_cmd} --build-arg LUXD_COMMIT=${node_commit}"
|
|
fi
|
|
|
|
# By default the node image is intended to be local-only.
|
|
LUXD_NODE_IMAGE="antithesis-node-node:${node_image_tag}"
|
|
|
|
if [[ -n "${image_prefix}" && -z "${node_only}" ]]; then
|
|
# Push images with an image prefix since the prefix defines a registry location, and only if building
|
|
# all images. When building just the node image the image is only intended to be used locally.
|
|
docker_cmd="${docker_cmd} --push"
|
|
|
|
# When the node image is pushed as part of the build, references to the image must be qualified.
|
|
LUXD_NODE_IMAGE="${image_prefix}/${LUXD_NODE_IMAGE}"
|
|
fi
|
|
|
|
# Ensure the correct node image name is configured
|
|
docker_cmd="${docker_cmd} --build-arg LUXD_NODE_IMAGE=${LUXD_NODE_IMAGE}"
|
|
|
|
# Build node image first to allow the workload image to use it.
|
|
${docker_cmd} -t "${node_image_name}" -f "${node_dockerfile}" "${target_path}"
|
|
|
|
if [[ -n "${node_only}" ]]; then
|
|
# Skip building the config and workload images. Supports building the node node image as the
|
|
# base image for a VM node image.
|
|
return
|
|
fi
|
|
|
|
# Build the config image
|
|
${docker_cmd} -t "${config_image_name}" -f "${base_dockerfile}.config" "${target_path}"
|
|
|
|
# Build the workload image
|
|
${docker_cmd} -t "${workload_image_name}" -f "${base_dockerfile}.workload" "${target_path}"
|
|
}
|
|
|
|
# Generate the docker compose configuration for the antithesis config image.
|
|
function gen_antithesis_compose_config {
|
|
local image_tag=$1
|
|
local exe_path=$2
|
|
local target_path=$3
|
|
local extra_compose_args=${4:-}
|
|
|
|
if [[ -d "${target_path}" ]]; then
|
|
# Ensure the target path is empty before generating the compose config
|
|
rm -r "${target_path:?}"
|
|
fi
|
|
mkdir -p "${target_path}"
|
|
|
|
# Define the env vars for the compose config generation
|
|
local compose_env="TARGET_PATH=${target_path} IMAGE_TAG=${image_tag} ${extra_compose_args}"
|
|
|
|
# Generate compose config for copying into the config image
|
|
# shellcheck disable=SC2086
|
|
env ${compose_env} go run "${exe_path}"
|
|
}
|