A Note about Invoking Maven
===========================

Apache Ignite build system uses Maven Wrapper to simplify and standardize build process. On different operating
systems, it should be run slightly differently:

* On Unix-like systems (including Cygwin, WSL, git-bash), it's `./mvnw <arguments>`
* On Windows (in PowerShell), it's `./mvnw <arguments>` as well
* On Windows (in cmd shell), it's `.\mvnw <arguments>` or `mvnw <arguments>` (in older versions)

Further in our documentation, we always use the ./mvnw form. Please adapt it to your system if needed.

Apache Ignite Maven Build Instructions
======================================
1) Optional: build Apache Ignite.NET as described at modules/platforms/dotnet/DEVNOTES.txt.

2) Compile and install:

        ./mvnw clean install -Pall-java,all-scala,licenses -DskipTests

   or if you have built Apache Ignite.NET on the first step use following command:
   (Note that 'doxygen' should be installed before running this command.)

        ./mvnw clean install -Pall-java,all-scala,licenses -DskipTests -DclientDocs

3) Javadoc generation (optional):

        ./mvnw initialize -Pjavadoc

4) Build Apache Ignite assembly:

        ./mvnw initialize -Prelease

   Look for apache-ignite-<version>-bin.zip in ./target/bin directory.

5) Build Apache Ignite slim edition assembly:

        ./mvnw initialize -Prelease -Dignite.edition=apache-ignite-slim

   Look for apache-ignite-slim-<version>-bin.zip in ./target/bin directory.


Apache Ignite with LGPL Maven Build Instructions
================================================
1) Optional: build Apache Ignite.NET as described at modules/platforms/dotnet/DEVNOTES.txt.

2) Compile and install:

        ./mvnw clean install -Pall-java,all-scala,licenses -DskipTests

   or if you have built Apache Ignite.NET on the first step use following command:
   (Note that 'doxygen' should be installed before running this command.)

        ./mvnw clean install -Pall-java,all-scala,licenses -DskipTests -DclientDocs

3) Javadoc generation with LGPL (optional):

        ./mvnw initialize -Pjavadoc,lgpl

4) Build Apache Ignite assembly with LGPL dependencies:

        ./mvnw initialize -Prelease,lgpl -Dignite.edition=apache-ignite-lgpl

   Look for apache-ignite-lgpl-<version>-bin.zip in ./target/bin directory.


Ignite C++ Build Instructions
=============================
Instructions can be found at modules/platforms/cpp/DEVNOTES.txt.


Apache Ignite RPM Package Build Instructions
============================================
1) Build Apache Ignite binary archive (instructions above)

2) Run packaging script and follow messages if they required interaction

        packaging/package.sh --rpm

   Packages will be available in packaging/ directory


Apache Ignite DEB Package Build Instructions
============================================
1) Build Apache Ignite binary archive (instructions above)

2) Build Apache Ignite RPM package (also above)

3) Run packaging script and follow messages if they required interaction

        packaging/package.sh --deb

   Packages will be available in packaging/ directory

   NOTE: to build both packages type at once, run

        packaging/package.sh --rpm --deb


Install and Run Apache Ignite from packages
===========================================
1) Install package with YUM or APT respectively

        yum localinstall -y apache-ignite-<version>.noarch.rpm
            or
        dpkg -i apache-ignite_<version>_all.deb

2) Start Apache Ignite service

        systemctl start apache-ignite@<config name>

   NOTE: <config name> - relative to /etc/apache-ignite configuration file name

   Example:

        systemctl start apache-ignite@default-config.xml

3) See logs in /var/log/apache-ignite or journalctl -xe


Ignite Release Instructions
===========================
1) Use your people.apache.org/keys/committer/<username>.asc key to generate KEYS file.
   Download https://dist.apache.org/repos/dist/release/ignite/KEYS and append you key using commands:

        gpg --list-sigs <keyname> >> KEYS
        gpg --armor --export <keyname> >> KEYS

   Upload modified KEYS file.

