///////////////////////////////////////////////////////////////
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
///////////////////////////////////////////////////////////////

[[build-system,Build System]]
= Polygene™ Build System =

This tutorial is intended for developers who want to build the Polygene™ SDK themselves.
It describe the Polygene™ SDK Build System from compilation to publication of artifacts for consumption by other
applications.

If instead you want to setup your project build system to depend on modules of the Polygene™ SDK see the
<<howto-depend-on-polygene,dedicated tutorial>>.


== Gradle ==

NOTE: All major Java IDEs have great Gradle support.
Visit the https://www.gradle.org/resources[Gradle] website to learn how to import the Polygene™ SDK build into your
favorite IDE.

Polygene™ community migrated away from Maven after several years of frustration, especially around release management,
versioning and cross-module dependency resolution issues, in Feb 2011.
The tool of choice is now Gradle, and it doesn't require any installation, there are +gradlew+ and +gradlew.bat+ in
the root folder of the Polygene™ SDK that will bootstrap Gradle if not done so already.

If you are new to Gradle, you should keep the https://gradle.org/docs[documentation] at hands.

Build System configuration is done through Gradle properties.
This can be done in many ways, see
https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_properties_and_system_properties[Gradle properties and system properties].

== The Wrapper ==

`gradlew` and `gradlew.bat` scripts that can be found at the root of the Polygene sources is *The Wrapper*.
Any build invocation starts from this script.
It will download the Gradle distribution version required by the build.
See the https://docs.gradle.org/current/userguide/gradle_wrapper.html[Gradle Wrapper] documentation for more details.

== Main tasks ==

The Polygene™ SDK project has tasks that work with the whole SDK.

`./gradlew downloadDependencies`::
--
Resolve, download and cache all needed dependencies.
Useful to go offline.
--

`./gradlew`::
--
The default build, triggered when running gradle without any command line arguments, compiles the code and run the
tests, but nothing else. A quick way to check that nothing broke.
--

`./gradlew clean`::
--
Clean up of all build output and restore the code base to a fresh state.
--

`./gradlew assemble`::
--
Produces all the archives, javadocs, manuals and website content.
Global output is generated into +distributions/build+.
--

`./gradlew check`::
--
Run the tests and other checks like checkstyle.
Global reports are generated in +reports/build/reports+.
--

`./gradlew build`::
--
Equivalent to `./gradlew assemble check`
--

`./gradlew checkDistributions`::
--
Run global checks against the assembled distributions.
Can take a while.
--

`./gradlew install`::
--
Is roughly the same as Maven's install goal.
It produces the test reports, javadocs and installs all the Jars into the local disk repository, for consumption
by other applications.
--


== Other tasks ==

In addition to that, some submodules have specific tasks.
To see all available tasks, issue the following command:

[source,bash]
----
./gradlew tasks
----

All available tasks from all modules of the SDK are shown.
If you want to narrow your exploration to submodules use the following:

[source,bash]
----
./gradlew :test:performance:tasks
./gradlew :release:tasks
----

These examples will respectively output all gradle tasks available in the +:tests:performance+ module where you should find
the +performanceTest+ task that runs the Polygene™ performance test suite and the +:release+ module tasks.

+tasks+ itself is a task, in the same way we can target module(s) with tasks, e.g.:

[source,bash]
----
./gradlew :core:check :libraries:alarm:check
----


== Versions ==

By default, the build system produces a "zero build".
It means that there is no version assigned to the build, and a "0" is used in the produced artifacts.
This is due to our disagreement (with Maven community) that the "next" version name/number is known prior to
the release.
This is in our opinion a delayed decision.
To build a particular version, you specify a +version+ property on the command-line, like

[source,bash]
-----------
./gradlew -Dversion=2.0-FLAVOUR install
-----------

If a +version+ property is not defined, the build system will refuse to make a release and upload.
It will also try hard to do less and not get in your way.


== Tests ==

NOTE: See the https://builds.apache.org/view/P/view/Polygene/[Polygene™ Continuous Integration] for current tests results

Unit and integration tests are located near the code under test.
You'll find theses tests across the whole SDK.

=== Unit tests requiring external services ===

Among unit tests, some require an external service to be run.
For example, the Redis EntityStore extension requires an actual Redis server to run its tests.

NOTE: The HTML test reports generated by Gradle shows skipped tests.

