Skip to content

Commit 1e50197

Browse files
author
Nicholas Thomson
committed
Migrate build scripts from community
1 parent d921da4 commit 1e50197

File tree

3 files changed

+311
-1
lines changed

3 files changed

+311
-1
lines changed

Makefile

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ GO_LDFLAGS=-ldflags "-X $(IMPORT_PATH)/pkg/version.Version=$(VERSION) \
1818
# aws-sdk-go/private/model/api package is gated behind a build tag "codegen"...
1919
GO_TAGS=-tags codegen
2020

21-
.PHONY: all build-ack-generate build-controller test
21+
.PHONY: all build-ack-generate build-controller test \
22+
build-controller-image local-build-controller-image
2223

2324
all: test
2425

@@ -31,6 +32,14 @@ build-controller: build-ack-generate ## Generate controller code for SERVICE
3132
@./scripts/install-controller-gen.sh
3233
@./scripts/build-controller.sh $(AWS_SERVICE)
3334

35+
build-controller-image: export LOCAL_MODULES = false
36+
build-controller-image: ## Build container image for SERVICE
37+
@./scripts/build-controller-image.sh $(AWS_SERVICE)
38+
39+
local-build-controller-image: export LOCAL_MODULES = true
40+
local-build-controller-image: ## Build container image for SERVICE allowing local modules
41+
@./scripts/build-controller-image.sh $(AWS_SERVICE)
42+
3443
test: ## Run code tests
3544
go test ${GO_TAGS} ./...
3645

