Gradle is used to build OpenWhisk. It does not need to be pre-installed as it installs itself using the Gradle Wrapper. To use it without installing, simply invoke the gradlew
command at the root of the repository. You can also install gradle
via apt
on Ubuntu or brew
on Mac. In the following we use gradle
and gradlew
as synonymous.
In general, project level properties are set via -P{propertyName}={propertyValue}
. A task is called via gradle {taskName}
and a subproject task is called via gradle :path:to:subproject:{taskName}
. To run tasks in parallel, use the --parallel
flag (Note: It's an incubating feature and might break stuff).
To build all Docker images use gradle distDocker
at the top level project, to build a specific component use gradle :core:controller:distDocker
.
Project level options that can be used on distDocker
:
dockerImageName
(required): The name of the image to build (e.g. whisk/controller)dockerHost
(optional): The docker host to run commands on, default behaviour is docker's own DOCKER_HOST
environment variabledockerRegistry
(optional): The registry to push todockerImageTag
(optional, default ‘latest’): The tag for the imagedockerTimeout
(optional, default 240): Timeout for docker operations in secondsdockerRetries
(optional, default 3): How many times to retry docker operationsdockerBinary
(optional, default docker
): The binary to execute docker commandsTo run tests one uses the test
task. OpenWhisk consolidates tests into a single tests
project. Hence the command to run all tests is gradle :tests:test
.
It is possible to run specific tests using Gradle testfilters. For example gradle :tests:test --tests "your.package.name.TestClass.evenMethodName"
. Wildcard *
may be used anywhere.
build.gradle
In Gradle, most of the tasks we use are default tasks provided by plugins in Gradle. The scala
Plugin for example includes tasks, that are needed to build Scala projects. Moreover, Gradle is aware of Applications. The application
Plugin provides tasks that are required to distribute a self-contained application. When application
and scala
are used in conjunction, they hook into each other and provide the tasks needed to distribute a Scala application. distTar
for example compiles the Scala code, creates a jar containing the compiled classes and resources and creates a Tarball including that jar and all of its dependencies (defined in the dependencies section of build.gradle
). It also creates a start-script which correctly sets the classpath for all those dependencies and starts the app.
In OpenWhisk, we want to distribute our application via Docker images. Hence we wrote a “plugin” that creates the task distDocker
. That task will build an image from the Dockerfile
that is located next to the build.gradle
it is called from, for example Controller's Dockerfile
and build.gradle
are both located at core/controller
.
If you want to create a new build.gradle
for your component, simply put the Dockerfile
right next to it and include docker.gradle
by using
ext.dockerImageName = 'openwwhisk/{IMAGENAME}' apply from: 'path/to/docker.gradle'
If your component needs to be build before you can build the image, make distDocker
depend on any task needed to run before it, for example:
distDocker.dependsOn ':common:scala:distDocker', 'distTar'