Testing against external services is automated using Docker and is enabled automatically if a running Docker service
is reachable.
The build creates the necessary Docker images and start/stop containers around the tests.

On Linux it should work out of the box.

The simplest way to get this running on other systems (macOS and Windows) is to use `docker-machine` to create a
development Docker virtual machine where all images will be built and containers started:

[source,bash]
----
docker-machine create dev
docker-machine start dev
eval $(docker-machine env dev)
----

The last stanza set environment variables for Docker to use the newly created Docker virtual machine.

If you want to run the Docker containers in a remote machine, simply set the `DOCKER_HOST` and `DOCKER_CERT_PATH`
environment variables to something sensible for your setup.

If you want to forcibly skip all Docker related work, set the `skipDocker` Gradle property by e.g. appending
`-PskipDocker` to your Gradle command line.

=== Performance tests ===

Performance tests provide performance measurements for typical Polygene™ use cases.
They are not part of the default build and are located in the `tests/performance` directory of the SDK.

They can be run with the following Gradle command:

[source,bash]
-----------
./gradlew :tests:performance:performanceTest
-----------

Results will then be available in the test reports.


== Documentation generation ==

The build generates a documentation minisite:

[source,bash]
-----------
./gradlew :manual:assemble
-----------

Output is in `~/manual/build/docs/website`.

You'll need Asciidoc and docbook-xsl installed.



== Build for releases ==

IMPORTANT: Remember that if a +version+ property is not defined, the build system will refuse to make a release and upload.

The Polygene™ SDK build system is setup for an easy release process.
This is very useful to the Polygene™ Core Team but can also be useful to third parties that want to cut a in-house release.
In this regard, we try to make every aspect of the release process usable for such cases.

The following sections describe various aspects of the release process.
By default you need to have a proper PGP setup, see below.


=== Release Criteria ===

The Polygene™ SDK modules are of varying maturity level and we try to maintain a STATUS (+dev-status.xml+) file indicating
how good the codebase, documentation and unit tests are for each of the modules. This is highly subjective and
potentially different individuals will judge this differently, but at least it gives a ballpark idea of the situation
for our users.

The Polygene™ SDK build system use the values from the +dev-status.xml+ files to filter out non-releasable modules out for
the +javadocs+ and +uploadArchives+ root project tasks.
Moreover, the +release+ task ensure that no releasable module depends on module(s) that don't fit the release criteria
and throw a detailed exception if need be.

This can be relaxed by adding +-x checkReleaseSpec+ arguments to gradle invocation.


=== Signing ===

Artifact signing is done using PGP.
You need to provide Gradle the following properties, `~/.gradle/gradle.properties` is a good place:

    signing.keyId=FB751943
    signing.password=foobar
    signing.secretKeyRingFile=/home/foo/.gnupg/secring.gpg

You can skip the signing process by adding +-x signArchives+ arguments to gradle invocation.


=== Artifact Upload ===

Artifact upload behavior depends on the version assigned to the build.

By default RELEASES are signed, SNAPSHOTS are not.
Signing can be turned on or off by setting the `uploadSigned` property to false.

By default RELEASES must satisfy ReleaseSpecification, SNAPSHOT don't.
ReleaseSpecification usage can be turned on or off by setting the `uploadReleaseSpec` property to false.

By default RELEASES and SNAPHOTS are uploaded using HTTP.
Used Wagon can be overriden by setting the `uploadWagon` property.

By default RELEASES and SNAPSHOTS are uploaded to the Apache Nexus.
Target repository can be overriden by setting the `uploadRepository` property.

No username/password is provided by default.
If needed set them using the `uploadUsername` and `uploadPassword` properties.

For example here is how to deploy all artifacts as unsigned SNAPSHOTs to a given repository:

[source,bash]
-----------
./gradlew uploadArchives -Dversion=3.2.1-SNAPSHOT -PuploadReleaseSpec=false \
    -PuploadWagon=what:ever:wagon -PuploadRepository=http://what.ever.repository/url \
    -PuploadUsername=foo -PuploadPassword=bar
-----------

And here is how to deploy a signed release to the local filesystem:

[source,bash]
-----------
./gradlew uploadArchives -Dversion=3.2.1 -PuploadRepository=file:///path/to/local/repository
-----------

See the https://docs.gradle.org/current/userguide/maven_plugin.html#wagonLibs[Gradle documentation] about
supported protocols.
