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

2) Compile and install:

        mvn 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.)

        mvn clean install -Pall-java,all-scala,licenses -DskipTests -DclientDocs

3) Javadoc generation (optional):

        mvn initialize -Pjavadoc

4) Assembly Apache Ignite:

        mvn initialize -Prelease

Look for apache-ignite-<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:

        mvn 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.)

        mvn clean install -Pall-java,all-scala,licenses -DskipTests -DclientDocs

3) Javadoc generation with LGPL (optional):

        mvn initialize -Pjavadoc,lgpl

4) Assembly Apache Ignite  with LGPL dependencies:

        mvn initialize -Prelease,lgpl -Dignite.edition=apache-ignite-lgpl

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


Ignite Hadoop Accelerator Maven Build Instructions
==================================================
1) Compile and install:

        mvn clean install -Pall-java,all-scala,licenses -DskipTests

   Use 'hadoop.version' parameter to build Ignite against a specific Hadoop version.
   Use 'spark.version' parameter to build ignite-spark module for a specific Spark version. Version should be >= 2.0.0.
   For example:

        mvn clean install -Pall-java,all-scala,licenses -DskipTests -Dhadoop.version=2.4.2 -Dspark.version=2.1.1

2) Assembly Hadoop Accelerator:

        mvn initialize -Prelease -Dignite.edition=apache-ignite-hadoop

   Look for apache-ignite-hadoop-<version>-bin.zip in ./target/bin directory. Resulting binary
   assembly will also include integration module for Apache Spark.

   NOTE: JDK version should be 1.7.0-* or >= 1.8.0-u40.


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.

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

   3.2) Javadoc generation:

                mvn initialize -Pjavadoc

   3.3) Assembly Apache Ignite:

                mvn initialize -Prelease

   3.4) Assembly Hadoop Accelerator:

                mvn initialize -Prelease -Dignite.edition=apache-ignite-hadoop

   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 mvn 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:

        mvn 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:

        mvn 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'


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

        mvn 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