scripts/build-controller-image.sh

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
#!/usr/bin/env bash
2+
3+
set -eo pipefail
4+
5+
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
6+
SCRIPTS_DIR=$DIR
7+
ROOT_DIR=$DIR/..
8+
DOCKERFILE_PATH=$ROOT_DIR/Dockerfile
9+
ACK_DIR=$ROOT_DIR/..
10+
DOCKERFILE=${DOCKERFILE:-"$DOCKERFILE_PATH"}
11+
LOCAL_MODULES=${LOCAL_MODULES:-"false"}
12+
BUILD_DATE=$(date +%Y-%m-%dT%H:%M)
13+
QUIET=${QUIET:-"false"}
14+
15+
export DOCKER_BUILDKIT=${DOCKER_BUILDKIT:-1}
16+
17+
source $SCRIPTS_DIR/lib/common.sh
18+
19+
check_is_installed docker
20+
21+
USAGE="
22+
Usage:
23+
$(basename "$0") <aws_service>
24+
25+
Builds the Docker image for an ACK service controller.
26+
27+
Example: $(basename "$0") ecr
28+
29+
<aws_service> should be an AWS Service name (ecr, sns, sqs, petstore, bookstore)
30+
31+
Environment variables:
32+
QUIET: Build controller container image quietly (<true|false>)
33+
Default: false
34+
LOCAL_MODULES: Enables use of local modules during AWS Service controller docker image build
35+
Default: false
36+
AWS_SERVICE_DOCKER_IMG: Controller container image tag
37+
Default: aws-controllers-k8s:\$AWS_SERVICE-\$VERSION
38+
SERVICE_CONTROLLER_SOURCE_PATH: Directory to find the service controller to build an image for.
39+
Default: ../\$AWS_SERVICE-controller
40+
"
41+
42+
if [ $# -ne 1 ]; then
43+
echo "AWS_SERVICE is not defined. Script accepts one parameter, the <AWS_SERVICE> to build a container image of that service" 1>&2
44+
echo "${USAGE}"
45+
exit 1
46+
fi
47+
48+
AWS_SERVICE=$(echo "$1" | tr '[:upper:]' '[:lower:]')
49+
50+
# Source code for the controller will be in a separate repo, typically in
51+
# $GOPATH/src/github.com/aws-controllers-k8s/$AWS_SERVICE-controller/
52+
DEFAULT_SERVICE_CONTROLLER_SOURCE_PATH="$ROOT_DIR/../$AWS_SERVICE-controller"
53+
SERVICE_CONTROLLER_SOURCE_PATH=${SERVICE_CONTROLLER_SOURCE_PATH:-$DEFAULT_SERVICE_CONTROLLER_SOURCE_PATH}
54+
55+
if [[ ! -d $SERVICE_CONTROLLER_SOURCE_PATH ]]; then
56+
echo "Error evaluating SERVICE_CONTROLLER_SOURCE_PATH environment variable:" 1>&2
57+
echo "$SERVICE_CONTROLLER_SOURCE_PATH is not a directory." 1>&2
58+
echo "${USAGE}"
59+
exit 1
60+
fi
61+
62+
pushd $SERVICE_CONTROLLER_SOURCE_PATH 1>/dev/null
63+
64+
SERVICE_CONTROLLER_GIT_VERSION=`git describe --tags --always --dirty || echo "unknown"`
65+
SERVICE_CONTROLLER_GIT_COMMIT=`git rev-parse HEAD`
66+
67+
popd 1>/dev/null
68+
69+
DEFAULT_AWS_SERVICE_DOCKER_IMG="aws-controllers-k8s:$AWS_SERVICE-$SERVICE_CONTROLLER_GIT_VERSION"
70+
AWS_SERVICE_DOCKER_IMG=${AWS_SERVICE_DOCKER_IMG:-"$DEFAULT_AWS_SERVICE_DOCKER_IMG"}
71+
72+
if [[ $QUIET = "false" ]]; then
73+
echo "building '$AWS_SERVICE' controller docker image with tag: ${AWS_SERVICE_DOCKER_IMG}"
74+
echo " git commit: $SERVICE_CONTROLLER_GIT_COMMIT"
75+
fi
76+
77+
# if local build
78+
# then use Dockerfile which allows references to local modules from service controller
79+
DOCKER_BUILD_CONTEXT="$ACK_DIR"
80+
if [[ "$LOCAL_MODULES" = "true" ]]; then
81+
DOCKERFILE="${ROOT_DIR}"/Dockerfile.local
82+
fi
83+
84+
docker build \
85+
--quiet=${QUIET} \
86+
-t "${AWS_SERVICE_DOCKER_IMG}" \
87+
-f "${DOCKERFILE}" \
88+
--build-arg service_alias=${AWS_SERVICE} \
89+
--build-arg service_controller_git_version="$SERVICE_CONTROLLER_GIT_VERSION" \
90+
--build-arg service_controller_git_commit="$SERVICE_CONTROLLER_GIT_COMMIT" \
91+
--build-arg build_date="$BUILD_DATE" \
92+
"${DOCKER_BUILD_CONTEXT}"
93+
94+
if [ $? -ne 0 ]; then
95+
exit 2
96+
fi

scripts/build-controller-release.sh

Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
#!/usr/bin/env bash
2+
3+
# A script that builds release artifacts for a single ACK service controller
4+
# for an AWS service API
5+
6+
set -eo pipefail
7+
8+
SCRIPTS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
9+
ROOT_DIR="$SCRIPTS_DIR/.."
10+
BIN_DIR="$ROOT_DIR/bin"
11+
DEFAULT_IMAGE_REPOSITORY="public.ecr.aws/aws-controllers-k8s/controller"
12+
ACK_GENERATE_OLM=${ACK_GENERATE_OLM:-"false"}
13+
14+
source "$SCRIPTS_DIR/lib/common.sh"
15+
source "$SCRIPTS_DIR/lib/k8s.sh"
16+
source "$SCRIPTS_DIR/lib/helm.sh"
17+
18+
check_is_installed controller-gen "You can install controller-gen with the helper scripts/install-controller-gen.sh"
19+
check_is_installed helm "You can install Helm with the helper scripts/install-helm.sh"
20+
21+
if [[ $ACK_GENERATE_OLM == "true" ]]; then
22+
check_is_installed operator-sdk "You can install Operator SDK with the helper scripts/install-operator-sdk.sh"
23+
fi
24+
25+
if ! k8s_controller_gen_version_equals "$CONTROLLER_TOOLS_VERSION"; then
26+
echo "FATAL: Existing version of controller-gen "`controller-gen --version`", required version is $CONTROLLER_TOOLS_VERSION."
27+
echo "FATAL: Please uninstall controller-gen and install the required version with scripts/install-controller-gen.sh."
28+
exit 1
29+
fi
30+
31+
ACK_GENERATE_CACHE_DIR=${ACK_GENERATE_CACHE_DIR:-"$HOME/.cache/aws-controllers-k8s"}
32+
# The ack-generate code generator is in a separate source code repository,
33+
# typically at $GOPATH/src/github.com/aws-controllers-k8s/code-generator
34+
DEFAULT_ACK_GENERATE_BIN_PATH="$ROOT_DIR/../../aws-controllers-k8s/code-generator/bin/ack-generate"
35+
ACK_GENERATE_BIN_PATH=${ACK_GENERATE_BIN_PATH:-$DEFAULT_ACK_GENERATE_BIN_PATH}
36+
ACK_GENERATE_API_VERSION=${ACK_GENERATE_API_VERSION:-"v1alpha1"}
37+
ACK_GENERATE_CONFIG_PATH=${ACK_GENERATE_CONFIG_PATH:-""}
38+
ACK_GENERATE_IMAGE_REPOSITORY=${ACK_GENERATE_IMAGE_REPOSITORY:-"$DEFAULT_IMAGE_REPOSITORY"}
39+
AWS_SDK_GO_VERSION=${AWS_SDK_GO_VERSION:-"v1.35.5"}
40+
41+
DEFAULT_TEMPLATES_DIR="$ROOT_DIR/../../aws-controllers-k8s/code-generator/templates"
42+
TEMPLATES_DIR=${TEMPLATES_DIR:-$DEFAULT_TEMPLATES_DIR}
43+
44+
DEFAULT_RUNTIME_DIR="$ROOT_DIR/../runtime"
45+
RUNTIME_DIR=${RUNTIME_DIR:-$DEFAULT_RUNTIME_DIR}
46+
RUNTIME_API_VERSION=${RUNTIME_API_VERSION:-"v1alpha1"}
47+
48+
USAGE="
49+
Usage:
50+
$(basename "$0") <service> <release_version>
51+
52+
<service> should be an AWS service API aliases that you wish to build -- e.g.
53+
's3' 'sns' or 'sqs'
54+
55+
<release_version> should be the SemVer version tag for the release -- e.g.
56+
'v0.1.3'
57+
58+
Environment variables:
59+
ACK_GENERATE_CACHE_DIR Overrides the directory used for caching
60+
AWS API models used by the ack-generate
61+
tool.
62+
Default: $ACK_GENERATE_CACHE_DIR
63+
ACK_GENERATE_BIN_PATH: Overrides the path to the the ack-generate
64+
binary.
65+
Default: $ACK_GENERATE_BIN_PATH
66+
SERVICE_CONTROLLER_SOURCE_PATH: Path to the service controller source code
67+
repository.
68+
Default: ../{SERVICE}-controller
69+
ACK_GENERATE_OLM: Enable Operator Lifecycle Manager generators.
70+
Default: false
71+
ACK_GENERATE_OLMCONFIG_PATH: Path to the service OLM configuration file. Ignored
72+
if ACK_GENERATE_OLM is not true.
73+
Default: {SERVICE_CONTROLLER_SOURCE_PATH}/olm/olmconfig.yaml
74+
ACK_GENERATE_CONFIG_PATH: Specify a path to the generator config YAML file to
75+
instruct the code generator for the service.
76+
Default: {SERVICE_CONTROLLER_SOURCE_PATH}/generator.yaml
77+
ACK_GENERATE_OUTPUT_PATH: Specify a path for the generator to output
78+
to.
79+
Default: services/{SERVICE}
80+
ACK_GENERATE_IMAGE_REPOSITORY: Specify a Docker image repository to use
81+
for release artifacts
82+
Default: $DEFAULT_IMAGE_REPOSITORY
83+
ACK_GENERATE_SERVICE_ACCOUNT_NAME: Name of the Kubernetes Service Account and
84+
Cluster Role to use in Helm chart.
85+
Default: $ACK_GENERATE_SERVICE_ACCOUNT_NAME
86+
AWS_SDK_GO_VERSION: Overrides the version of github.com/aws/aws-sdk-go used
87+
by 'ack-generate' to fetch the service API Specifications.
88+
Default: $AWS_SDK_GO_VERSION
89+
K8S_RBAC_ROLE_NAME: Name of the Kubernetes Role to use when
90+
generating the RBAC manifests for the
91+
custom resource definitions.
92+
Default: $K8S_RBAC_ROLE_NAME
93+
"
94+
95+
if [ $# -ne 2 ]; then
96+
echo "ERROR: $(basename "$0") accepts exactly two parameters, the SERVICE and the RELEASE_VERSION" 1>&2
97+
echo "$USAGE"
98+
exit 1
99+
fi
100+
101+
if [ ! -f $ACK_GENERATE_BIN_PATH ]; then
102+
if is_installed "ack-generate"; then
103+
ACK_GENERATE_BIN_PATH=$(which "ack-generate")
104+
else
105+
echo "ERROR: Unable to find an ack-generate binary.
106+
Either set the ACK_GENERATE_BIN_PATH to a valid location or
107+
run:
108+
109+
make build-ack-generate
110+
111+
from the root directory or install ack-generate using:
112+
113+
go get -u github.com/aws/aws-controllers-k8s/cmd/ack-generate" 1>&2
114+
exit 1;
115+
fi
116+
fi
117+
SERVICE=$(echo "$1" | tr '[:upper:]' '[:lower:]')
118+
119+
# Source code for the controller will be in a separate repo, typically in
120+
# $GOPATH/src/github.com/aws-controllers-k8s/$AWS_SERVICE-controller/
121+
DEFAULT_SERVICE_CONTROLLER_SOURCE_PATH="$ROOT_DIR/../$SERVICE-controller"
122+
SERVICE_CONTROLLER_SOURCE_PATH=${SERVICE_CONTROLLER_SOURCE_PATH:-$DEFAULT_SERVICE_CONTROLLER_SOURCE_PATH}
123+
124+
if [[ ! -d $SERVICE_CONTROLLER_SOURCE_PATH ]]; then
125+
echo "Error evaluating SERVICE_CONTROLLER_SOURCE_PATH environment variable:" 1>&2
126+
echo "$SERVICE_CONTROLLER_SOURCE_PATH is not a directory." 1>&2
127+
echo "${USAGE}"
128+
exit 1
129+
fi
130+
131+
RELEASE_VERSION="$2"
132+
K8S_RBAC_ROLE_NAME=${K8S_RBAC_ROLE_NAME:-"ack-$SERVICE-controller"}
133+
ACK_GENERATE_SERVICE_ACCOUNT_NAME=${ACK_GENERATE_SERVICE_ACCOUNT_NAME:-"ack-$SERVICE-controller"}
134+
135+
# If there's a generator.yaml in the service's directory and the caller hasn't
136+
# specified an override, use that.
137+
if [ -z "$ACK_GENERATE_CONFIG_PATH" ]; then
138+
if [ -f "$SERVICE_CONTROLLER_SOURCE_PATH/generator.yaml" ]; then
139+
ACK_GENERATE_CONFIG_PATH="$SERVICE_CONTROLLER_SOURCE_PATH/generator.yaml"
140+
fi
141+
fi
142+
143+
helm_output_dir="$SERVICE_CONTROLLER_SOURCE_PATH/helm"
144+
ag_args="$SERVICE $RELEASE_VERSION -o $SERVICE_CONTROLLER_SOURCE_PATH --template-dirs $TEMPLATES_DIR --aws-sdk-go-version $AWS_SDK_GO_VERSION"
145+
if [ -n "$ACK_GENERATE_CACHE_DIR" ]; then
146+
ag_args="$ag_args --cache-dir $ACK_GENERATE_CACHE_DIR"
147+
fi
148+
if [ -n "$ACK_GENERATE_OUTPUT_PATH" ]; then
149+
ag_args="$ag_args --output $ACK_GENERATE_OUTPUT_PATH"
150+
helm_output_dir="$ACK_GENERATE_OUTPUT_PATH/helm"
151+
fi
152+
if [ -n "$ACK_GENERATE_CONFIG_PATH" ]; then
153+
ag_args="$ag_args --generator-config-path $ACK_GENERATE_CONFIG_PATH"
154+
fi
155+
if [ -n "$ACK_GENERATE_IMAGE_REPOSITORY" ]; then
156+
ag_args="$ag_args --image-repository $ACK_GENERATE_IMAGE_REPOSITORY"
157+
fi
158+
if [ -n "$ACK_GENERATE_SERVICE_ACCOUNT_NAME" ]; then
159+
ag_args="$ag_args --service-account-name $ACK_GENERATE_SERVICE_ACCOUNT_NAME"
160+
fi
161+
162+
echo "Building release artifacts for $SERVICE-$RELEASE_VERSION"
163+
$ACK_GENERATE_BIN_PATH release $ag_args
164+
165+
pushd $RUNTIME_DIR/apis/core/$RUNTIME_API_VERSION 1>/dev/null
166+
167+
echo "Generating common custom resource definitions"
168+
controller-gen crd:allowDangerousTypes=true paths=./... output:crd:artifacts:config=$helm_output_dir/crds
169+
170+
popd 1>/dev/null
171+
172+
pushd $SERVICE_CONTROLLER_SOURCE_PATH/apis/$ACK_GENERATE_API_VERSION 1>/dev/null
173+
174+
echo "Generating custom resource definitions for $SERVICE"
175+
controller-gen crd:allowDangerousTypes=true paths=./... output:crd:artifacts:config=$helm_output_dir/crds
176+
177+
popd 1>/dev/null
178+
179+
pushd $SERVICE_CONTROLLER_SOURCE_PATH/pkg/resource 1>/dev/null
180+
181+
echo "Generating RBAC manifests for $SERVICE"
182+
controller-gen rbac:roleName=$K8S_RBAC_ROLE_NAME paths=./... output:rbac:artifacts:config=$helm_output_dir/templates
183+
# controller-gen rbac outputs a ClusterRole definition in a
184+
# $config_output_dir/rbac/role.yaml file. We have some other standard Role
185+
# files for a reader and writer role, so here we rename the `role.yaml` file to
186+
# `cluster-role-controller.yaml` to better reflect what is in that file.
187+
mv $helm_output_dir/templates/role.yaml $helm_output_dir/templates/cluster-role-controller.yaml
188+
189+
popd 1>/dev/null
190+
191+
if [[ $ACK_GENERATE_OLM == "true" ]]; then
192+
echo "Generating operator lifecycle manager bundle assets for $SERVICE"
193+
194+
DEFAULT_ACK_GENERATE_OLMCONFIG_PATH="$SERVICE_CONTROLLER_SOURCE_PATH/olm/olmconfig.yaml"
195+
ACK_GENERATE_OLMCONFIG_PATH=${ACK_GENERATE_OLMCONFIG_PATH:-$DEFAULT_ACK_GENERATE_OLMCONFIG_PATH}
196+
197+
olm_version=$(echo $RELEASE_VERSION | tr -d "v")
198+
ag_olm_args="$SERVICE $olm_version -o $SERVICE_CONTROLLER_SOURCE_PATH --template-dirs $TEMPLATES_DIR --olm-config $ACK_GENERATE_OLMCONFIG_PATH --aws-sdk-go-version $AWS_SDK_GO_VERSION"
199+
200+
if [ -n "$ACK_GENERATE_CONFIG_PATH" ]; then
201+
ag_olm_args="$ag_olm_args --generator-config-path $ACK_GENERATE_CONFIG_PATH"
202+
fi
203+
204+
$ACK_GENERATE_BIN_PATH olm $ag_olm_args
205+
fi

0 commit comments

Comments
 (0)