Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Support for Java8 and Provided AL2 Runtimes #2168

Merged
merged 8 commits into from Aug 12, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
65 changes: 65 additions & 0 deletions build-image-src/Dockerfile-java8-al2
@@ -0,0 +1,65 @@
FROM amazon/aws-sam-cli-emulation-image-java8.al2

# Copying root from runtimes image to AL2
FROM amazonlinux:2
COPY --from=0 / /rootfs

# Installing by yum at copied location
RUN yum groupinstall -y development --installroot=/rootfs && yum clean all
RUN yum install -d1 --installroot=/rootfs -y \
yum \
tar \
gzip \
unzip \
python3 \
grep \
curl \
make \
binutils \
gcc-c++ \
procps \
libgmp3-dev \
zlib1g-dev \
liblzma-dev \
libxslt-devel \
libmpc-devel \
java-1.8.0-openjdk-devel \
&& yum clean all

# Copying root from AL2 to runtimes image
FROM amazon/aws-sam-cli-emulation-image-java8.al2
COPY --from=1 /rootfs /

# Install AWS CLI
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && unzip awscliv2.zip && ./aws/install && rm awscliv2.zip && rm -rf ./aws

# Install SAM CLI in a dedicated Python virtualenv
ARG SAM_CLI_VERSION
RUN curl -Lk "https://github.com/awslabs/aws-sam-cli/archive/v$SAM_CLI_VERSION.zip" -o "samcli.zip" && \
unzip samcli.zip && python3 -m venv /usr/local/opt/sam-cli && \
/usr/local/opt/sam-cli/bin/pip3 --no-cache-dir install -r ./aws-sam-cli-$SAM_CLI_VERSION/requirements/reproducible-linux.txt && \
/usr/local/opt/sam-cli/bin/pip3 --no-cache-dir install ./aws-sam-cli-$SAM_CLI_VERSION

RUN rm samcli.zip && rm -rf aws-sam-cli-$SAM_CLI_VERSION

ENV PATH=$PATH:/usr/local/opt/sam-cli/bin

ENV LANG=en_US.UTF-8

# Wheel is required by SAM CLI to build libraries like cryptography. It needs to be installed in the system
# Python for it to be picked up during `sam build`
RUN pip3 install wheel

# Setup Java Home
ENV JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk"

# Install Java build tools

RUN mkdir /usr/local/gradle && curl -L -o gradle.zip https://downloads.gradle-dn.com/distributions/gradle-6.2.2-bin.zip && \
unzip -d /usr/local/gradle gradle.zip && rm gradle.zip && mkdir /usr/local/maven && \
curl -L http://mirror.cc.columbia.edu/pub/software/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz | \
tar -zx -C /usr/local/maven

ENV PATH="/usr/local/gradle/gradle-6.2.2/bin:/usr/local/maven/apache-maven-3.6.3/bin:${PATH}"

COPY ATTRIBUTION.txt /
52 changes: 52 additions & 0 deletions build-image-src/Dockerfile-provided.al2
@@ -0,0 +1,52 @@
FROM amazon/aws-sam-cli-emulation-image-java8.al2

# To learn more context around use of `amazonlinux:2` image please read comment in java11/build/Dockerfile
FROM amazonlinux:2
COPY --from=0 / /rootfs

# Installing by yum at copied location
RUN yum groupinstall -y development --installroot=/rootfs && yum clean all
RUN yum install -d1 --installroot=/rootfs -y \
yum \
tar \
gzip \
unzip \
python3 \
grep \
curl \
make \
binutils \
gcc-c++ \
procps \
libgmp3-dev \
zlib1g-dev \
liblzma-dev \
libxslt-devel \
libmpc-devel \
&& yum clean all

# Copying root from AL2 to runtimes image
FROM amazon/aws-sam-cli-emulation-image-java8.al2
COPY --from=1 /rootfs /

# Install AWS CLI
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && unzip awscliv2.zip && ./aws/install && rm awscliv2.zip && rm -rf ./aws

# Install SAM CLI in a dedicated Python virtualenv
ARG SAM_CLI_VERSION
RUN curl -Lk "https://github.com/awslabs/aws-sam-cli/archive/v$SAM_CLI_VERSION.zip" -o "samcli.zip" && \
unzip samcli.zip && python3 -m venv /usr/local/opt/sam-cli && \
/usr/local/opt/sam-cli/bin/pip3 --no-cache-dir install -r ./aws-sam-cli-$SAM_CLI_VERSION/requirements/reproducible-linux.txt && \
/usr/local/opt/sam-cli/bin/pip3 --no-cache-dir install ./aws-sam-cli-$SAM_CLI_VERSION

