aws_lambda_builders/workflows/java_gradle/actions.py (77 lines of code) (raw):
"""
Actions for the Java Gradle Workflow
"""
import os
from aws_lambda_builders.actions import ActionFailedError, BaseAction, Purpose
from ..java.utils import jar_file_filter
from .gradle import GradleExecutionError
class JavaGradleBuildAction(BaseAction):
NAME = "GradleBuild"
DESCRIPTION = "Building the project using Gradle"
PURPOSE = Purpose.COMPILE_SOURCE
INIT_SCRIPT = "lambda-build-init.gradle"
SCRATCH_DIR_PROPERTY = "software.amazon.aws.lambdabuilders.scratch-dir"
GRADLE_CACHE_DIR_NAME = "gradle-cache"
def __init__(self, source_dir, build_file, subprocess_gradle, scratch_dir, os_utils):
self.source_dir = source_dir
self.build_file = build_file
self.scratch_dir = scratch_dir
self.subprocess_gradle = subprocess_gradle
self.os_utils = os_utils
self.cache_dir = os.path.join(self.scratch_dir, self.GRADLE_CACHE_DIR_NAME)
def execute(self):
init_script_file = self._copy_init_script()
self._build_project(init_script_file)
@property
def gradle_cache_dir(self):
return self.cache_dir
def _copy_init_script(self):
try:
src = os.path.join(os.path.dirname(__file__), "resources", self.INIT_SCRIPT)
dst = os.path.join(self.scratch_dir, self.INIT_SCRIPT)
return self.os_utils.copy(src, dst)
except Exception as ex:
raise ActionFailedError(str(ex))
def _build_project(self, init_script_file):
try:
if not self.os_utils.exists(self.scratch_dir):
self.os_utils.makedirs(self.scratch_dir)
self.subprocess_gradle.build(
self.source_dir,
self.build_file,
self.gradle_cache_dir,
init_script_file,
{self.SCRATCH_DIR_PROPERTY: os.path.abspath(self.scratch_dir)},
)
except GradleExecutionError as ex:
raise ActionFailedError(str(ex))
class JavaGradleCopyArtifactsAction(BaseAction):
NAME = "JavaGradleCopyArtifacts"
DESCRIPTION = "Copying the built artifacts"
PURPOSE = Purpose.COPY_SOURCE
def __init__(self, source_dir, artifacts_dir, build_dir, os_utils):
self.source_dir = source_dir
self.artifacts_dir = artifacts_dir
self.build_dir = build_dir
self.os_utils = os_utils
def execute(self):
self._copy_artifacts()
def _copy_artifacts(self):
lambda_build_output = os.path.join(self.build_dir, "build", "distributions", "lambda-build")
try:
if not self.os_utils.exists(self.artifacts_dir):
self.os_utils.makedirs(self.artifacts_dir)
self.os_utils.copytree(lambda_build_output, self.artifacts_dir)
except Exception as ex:
raise ActionFailedError(str(ex))
class JavaGradleCopyLayerArtifactsAction(JavaGradleCopyArtifactsAction):
"""
Java layers does not support using .class files in it.
This action (different from the parent one) copies contents of the layer as jar files and place it
into the artifact folder
"""
NAME = "JavaGradleCopyLayerArtifacts"
def _copy_artifacts(self):
lambda_build_output = os.path.join(self.build_dir, "build", "libs")
layer_dependencies = os.path.join(self.build_dir, "build", "distributions", "lambda-build", "lib")
try:
if not self.os_utils.exists(self.artifacts_dir):
self.os_utils.makedirs(self.artifacts_dir)
self.os_utils.copytree(
lambda_build_output, os.path.join(self.artifacts_dir, "lib"), include=jar_file_filter
)
self.os_utils.copytree(layer_dependencies, os.path.join(self.artifacts_dir, "lib"), include=jar_file_filter)
except Exception as ex:
raise ActionFailedError(str(ex))