diff --git a/README.md b/README.md index d7d2c126..04cecb27 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ ___ 'com.amazonaws:aws-lambda-java-tests:1.1.1' ``` -[Leiningen](http://leiningen.org) and [Boot](http://boot-clj.com) +[Leiningen](http://leiningen.org) ```clojure [com.amazonaws/aws-lambda-java-core "1.2.1"] diff --git a/aws-lambda-java-runtime-interface-client/Makefile b/aws-lambda-java-runtime-interface-client/Makefile index 6d23db6d..590e4383 100644 --- a/aws-lambda-java-runtime-interface-client/Makefile +++ b/aws-lambda-java-runtime-interface-client/Makefile @@ -1,3 +1,9 @@ +x86_64_ALIAS := amd64 +aarch64_ALIAS := arm64 +ARCHITECTURE := $(shell arch) +ARCHITECTURE_ALIAS := $($(shell echo "$(ARCHITECTURE)_ALIAS")) +ARCHITECTURE_ALIAS := $(or $(ARCHITECTURE_ALIAS),amd64) # on any other archs defaulting to amd64 + .PHONY: target target: $(info ${HELP_MESSAGE}) @@ -9,12 +15,16 @@ test: .PHONY: setup-codebuild-agent setup-codebuild-agent: - docker build -t codebuild-agent - < test/integration/codebuild-local/Dockerfile.agent + docker build -t codebuild-agent \ + --build-arg ARCHITECTURE=$(ARCHITECTURE_ALIAS) \ + - < test/integration/codebuild-local/Dockerfile.agent .PHONY: test-smoke test-smoke: setup-codebuild-agent - CODEBUILD_IMAGE_TAG=codebuild-agent test/integration/codebuild-local/test_one.sh test/integration/codebuild/buildspec.os.alpine.yml alpine 3.12 corretto11 - CODEBUILD_IMAGE_TAG=codebuild-agent test/integration/codebuild-local/test_one.sh test/integration/codebuild/buildspec.os.amazoncorretto.yml amazoncorretto amazoncorretto 11 + CODEBUILD_IMAGE_TAG=codebuild-agent test/integration/codebuild-local/test_one.sh test/integration/codebuild/buildspec.os.alpine.yml alpine 3.15 corretto11 linux/amd64 + CODEBUILD_IMAGE_TAG=codebuild-agent test/integration/codebuild-local/test_one.sh test/integration/codebuild/buildspec.os.alpine.yml alpine 3.15 corretto11 linux/arm64/v8 + CODEBUILD_IMAGE_TAG=codebuild-agent test/integration/codebuild-local/test_one.sh test/integration/codebuild/buildspec.os.amazoncorretto.yml amazoncorretto amazoncorretto 11 linux/amd64 + CODEBUILD_IMAGE_TAG=codebuild-agent test/integration/codebuild-local/test_one.sh test/integration/codebuild/buildspec.os.amazoncorretto.yml amazoncorretto amazoncorretto 11 linux/arm64/v8 .PHONY: test-integ test-integ: setup-codebuild-agent diff --git a/aws-lambda-java-runtime-interface-client/README.md b/aws-lambda-java-runtime-interface-client/README.md index 027cee03..cc0a6367 100644 --- a/aws-lambda-java-runtime-interface-client/README.md +++ b/aws-lambda-java-runtime-interface-client/README.md @@ -24,7 +24,7 @@ The Runtime Interface Client library can be installed into the image separate fr Dockerfile ```dockerfile # we'll use Amazon Linux 2 + Corretto 11 as our base -FROM amazoncorretto:11 as base +FROM public.ecr.aws/amazoncorretto/amazoncorretto:11 as base # configure the build environment FROM base as build diff --git a/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/ClasspathLoader.java b/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/ClasspathLoader.java index 69845cbe..6d8534bf 100644 --- a/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/ClasspathLoader.java +++ b/aws-lambda-java-runtime-interface-client/src/main/java/com/amazonaws/services/lambda/runtime/api/client/ClasspathLoader.java @@ -19,13 +19,13 @@ */ public class ClasspathLoader { - private static final Set BLACKLIST = new HashSet<>(); + private static final Set BLOCKLIST = new HashSet<>(); private static final ClassLoader SYSTEM_CLASS_LOADER = ClassLoader.getSystemClassLoader(); private static final int CLASS_SUFFIX_LEN = ".class".length(); static { // NativeClient loads a native library and crashes if loaded here so just exclude it - BLACKLIST.add("lambdainternal.runtimeapi.NativeClient"); + BLOCKLIST.add("com.amazonaws.services.lambda.runtime.api.client.runtimeapi.NativeClient"); } private static String pathToClassName(final String path) { @@ -52,7 +52,7 @@ private static void loadClassesInJar(File file) throws IOException { String name = pathToClassName(entry.getName()); - if(BLACKLIST.contains(name)) { + if(BLOCKLIST.contains(name)) { continue; } diff --git a/aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.glibc b/aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.glibc index 9d46d2f9..02ac9014 100644 --- a/aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.glibc +++ b/aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.glibc @@ -1,5 +1,5 @@ # we use centos 7 to build against glibc 2.17 -FROM centos:7 +FROM public.ecr.aws/docker/library/centos:7 ARG CURL_VERSION diff --git a/aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.musl b/aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.musl index d34253fa..31ff9fcb 100644 --- a/aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.musl +++ b/aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.musl @@ -1,4 +1,4 @@ -FROM alpine:3 +FROM public.ecr.aws/docker/library/alpine:3 ARG CURL_VERSION diff --git a/aws-lambda-java-runtime-interface-client/src/main/jni/build-jni-lib.sh b/aws-lambda-java-runtime-interface-client/src/main/jni/build-jni-lib.sh index 0560cdfb..e404d56a 100755 --- a/aws-lambda-java-runtime-interface-client/src/main/jni/build-jni-lib.sh +++ b/aws-lambda-java-runtime-interface-client/src/main/jni/build-jni-lib.sh @@ -6,7 +6,7 @@ set -euo pipefail SRC_DIR=$(dirname "$0") DST_DIR=${1} MULTI_ARCH=${2} -CURL_VERSION=7.77.0 +CURL_VERSION=7.83.0 # Not using associative arrays to maintain bash 3 compatibility with building on MacOS # MacOS ships with bash 3 and associative arrays require bash 4+ diff --git a/aws-lambda-java-runtime-interface-client/src/main/jni/deps/curl-7.77.0.tar.gz b/aws-lambda-java-runtime-interface-client/src/main/jni/deps/curl-7.77.0.tar.gz deleted file mode 100644 index 951f34b7..00000000 Binary files a/aws-lambda-java-runtime-interface-client/src/main/jni/deps/curl-7.77.0.tar.gz and /dev/null differ diff --git a/aws-lambda-java-runtime-interface-client/src/main/jni/deps/curl-7.83.0.tar.gz b/aws-lambda-java-runtime-interface-client/src/main/jni/deps/curl-7.83.0.tar.gz new file mode 100644 index 00000000..3d8e0775 Binary files /dev/null and b/aws-lambda-java-runtime-interface-client/src/main/jni/deps/curl-7.83.0.tar.gz differ diff --git a/aws-lambda-java-runtime-interface-client/test/integration/codebuild-local/Dockerfile.agent b/aws-lambda-java-runtime-interface-client/test/integration/codebuild-local/Dockerfile.agent index d49d0ffe..609dcabb 100644 --- a/aws-lambda-java-runtime-interface-client/test/integration/codebuild-local/Dockerfile.agent +++ b/aws-lambda-java-runtime-interface-client/test/integration/codebuild-local/Dockerfile.agent @@ -1,5 +1,14 @@ FROM public.ecr.aws/amazoncorretto/amazoncorretto:8 +ARG ARCHITECTURE="amd64" + +ENV DOCKER_CLI_PLUGIN_DIR="/root/.docker/cli-plugins" + RUN amazon-linux-extras enable docker && \ yum clean metadata && \ - yum install -y docker tar maven unzip file + yum install -y docker tar maven unzip file wget +RUN mkdir -p "${DOCKER_CLI_PLUGIN_DIR}" +RUN wget \ + "$(curl https://api.github.com/repos/docker/buildx/releases/latest | grep browser_download_url | grep "linux-${ARCHITECTURE}" | cut -d '"' -f 4)" \ + -O "${DOCKER_CLI_PLUGIN_DIR}"/docker-buildx +RUN chmod +x "${DOCKER_CLI_PLUGIN_DIR}"/docker-buildx diff --git a/aws-lambda-java-runtime-interface-client/test/integration/codebuild-local/test_all.sh b/aws-lambda-java-runtime-interface-client/test/integration/codebuild-local/test_all.sh index bd0eeda3..77bcb593 100755 --- a/aws-lambda-java-runtime-interface-client/test/integration/codebuild-local/test_all.sh +++ b/aws-lambda-java-runtime-interface-client/test/integration/codebuild-local/test_all.sh @@ -18,16 +18,19 @@ do_one_yaml() { OS_DISTRIBUTION=$(grep -oE 'OS_DISTRIBUTION:\s*(\S+)' "$YML" | cut -d' ' -f2) DISTRO_VERSIONS=$(sed '1,/DISTRO_VERSION/d;/RUNTIME_VERSION/,$d' "$YML" | tr -d '\-" ') - RUNTIME_VERSIONS=$(sed '1,/RUNTIME_VERSION/d;/phases/,$d' "$YML" | sed '/#.*$/d' | tr -d '\-" ') + RUNTIME_VERSIONS=$(sed '1,/RUNTIME_VERSION/d;/PLATFORM/,$d' "$YML" | sed '/#.*$/d' | tr -d '\-" ') + PLATFORMS=$(sed '1,/PLATFORM/d;/phases/,$d' "$YML" | tr -d '\-" ') - for DISTRO_VERSION in $DISTRO_VERSIONS ; do - for RUNTIME_VERSION in $RUNTIME_VERSIONS ; do - if (( DRYRUN == 1 )) ; then - echo DRYRUN test_one_combination "$YML" "$OS_DISTRIBUTION" "$DISTRO_VERSION" "$RUNTIME_VERSION" - else - test_one_combination "$YML" "$OS_DISTRIBUTION" "$DISTRO_VERSION" "$RUNTIME_VERSION" - fi + for DISTRO_VERSION in $DISTRO_VERSIONS; do + for RUNTIME_VERSION in $RUNTIME_VERSIONS; do + for PLATFORM in $PLATFORMS; do + if (( DRYRUN == 1 )); then + echo DRYRUN test_one_combination "$YML" "$OS_DISTRIBUTION" "$DISTRO_VERSION" "$RUNTIME_VERSION" "$PLATFORM" + else + test_one_combination "$YML" "$OS_DISTRIBUTION" "$DISTRO_VERSION" "$RUNTIME_VERSION" "$PLATFORM" + fi done + done done } @@ -36,13 +39,15 @@ test_one_combination() { local -r OS_DISTRIBUTION="$2" local -r DISTRO_VERSION="$3" local -r RUNTIME_VERSION="$4" - + local -r PLATFORM="$5" + local -r PLATFORM_SANITIZED=$(echo "$PLATFORM" | tr "/" ".") + echo Testing: echo " BUILDSPEC" "$YML" - echo " with" "$OS_DISTRIBUTION"-"$DISTRO_VERSION" "$RUNTIME_VERSION" + echo " with" "$OS_DISTRIBUTION"-"$DISTRO_VERSION" "$RUNTIME_VERSION" "$PLATFORM" - "$(dirname "$0")"/test_one.sh "$YML" "$OS_DISTRIBUTION" "$DISTRO_VERSION" "$RUNTIME_VERSION" \ - > >(sed "s/^/$OS_DISTRIBUTION$DISTRO_VERSION-$RUNTIME_VERSION: /") 2> >(sed "s/^/$OS_DISTRIBUTION-$DISTRO_VERSION:$RUNTIME_VERSION: /" >&2) + "$(dirname "$0")"/test_one.sh "$YML" "$OS_DISTRIBUTION" "$DISTRO_VERSION" "$RUNTIME_VERSION" "$PLATFORM" \ + > >(sed "s/^/$OS_DISTRIBUTION$DISTRO_VERSION-$RUNTIME_VERSION-$PLATFORM_SANITIZED: /") 2> >(sed "s/^/$OS_DISTRIBUTION-$DISTRO_VERSION:$RUNTIME_VERSION:$PLATFORM_SANITIZED: /" >&2) } main() { diff --git a/aws-lambda-java-runtime-interface-client/test/integration/codebuild-local/test_one.sh b/aws-lambda-java-runtime-interface-client/test/integration/codebuild-local/test_one.sh index ddc00974..838c0ae7 100755 --- a/aws-lambda-java-runtime-interface-client/test/integration/codebuild-local/test_one.sh +++ b/aws-lambda-java-runtime-interface-client/test/integration/codebuild-local/test_one.sh @@ -13,12 +13,13 @@ function usage { >&2 echo " os_distribution Used to specify the OS distribution to build." >&2 echo " distro_version Used to specify the distro version of ." >&2 echo " runtime_version Used to specify the runtime version to test on the selected ." + >&2 echo " platform Used to specify the architecture platform to test on the selected ." >&2 echo "Optional:" >&2 echo " env Additional environment variables file." } main() { - if (( $# != 3 && $# != 4)); then + if (( $# != 5 && $# != 6)); then >&2 echo "Invalid number of parameters." usage exit 1 @@ -28,9 +29,11 @@ main() { OS_DISTRIBUTION="$2" DISTRO_VERSION="$3" RUNTIME_VERSION="$4" - EXTRA_ENV="${5-}" + PLATFORM="$5" + PLATFORM_SANITIZED=$(echo "$PLATFORM" | tr "/" ".") + EXTRA_ENV="${6-}" - CODEBUILD_TEMP_DIR=$(mktemp -d codebuild."$OS_DISTRIBUTION"-"$DISTRO_VERSION"-"$RUNTIME_VERSION".XXXXXXXXXX) + CODEBUILD_TEMP_DIR=$(mktemp -d codebuild."$OS_DISTRIBUTION"-"$DISTRO_VERSION"-"$RUNTIME_VERSION"-"$PLATFORM_SANITIZED".XXXXXXXXXX) trap 'rm -rf $CODEBUILD_TEMP_DIR' EXIT # Create an env file for codebuild_build. @@ -43,6 +46,7 @@ main() { echo "OS_DISTRIBUTION=$OS_DISTRIBUTION" echo "DISTRO_VERSION=$DISTRO_VERSION" echo "RUNTIME_VERSION=$RUNTIME_VERSION" + echo "PLATFORM=$PLATFORM" } >> "$ENVFILE" ARTIFACTS_DIR="$CODEBUILD_TEMP_DIR/artifacts" diff --git a/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.alpine.yml b/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.alpine.yml index b218364d..fe1c4e98 100644 --- a/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.alpine.yml +++ b/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.alpine.yml @@ -4,6 +4,8 @@ env: variables: OS_DISTRIBUTION: alpine JAVA_BINARY_LOCATION: "/usr/bin/java" + DOCKER_CLI_EXPERIMENTAL: "enabled" + DOCKER_CLI_PLUGIN_DIR: "/root/.docker/cli-plugins" batch: build-matrix: static: @@ -14,12 +16,14 @@ batch: env: variables: DISTRO_VERSION: - - "3.9" - - "3.10" - - "3.11" - - "3.12" + - "3.13" + - "3.14" + - "3.15" RUNTIME_VERSION: - "corretto11" + PLATFORM: + - "linux/amd64" + - "linux/arm64/v8" phases: install: commands: @@ -31,6 +35,7 @@ phases: echo "Performing DockerHub login . . ." docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD fi + - aws-lambda-java-runtime-interface-client/test/integration/codebuild/scripts/configure_multi_arch_env.sh pre_build: commands: # Log some environment variables for troubleshooting @@ -39,20 +44,19 @@ phases: - (cd aws-lambda-java-events && mvn install) # Install serialization (dependency of RIC) - (cd aws-lambda-java-serialization && mvn install) - - (cd aws-lambda-java-runtime-interface-client && mvn install -DmultiArch=false) + - (cd aws-lambda-java-runtime-interface-client && mvn install) - (cd aws-lambda-java-runtime-interface-client/test/integration/test-handler && mvn install) - export IMAGE_TAG="java-${OS_DISTRIBUTION}-${DISTRO_VERSION}:${RUNTIME_VERSION}" - echo "Extracting and including Runtime Interface Emulator" - SCRATCH_DIR=".scratch" - mkdir "${SCRATCH_DIR}" - - ARCHITECTURE=$(arch) - > - if [[ "$ARCHITECTURE" == "x86_64" ]]; then + if [[ "$PLATFORM" == "linux/amd64" ]]; then RIE="aws-lambda-rie" - elif [[ "$ARCHITECTURE" == "aarch64" ]]; then + elif [[ "$PLATFORM" == "linux/arm64/v8" ]]; then RIE="aws-lambda-rie-arm64" else - echo "Architecture $ARCHITECTURE is not currently supported." + echo "Platform $PLATFORM is not currently supported." exit 1 fi - tar -xvf aws-lambda-java-runtime-interface-client/test/integration/resources/${RIE}.tar.gz --directory "${SCRATCH_DIR}" @@ -70,6 +74,7 @@ phases: docker build . \ -f "${SCRATCH_DIR}/Dockerfile.function.${OS_DISTRIBUTION}.tmp" \ -t "${IMAGE_TAG}" \ + --platform="${PLATFORM}" \ --build-arg RUNTIME_VERSION="${RUNTIME_VERSION}" \ --build-arg DISTRO_VERSION="${DISTRO_VERSION}" build: diff --git a/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.amazoncorretto.yml b/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.amazoncorretto.yml index e70865a1..17a0c48f 100644 --- a/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.amazoncorretto.yml +++ b/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.amazoncorretto.yml @@ -4,6 +4,8 @@ env: variables: OS_DISTRIBUTION: amazoncorretto JAVA_BINARY_LOCATION: "/usr/bin/java" + DOCKER_CLI_EXPERIMENTAL: "enabled" + DOCKER_CLI_PLUGIN_DIR: "/root/.docker/cli-plugins" batch: build-matrix: static: @@ -18,6 +20,9 @@ batch: RUNTIME_VERSION: - "8" - "11" + PLATFORM: + - "linux/amd64" + - "linux/arm64/v8" phases: install: commands: @@ -29,6 +34,7 @@ phases: echo "Performing DockerHub login . . ." docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD fi + - aws-lambda-java-runtime-interface-client/test/integration/codebuild/scripts/configure_multi_arch_env.sh pre_build: commands: # Log some environment variables for troubleshooting @@ -37,20 +43,19 @@ phases: - (cd aws-lambda-java-events && mvn install) # Install serialization (dependency of RIC) - (cd aws-lambda-java-serialization && mvn install) - - (cd aws-lambda-java-runtime-interface-client && mvn install -DmultiArch=false) + - (cd aws-lambda-java-runtime-interface-client && mvn install) - (cd aws-lambda-java-runtime-interface-client/test/integration/test-handler && mvn install) - export IMAGE_TAG="java-${OS_DISTRIBUTION}-${DISTRO_VERSION}:${RUNTIME_VERSION}" - echo "Extracting and including Runtime Interface Emulator" - SCRATCH_DIR=".scratch" - mkdir "${SCRATCH_DIR}" - - ARCHITECTURE=$(arch) - > - if [[ "$ARCHITECTURE" == "x86_64" ]]; then + if [[ "$PLATFORM" == "linux/amd64" ]]; then RIE="aws-lambda-rie" - elif [[ "$ARCHITECTURE" == "aarch64" ]]; then + elif [[ "$PLATFORM" == "linux/arm64/v8" ]]; then RIE="aws-lambda-rie-arm64" else - echo "Architecture $ARCHITECTURE is not currently supported." + echo "Platform $PLATFORM is not currently supported." exit 1 fi - tar -xvf aws-lambda-java-runtime-interface-client/test/integration/resources/${RIE}.tar.gz --directory "${SCRATCH_DIR}" @@ -65,6 +70,7 @@ phases: docker build . \ -f "${SCRATCH_DIR}/Dockerfile.function.${OS_DISTRIBUTION}.tmp" \ -t "${IMAGE_TAG}" \ + --platform="${PLATFORM}" \ --build-arg RUNTIME_VERSION="${RUNTIME_VERSION}" \ --build-arg DISTRO_VERSION="${DISTRO_VERSION}" build: diff --git a/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.amazonlinux.1.yml b/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.amazonlinux.1.yml index 49fe4b80..9eafb6de 100644 --- a/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.amazonlinux.1.yml +++ b/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.amazonlinux.1.yml @@ -17,6 +17,8 @@ batch: - "1" RUNTIME_VERSION: - "openjdk8" + PLATFORM: + - "linux/amd64" phases: install: commands: @@ -36,22 +38,13 @@ phases: - (cd aws-lambda-java-events && mvn install) # Install serialization (dependency of RIC) - (cd aws-lambda-java-serialization && mvn install) - - (cd aws-lambda-java-runtime-interface-client && mvn install) + - (cd aws-lambda-java-runtime-interface-client && mvn install -DmultiArch=false) - (cd aws-lambda-java-runtime-interface-client/test/integration/test-handler && mvn install) - export IMAGE_TAG="java-${OS_DISTRIBUTION}-${DISTRO_VERSION}:${RUNTIME_VERSION}" - echo "Extracting and including Runtime Interface Emulator" - SCRATCH_DIR=".scratch" - mkdir "${SCRATCH_DIR}" - - ARCHITECTURE=$(arch) - - > - if [[ "$ARCHITECTURE" == "x86_64" ]]; then - RIE="aws-lambda-rie" - elif [[ "$ARCHITECTURE" == "aarch64" ]]; then - RIE="aws-lambda-rie-arm64" - else - echo "Architecture $ARCHITECTURE is not currently supported." - exit 1 - fi + - RIE="aws-lambda-rie" - tar -xvf aws-lambda-java-runtime-interface-client/test/integration/resources/${RIE}.tar.gz --directory "${SCRATCH_DIR}" - > cp "aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.${OS_DISTRIBUTION}" \ diff --git a/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.amazonlinux.2.yml b/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.amazonlinux.2.yml index 2635b32c..cdd02073 100644 --- a/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.amazonlinux.2.yml +++ b/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.amazonlinux.2.yml @@ -4,6 +4,8 @@ env: variables: OS_DISTRIBUTION: amazonlinux JAVA_BINARY_LOCATION: "/usr/bin/java" + DOCKER_CLI_EXPERIMENTAL: "enabled" + DOCKER_CLI_PLUGIN_DIR: "/root/.docker/cli-plugins" batch: build-matrix: static: @@ -17,6 +19,9 @@ batch: - "2" RUNTIME_VERSION: - "openjdk8" + PLATFORM: + - "linux/amd64" + - "linux/arm64/v8" phases: install: commands: @@ -28,6 +33,7 @@ phases: echo "Performing DockerHub login . . ." docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD fi + - aws-lambda-java-runtime-interface-client/test/integration/codebuild/scripts/configure_multi_arch_env.sh pre_build: commands: # Log some environment variables for troubleshooting @@ -42,14 +48,13 @@ phases: - echo "Extracting and including Runtime Interface Emulator" - SCRATCH_DIR=".scratch" - mkdir "${SCRATCH_DIR}" - - ARCHITECTURE=$(arch) - > - if [[ "$ARCHITECTURE" == "x86_64" ]]; then + if [[ "$PLATFORM" == "linux/amd64" ]]; then RIE="aws-lambda-rie" - elif [[ "$ARCHITECTURE" == "aarch64" ]]; then + elif [[ "$PLATFORM" == "linux/arm64/v8" ]]; then RIE="aws-lambda-rie-arm64" else - echo "Architecture $ARCHITECTURE is not currently supported." + echo "Platform $PLATFORM is not currently supported." exit 1 fi - tar -xvf aws-lambda-java-runtime-interface-client/test/integration/resources/${RIE}.tar.gz --directory "${SCRATCH_DIR}" @@ -64,6 +69,7 @@ phases: docker build . \ -f "${SCRATCH_DIR}/Dockerfile.function.${OS_DISTRIBUTION}.tmp" \ -t "${IMAGE_TAG}" \ + --platform="${PLATFORM}" \ --build-arg RUNTIME_VERSION="${RUNTIME_VERSION}" \ --build-arg DISTRO_VERSION="${DISTRO_VERSION}" build: diff --git a/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.centos.yml b/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.centos.yml index 1f6b0d58..307b3280 100644 --- a/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.centos.yml +++ b/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.centos.yml @@ -4,6 +4,8 @@ env: variables: OS_DISTRIBUTION: centos JAVA_BINARY_LOCATION: "/usr/bin/java" + DOCKER_CLI_EXPERIMENTAL: "enabled" + DOCKER_CLI_PLUGIN_DIR: "/root/.docker/cli-plugins" batch: build-matrix: static: @@ -15,9 +17,11 @@ batch: variables: DISTRO_VERSION: - "7" - - "8" RUNTIME_VERSION: - "corretto11" + PLATFORM: + - "linux/amd64" + - "linux/arm64/v8" phases: install: commands: @@ -29,6 +33,7 @@ phases: echo "Performing DockerHub login . . ." docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD fi + - aws-lambda-java-runtime-interface-client/test/integration/codebuild/scripts/configure_multi_arch_env.sh pre_build: commands: # Log some environment variables for troubleshooting @@ -43,14 +48,13 @@ phases: - echo "Extracting and including Runtime Interface Emulator" - SCRATCH_DIR=".scratch" - mkdir "${SCRATCH_DIR}" - - ARCHITECTURE=$(arch) - > - if [[ "$ARCHITECTURE" == "x86_64" ]]; then + if [[ "$PLATFORM" == "linux/amd64" ]]; then RIE="aws-lambda-rie" - elif [[ "$ARCHITECTURE" == "aarch64" ]]; then + elif [[ "$PLATFORM" == "linux/arm64/v8" ]]; then RIE="aws-lambda-rie-arm64" else - echo "Architecture $ARCHITECTURE is not currently supported." + echo "Platform $PLATFORM is not currently supported." exit 1 fi - tar -xvf aws-lambda-java-runtime-interface-client/test/integration/resources/${RIE}.tar.gz --directory "${SCRATCH_DIR}" @@ -65,6 +69,7 @@ phases: docker build . \ -f "${SCRATCH_DIR}/Dockerfile.function.${OS_DISTRIBUTION}.tmp" \ -t "${IMAGE_TAG}" \ + --platform="${PLATFORM}" \ --build-arg RUNTIME_VERSION="${RUNTIME_VERSION}" \ --build-arg DISTRO_VERSION="${DISTRO_VERSION}" build: diff --git a/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.debian.yml b/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.debian.yml index 2fad4d9b..7c088810 100644 --- a/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.debian.yml +++ b/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.debian.yml @@ -4,6 +4,8 @@ env: variables: OS_DISTRIBUTION: debian JAVA_BINARY_LOCATION: "/usr/lib/jvm/java-11-amazon-corretto/bin/java" + DOCKER_CLI_EXPERIMENTAL: "enabled" + DOCKER_CLI_PLUGIN_DIR: "/root/.docker/cli-plugins" batch: build-matrix: static: @@ -15,8 +17,12 @@ batch: variables: DISTRO_VERSION: - "buster" + - "bullseye" RUNTIME_VERSION: - "corretto11" + PLATFORM: + - "linux/amd64" + - "linux/arm64/v8" phases: install: commands: @@ -28,6 +34,7 @@ phases: echo "Performing DockerHub login . . ." docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD fi + - aws-lambda-java-runtime-interface-client/test/integration/codebuild/scripts/configure_multi_arch_env.sh pre_build: commands: # Log some environment variables for troubleshooting @@ -42,14 +49,13 @@ phases: - echo "Extracting and including Runtime Interface Emulator" - SCRATCH_DIR=".scratch" - mkdir "${SCRATCH_DIR}" - - ARCHITECTURE=$(arch) - > - if [[ "$ARCHITECTURE" == "x86_64" ]]; then + if [[ "$PLATFORM" == "linux/amd64" ]]; then RIE="aws-lambda-rie" - elif [[ "$ARCHITECTURE" == "aarch64" ]]; then + elif [[ "$PLATFORM" == "linux/arm64/v8" ]]; then RIE="aws-lambda-rie-arm64" else - echo "Architecture $ARCHITECTURE is not currently supported." + echo "Platform $PLATFORM is not currently supported." exit 1 fi - tar -xvf aws-lambda-java-runtime-interface-client/test/integration/resources/${RIE}.tar.gz --directory "${SCRATCH_DIR}" @@ -67,6 +73,7 @@ phases: docker build . \ -f "${SCRATCH_DIR}/Dockerfile.function.${OS_DISTRIBUTION}.tmp" \ -t "${IMAGE_TAG}" \ + --platform="${PLATFORM}" \ --build-arg RUNTIME_VERSION="${RUNTIME_VERSION}" \ --build-arg DISTRO_VERSION="${DISTRO_VERSION}" build: diff --git a/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.ubuntu.yml b/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.ubuntu.yml index 3abedd65..7be6274f 100644 --- a/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.ubuntu.yml +++ b/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.ubuntu.yml @@ -4,6 +4,8 @@ env: variables: OS_DISTRIBUTION: ubuntu JAVA_BINARY_LOCATION: "/usr/lib/jvm/java-11-amazon-corretto/bin/java" + DOCKER_CLI_EXPERIMENTAL: "enabled" + DOCKER_CLI_PLUGIN_DIR: "/root/.docker/cli-plugins" batch: build-matrix: static: @@ -14,11 +16,15 @@ batch: env: variables: DISTRO_VERSION: - - "16.04" - "18.04" - "20.04" + - "21.10" + - "22.04" RUNTIME_VERSION: - "corretto11" + PLATFORM: + - "linux/amd64" + - "linux/arm64/v8" phases: install: commands: @@ -30,6 +36,7 @@ phases: echo "Performing DockerHub login . . ." docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD fi + - aws-lambda-java-runtime-interface-client/test/integration/codebuild/scripts/configure_multi_arch_env.sh pre_build: commands: # Log some environment variables for troubleshooting @@ -44,14 +51,13 @@ phases: - echo "Extracting and including Runtime Interface Emulator" - SCRATCH_DIR=".scratch" - mkdir "${SCRATCH_DIR}" - - ARCHITECTURE=$(arch) - > - if [[ "$ARCHITECTURE" == "x86_64" ]]; then + if [[ "$PLATFORM" == "linux/amd64" ]]; then RIE="aws-lambda-rie" - elif [[ "$ARCHITECTURE" == "aarch64" ]]; then + elif [[ "$PLATFORM" == "linux/arm64/v8" ]]; then RIE="aws-lambda-rie-arm64" else - echo "Architecture $ARCHITECTURE is not currently supported." + echo "Platform $PLATFORM is not currently supported." exit 1 fi - tar -xvf aws-lambda-java-runtime-interface-client/test/integration/resources/${RIE}.tar.gz --directory "${SCRATCH_DIR}" @@ -69,6 +75,7 @@ phases: docker build . \ -f "${SCRATCH_DIR}/Dockerfile.function.${OS_DISTRIBUTION}.tmp" \ -t "${IMAGE_TAG}" \ + --platform="${PLATFORM}" \ --build-arg RUNTIME_VERSION="${RUNTIME_VERSION}" \ --build-arg DISTRO_VERSION="${DISTRO_VERSION}" build: diff --git a/aws-lambda-java-runtime-interface-client/test/integration/codebuild/scripts/configure_multi_arch_env.sh b/aws-lambda-java-runtime-interface-client/test/integration/codebuild/scripts/configure_multi_arch_env.sh new file mode 100755 index 00000000..c4554805 --- /dev/null +++ b/aws-lambda-java-runtime-interface-client/test/integration/codebuild/scripts/configure_multi_arch_env.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. + +set -euo pipefail + +echo "Setting up multi-arch build environment" +ARCHITECTURE=$(arch) +if [[ "$ARCHITECTURE" == "x86_64" ]]; then + ARCHITECTURE_ALIAS="amd64" + TARGET_EMULATOR="arm64" +elif [[ "$ARCHITECTURE" == "aarch64" ]]; then + ARCHITECTURE_ALIAS="arm64" + TARGET_EMULATOR="amd64" +else + echo "Architecture $ARCHITECTURE is not currently supported." + exit 1 +fi +echo "Installing ${TARGET_EMULATOR} emulator" +docker pull public.ecr.aws/eks-distro-build-tooling/binfmt-misc:qemu-v6.1.0 +docker run --rm --privileged public.ecr.aws/eks-distro-build-tooling/binfmt-misc:qemu-v6.1.0 --install ${TARGET_EMULATOR} +# Install buildx plugin only if not already present (i.e. it's installed for the local-agent) +if [[ ! -f "${DOCKER_CLI_PLUGIN_DIR}/docker-buildx" ]]; then + echo "docker-buildx not found, installing now" + mkdir -p "${DOCKER_CLI_PLUGIN_DIR}" + BUILDX_URL=$(curl https://api.github.com/repos/docker/buildx/releases/latest | grep browser_download_url | grep "linux-${ARCHITECTURE_ALIAS}" | cut -d '"' -f 4) + wget "${BUILDX_URL}" -O "${DOCKER_CLI_PLUGIN_DIR}"/docker-buildx + chmod +x "${DOCKER_CLI_PLUGIN_DIR}"/docker-buildx +fi +echo "Setting docker build command to default to buildx" +docker buildx install diff --git a/aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.alpine b/aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.alpine index 60c74409..bfd28890 100644 --- a/aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.alpine +++ b/aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.alpine @@ -1,6 +1,6 @@ ARG DISTRO_VERSION -FROM alpine:${DISTRO_VERSION} +FROM public.ecr.aws/docker/library/alpine:${DISTRO_VERSION} RUN apk update && \ apk add openjdk8 diff --git a/aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.amazonlinux b/aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.amazonlinux index 4e58ac45..b3d152fc 100644 --- a/aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.amazonlinux +++ b/aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.amazonlinux @@ -1,6 +1,6 @@ ARG DISTRO_VERSION -FROM amazonlinux:${DISTRO_VERSION} +FROM public.ecr.aws/amazonlinux/amazonlinux:${DISTRO_VERSION} RUN yum install -y java-1.8.0-openjdk diff --git a/aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.centos b/aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.centos index 72036c6f..86509239 100644 --- a/aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.centos +++ b/aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.centos @@ -1,6 +1,6 @@ ARG DISTRO_VERSION -FROM centos:${DISTRO_VERSION} +FROM public.ecr.aws/docker/library/centos:centos${DISTRO_VERSION} RUN rpm --import https://yum.corretto.aws/corretto.key && \ curl -L -o /etc/yum.repos.d/corretto.repo https://yum.corretto.aws/corretto.repo && \ diff --git a/aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.debian b/aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.debian index 5c655186..1ef477cc 100644 --- a/aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.debian +++ b/aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.debian @@ -1,6 +1,6 @@ ARG DISTRO_VERSION -FROM debian:${DISTRO_VERSION} as build-image +FROM public.ecr.aws/debian/debian:${DISTRO_VERSION} as build-image RUN apt-get update && \ apt-get install -y wget gpg software-properties-common && \ @@ -9,7 +9,7 @@ RUN apt-get update && \ apt-get update && \ apt-get install -y java-11-amazon-corretto-jdk -FROM debian:${DISTRO_VERSION} +FROM public.ecr.aws/debian/debian:${DISTRO_VERSION} COPY --from=build-image /usr/lib/jvm /usr/lib/jvm diff --git a/aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.ubuntu b/aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.ubuntu index 217185cf..09107c46 100644 --- a/aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.ubuntu +++ b/aws-lambda-java-runtime-interface-client/test/integration/docker/Dockerfile.function.ubuntu @@ -1,6 +1,6 @@ ARG DISTRO_VERSION -FROM ubuntu:${DISTRO_VERSION} as build-image +FROM public.ecr.aws/ubuntu/ubuntu:${DISTRO_VERSION} as build-image RUN apt-get update && \ apt-get install -y apt-transport-https ca-certificates && \ @@ -10,7 +10,7 @@ RUN apt-get update && \ apt-get update && \ apt-get install -y java-11-amazon-corretto-jdk -FROM ubuntu:${DISTRO_VERSION} +FROM public.ecr.aws/ubuntu/ubuntu:${DISTRO_VERSION} COPY --from=build-image /usr/lib/jvm /usr/lib/jvm