RUN rm samcli.zip && rm -rf aws-sam-cli-$SAM_CLI_VERSION

ENV PATH=$PATH:/usr/local/opt/sam-cli/bin

ENV LANG=en_US.UTF-8

# Wheel is required by SAM CLI to build libraries like cryptography. It needs to be installed in the system
# Python for it to be picked up during `sam build`
RUN pip3 install wheel

COPY ATTRIBUTION.txt /
2 changes: 2 additions & 0 deletions samcli/lib/build/app_builder.py
Expand Up @@ -306,6 +306,8 @@ def _build_function_in_process(self,
dependency_manager=config.dependency_manager,
application_framework=config.application_framework)

runtime = runtime.replace(".al2", "")

try:
builder.build(source_dir,
artifacts_dir,
Expand Down
10 changes: 9 additions & 1 deletion samcli/lib/build/workflow_config.py
Expand Up @@ -140,6 +140,7 @@ def get_layer_subfolder(build_workflow):
"ruby2.7": "ruby/lib",
"java8": "java",
"java11": "java",
"java8.al2": "java",
# User is responsible for creating subfolder in these workflows
"makefile": "",
}
Expand Down Expand Up @@ -210,7 +211,14 @@ def get_workflow_config(runtime, code_dir, project_dir, specified_workflow=None)
JAVA_KOTLIN_GRADLE_CONFIG._replace(executable_search_paths=[code_dir, project_dir]),
JAVA_MAVEN_CONFIG
]),
"provided": BasicWorkflowSelector(PROVIDED_MAKE_CONFIG)
"java8.al2": ManifestWorkflowSelector([
# Gradle builder needs custom executable paths to find `gradlew` binary
JAVA_GRADLE_CONFIG._replace(executable_search_paths=[code_dir, project_dir]),
JAVA_KOTLIN_GRADLE_CONFIG._replace(executable_search_paths=[code_dir, project_dir]),
JAVA_MAVEN_CONFIG
]),
"provided": BasicWorkflowSelector(PROVIDED_MAKE_CONFIG),
"provided.al2": BasicWorkflowSelector(PROVIDED_MAKE_CONFIG)
}
# First check if the runtime is present and is buildable, if not raise an UnsupportedRuntimeException Error.
# If runtime is present it should be in selectors_by_runtime, however for layers there will be no runtime so in that case
Expand Down
7 changes: 5 additions & 2 deletions samcli/local/common/runtime_template.py
Expand Up @@ -54,13 +54,13 @@
],
"java": [
{
"runtimes": ["java11", "java8"],
"runtimes": ["java11", "java8", "java8.al2"],
"dependency_manager": "maven",
"init_location": os.path.join(_templates, "cookiecutter-aws-sam-hello-java-maven"),
"build": True,
},
{
"runtimes": ["java11", "java8"],
"runtimes": ["java11", "java8", "java8.al2"],
"dependency_manager": "gradle",
"init_location": os.path.join(_templates, "cookiecutter-aws-sam-hello-java-gradle"),
"build": True,
Expand All @@ -82,6 +82,7 @@
"go1.x": ["mod"],
"java8": ["maven", "gradle"],
"java11": ["maven", "gradle"],
"java8.al2": ["maven", "gradle"],
}

SUPPORTED_DEP_MANAGERS = {
Expand Down Expand Up @@ -113,6 +114,7 @@
# older ruby runtimes
"ruby2.5",
# older java runtimes
"java8.al2",
"java8",
# older dotnetcore runtimes
"dotnetcore2.1",
Expand All @@ -121,6 +123,7 @@
# Schemas Code lang is a MINIMUM supported version - this is why later Lambda runtimes can be mapped to earlier Schemas Code Languages
SAM_RUNTIME_TO_SCHEMAS_CODE_LANG_MAPPING = {
"java8": "Java8",
"java8.al2": "Java8",
"java11": "Java8",
"python3.7": "Python36",
"python3.6": "Python36",
Expand Down
2 changes: 2 additions & 0 deletions samcli/local/docker/lambda_build_container.py
Expand Up @@ -117,6 +117,8 @@ def _make_request(
mode,
):

runtime = runtime.replace(".al2", "")

return json.dumps(
{
"jsonschema": "2.0",
Expand Down
2 changes: 2 additions & 0 deletions samcli/local/docker/lambda_image.py
Expand Up @@ -29,11 +29,13 @@ class Runtime(Enum):
ruby25 = "ruby2.5"
ruby27 = "ruby2.7"
java8 = "java8"
java8al2 = "java8.al2"
java11 = "java11"
go1x = "go1.x"
dotnetcore21 = "dotnetcore2.1"
dotnetcore31 = "dotnetcore3.1"
provided = "provided"
providedal2 = "provided.al2"

@classmethod
def has_value(cls, value):
Expand Down
19 changes: 18 additions & 1 deletion tests/integration/buildcmd/test_build_cmd.py
Expand Up @@ -315,6 +315,11 @@ class TestBuildCommand_Java(BuildIntegBase):
("java8", USING_GRADLE_KOTLIN_PATH, EXPECTED_FILES_PROJECT_MANIFEST_GRADLE),
("java8", USING_MAVEN_PATH, EXPECTED_FILES_PROJECT_MANIFEST_MAVEN),
("java8", USING_GRADLE_PATH, EXPECTED_FILES_PROJECT_MANIFEST_GRADLE),
("java8.al2", USING_GRADLE_PATH, EXPECTED_FILES_PROJECT_MANIFEST_GRADLE),
("java8.al2", USING_GRADLEW_PATH, EXPECTED_FILES_PROJECT_MANIFEST_GRADLE),
("java8.al2", USING_GRADLE_KOTLIN_PATH, EXPECTED_FILES_PROJECT_MANIFEST_GRADLE),
("java8.al2", USING_MAVEN_PATH, EXPECTED_FILES_PROJECT_MANIFEST_MAVEN),
("java8.al2", USING_GRADLE_PATH, EXPECTED_FILES_PROJECT_MANIFEST_GRADLE),
("java11", USING_GRADLE_PATH, EXPECTED_FILES_PROJECT_MANIFEST_GRADLE),
("java11", USING_GRADLEW_PATH, EXPECTED_FILES_PROJECT_MANIFEST_GRADLE),
("java11", USING_GRADLE_KOTLIN_PATH, EXPECTED_FILES_PROJECT_MANIFEST_GRADLE),
Expand All @@ -333,6 +338,11 @@ def test_building_java_in_container(self, runtime, code_path, expected_files):
("java8", USING_GRADLE_KOTLIN_PATH, EXPECTED_FILES_PROJECT_MANIFEST_GRADLE),
("java8", USING_MAVEN_PATH, EXPECTED_FILES_PROJECT_MANIFEST_MAVEN),
("java8", USING_GRADLE_PATH, EXPECTED_FILES_PROJECT_MANIFEST_GRADLE),
("java8.al2", USING_GRADLE_PATH, EXPECTED_FILES_PROJECT_MANIFEST_GRADLE),
("java8.al2", USING_GRADLEW_PATH, EXPECTED_FILES_PROJECT_MANIFEST_GRADLE),
("java8.al2", USING_GRADLE_KOTLIN_PATH, EXPECTED_FILES_PROJECT_MANIFEST_GRADLE),
("java8.al2", USING_MAVEN_PATH, EXPECTED_FILES_PROJECT_MANIFEST_MAVEN),
("java8.al2", USING_GRADLE_PATH, EXPECTED_FILES_PROJECT_MANIFEST_GRADLE),
]
)
@pytest.mark.flaky(reruns=3)
Expand Down Expand Up @@ -854,7 +864,14 @@ class TestBuildCommand_ProvidedFunctions(BuildIntegBase):

FUNCTION_LOGICAL_ID = "Function"

@parameterized.expand([("provided", False, None), ("provided", "use_container", "Makefile-container")])
@parameterized.expand(
[
("provided", False, None),
("provided", "use_container", "Makefile-container"),
("provided.al2", False, None),
("provided.al2", "use_container", "Makefile-container"),
]
)
@pytest.mark.flaky(reruns=3)
def test_with_Makefile(self, runtime, use_container, manifest):
overrides = {"Runtime": runtime, "CodeUri": "Provided", "Handler": "main.handler"}
Expand Down