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) Build Apache Ignite assembly:

        mvn initialize -Prelease

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

5) Build Apache Ignite slim edition assembly:

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

        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) Build Apache Ignite assembly 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 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

   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