2) Specify gpg profile at settings.xml. It will be used to sign sources and artifacts.

<profile>
   <id>gpg</id>
   <properties>
      <gpg.keyname>keyname</gpg.keyname>
      <gpg.passphrase>passphrase</gpg.passphrase>
   </properties>
</profile>

   Ensure you have RELEASE (not SNAPSHOT) version at Ignite poms.
   Maven release plugin release:prepare goal can be used to make release tag.

3) Deploy Ignite release candidate to maven repository and dev-svn, make tag:

   3.1) Deploy Ignite to maven repository, prepares sources and binaries.

                ./mvnw deploy -Papache-release,gpg,all-java,all-scala,licenses,deploy-ignite-site -Dignite.edition=apache-ignite -DskipTests

   3.2) Javadoc generation:

                ./mvnw initialize -Pjavadoc

   3.3) Assembly Apache Ignite:

                ./mvnw initialize -Prelease

   NOTE: Nexus staging (repository.apache.org) should be closed with appropriate comment contains release version and
   release candidate number, for example "Apache Ignite 1.0.0-rc7", when `./mvnw deploy` finished.

   3.5) Checkout https://dist.apache.org/repos/dist/dev/ignite svn. Create release candidate folder with name
        equals to release version with "-rc*" ending, for example "1.0.0-rc7", at svn root.
        Copy /target/site folder content to svn/ignite/<rc-version> folder and commit with appropriate comment.

   3.6) Make appropriate git tag for release candidate, for example "ignite-X.Y.Z-rc1".

4) Start vote based on https://dist.apache.org/repos/dist/dev/ignite/<rc-version>.

5) Release nexus staging, move binaries and sources from https://dist.apache.org/repos/dist/dev/ignite/<rc-version>
   to https://dist.apache.org/repos/dist/release/ignite/<version> when version accepted.
   Use svn mv ^/dev/ignite/<rc-version> ^/release/ignite/<version> command for proper moving.

6) Make appropriate git tag for released version, for example "ignite-X.Y.Z".

7) Send an email to dev@ignite.apache.org contains release svn url.


JCache TCK compliance
======================
To test compliance with JCache TCK use:

        ./mvnw test -P-release,jcache-tck -pl :ignite-core -am


Ignite Mesos Maven Build Instructions
=====================================

        cd ./modules/mesos
        mvn clean package

Look for ignite-mesos-<version>.jar in ./target directory.


Ignite Yarn Maven Build Instructions
====================================

        cd ./modules/yarn
        mvn clean package

Look for ignite-yarn-<version>.jar in ./target directory.


Run tests
=========
To run tests locally use:

        ./mvnw clean test -U -Plgpl,examples,-clean-libs,-release -Dmaven.test.failure.ignore=true -DfailIfNoTests=false -Dtest=%TEST_PATTERN%

For example, %TEST_PATTERN% can be 'org.apache.ignite.testsuites.IgniteBasicTestSuite' or 'GridCacheLocalAtomicFullApiSelfTest#testGet'

Test suites
=========
All unit tests must be included in any test suite. Travis runs a check for that. To check it locally run for the root project:

        ./mvnw test -Pcheck-test-suites

If you want to check a single module only:

1) Add ignite-tools dependency to the test scope of the module.

2) Install ignite-tools with command:

    ./mvnw install -Pcheck-test-suites

3) Run tests in the module:

    ./mvnw test

Apache RAT Instructions
=======================
To check license headers use:

        ./mvnw clean validate -Pcheck-licenses

For more information (e.g. exclude list) see "check-licenses" profile in "parent/pom.xml".


Useful Release Commands
=======================
ZIP:
        zip -r9 apache-ignite-X.X.X-src.zip apache-ignite-X.X.X-src
GPG:
        gpg --armor --output apache-ignite-X.X.X-src.zip.asc --detach-sig apache-ignite-X.X.X-src.zip

