extend _components/base.pug

block pagetitle
    title Download - Apache Ignite
    meta(name="description", content="Download Apache Ignite here and install in your environment. It’s for free – just select from one of the available options and download.")
    link(rel="canonical", href="https://ignite.apache.org/download.html")

    meta(property="og:title", content="Download - Apache Ignite")
    meta(property="og:type", content="article")
    meta(property="og:url", content="https://ignite.apache.org/download.html")
    meta(property="og:image", content="/img/og-pic.png")
    meta(property="og:description", content="Download Apache Ignite here and install in your environment. It’s for free – just select from one of the available options and download.")

block css 
    link(rel="stylesheet", href="../css/native-persistence.css?ver=" + config.version)
    link(rel="stylesheet", href="../css/download.css?ver=" + config.version)
    link(rel="stylesheet", href="../js/vendor/highlight/default.min.css?ver=" + config.version)
    link(rel="stylesheet", href="../js/vendor/highlight/night-owl.css?ver=" + config.version)
    script(src="../js/vendor/highlight/highlight.min.js")
    script(src="../js/vendor/highlight/xml.min.js")
    //- script(src="../js/vendor/highlight/bash.min.js")

block main
    - global.pageHref = "download"
    - config.hdrClassName = "hdr__blue"
    include ./_components/header.pug

    mixin downloadRow(params)
        tr 
            td !{params.ver}
            td
                if(params.guide)
                    a(href=params.guide, target="_blank") guide
                if(params.javadoc)
                    a(href=params.javadoc, target="_blank") javadoc
                if(params.scaladoc)
                    a(href=params.scaladoc, target="_blank") scaladoc
            td
                if(params.notes)
                    a(href=params.notes, target="_blank") release notes
            td !{params.date}
            td.jsLinksInside
                
                if(params.sourcelink)
                    - let fileNameArr = params.sourcelink.split("/");
                    - let fileName = fileNameArr[fileNameArr.length - 1];
                    a.sourcelink(href=params.sourcelink, target="_blank") !{fileName}
                    |  (
                    a(href=params.sourcelink + ".asc", target="_blank") pgp
                    a(href=params.sourcelink + ".sha512", target="_blank") sha512
                    | )

    mixin downloadDockerRow(params)
        tr 
            td !{params.name}
            td
                if(params.guide)
                    a(href=params.guide, target="_blank") guide
            td !{params.date}
            td
                
                if(params.links)
                    each link in params.links
                        a.sourcelink(href=link, target="_blank") !{link}<br>





    section.innerhero.innerhero--download
        .container.innerhero__cont
            .innerhero__main
                .innerhero__pre.pb-3 Apache Ignite
                h1.h1.innerhero__h1.innerhero__mega Downloads
            img.innerhero__pic.innerhero__pic--download(src="/img/downloads/hero.svg", alt="Downloads")
    // /.innerhero



    section.downloadtitle.container.pb-5
        p Download Apache Ignite® and install in your environment. <br>Select from one of the available options.

    section.cmtynavblock.jsNavBlock.cmtynavblock--downwrap
        .container
            ul.cmtynavblock__list.flexi.cmtynavblock--down
                li
                    a.cmtynavblock__active(href="#source") Source Releases
                li
                    a(href="#binary") Binary Releases
                li
                    a(href="#docker") Docker and <br>Cloud Images
                li
                    a(href="#git") Git Repository
                li
                    a(href="#extensions") Extensions
                li
                    a(href="#party3rd") 3rd Party Binaries 
    // /.cmtynavblock

    section.download-src#source.container
        h2.capstext.pb-5 SOURCE RELEASES

        include ./_components/download-source.pug
        .download-src__bottom.flexi.pt-5
            .download-src__left
                p.
                    If you are looking for an earlier version of Apache Ignite, please find it in the archive. If you encounter a problem with the selected mirror, please choose another one. If primary mirrors are not reachable, switch to backup servers added to the end of the list.
            .download-src__right 
                .download-choser.flexi 
                    .download-choser__label Selected mirror:
                    .download-choser__select.flexi
                        select(name="download_domain").jsDownloadDomenSelect
                            option(value="dlcdn.apache.org") dlcdn.apache.org
                            option(value="downloads.apache.org") downloads.apache.org
                        a.download-choser__button.download-choser__button--blue(href="#").jsChangeLink Change
    // /.download-src





    section.download-bin.container#binary
        h2.capstext BINARY RELEASES

        .download-bin__header.pt-4.pb-5
            p.
                Binary release packages are provided for your convenience and not considered as primary release artifacts of the ASF. It's recommended to verify a release downloadable, following <a href="#verification">this guidelines.</a> For more information about Apache release policy see <a href="http://www.apache.org/dev/release.html#what" target="_blank">What is a Release?</a>

        include ./_components/download-binary.pug
        // /.downtable__wrap
        p.pt-5 f you are looking for previous release versions of Apache Ignite, please have a look in the <a href="https://archive.apache.org/dist/ignite" target="_blank">archive</a>.
    // /.download-bin





    


    section.downloadslim.container 
        h3.h5.pb-2 Slim binary releases
        include ./_components/download-slim.pug
    // /.downloadslim



    section.download-docker.container#docker
        h2.capstext.pb-5 DOCKER AND CLOUD IMAGES
        include ./_components/download-docker.pug
    // /.download-docker




    section.downverify.container#verify.pt-5
        h3.h5 How to verify
        .downverify__wrap.flexi.pt-4
            .downverify__left
                p The PGP signatures can be verified using PGP or GPG. First download the <a href="https://downloads.apache.org/ignite/KEYS" target="_blank">Apache Ignite KEYS</a> file as well as the .asc signature files for the desired release version. Make sure you get these files from the main distribution directory, rather than from a mirror. Then verify the signatures.
            aside.downverify__right 
                p Please check <a href="https://www.apache.org/info/verification.html" target="_blank">How to Verify Downloaded Files</a> for more information on how and why you should verify Apache Ignite releases.
                downverify.downverify__code
                    p.pb-1 % gpg --import KEYS
                    p % gpg --verify apache-ignite-2.9.1-src.zip.asc apache-ignite-2.9.1-src.zip
    // /.downverify



    section.downfooter.container#git
        h2.capstext.pb-3 GIT REPOSITORY
        pre.nativecode__codebox.nomargin
            code.bash.
                $ git clone https://gitbox.apache.org/repos/asf/ignite
        
        .downfooter__spacer.pt-5.pb-5
        h2.capstext.pb-3#extensions EXTENSIONS

        -
            var xmlCode = `<dependency>
                <groupId>org.apache.ignite</groupId>
                <artifactId>ignite-spring-boot-autoconfigure-ext</artifactId>
                <version>1.0.0</version>
            </dependency>
            <dependency>
                <groupId>org.apache.ignite</groupId>
                <artifactId>ignite-spring-boot-thin-client-autoconfigure-ext</artifactId>
                <version>1.0.0</version>
            </dependency>`;

        pre.nativecode__codebox.nomargin
            code.xml #{xmlCode}



    section.party3rd#party3rd.container
        h2.capstext 3RD PARTY BINARIES
        .party3rd__wrap.pt-5.flexi
            .party3rd__left
                p.pb-2 This is a list of 3rd party binary packages based on Apache Ignite. The Apache Ignite project does not endorse or maintain any 3rd party binary packages.
                p <a href="https://www.gridgain.com/resources/download#communityEdition" target="_blank">GridGain Community Edition</a> is a binary build of Apache Ignite created by GridGain, which includes optional LGPL dependencies, such as Hibernate L2 cache integration and Geospatial Indexing, as well as bug fixes and features which may be included into the future official Apache Ignite releases.
            .party3rd__right
                p GridGain also provides his own <a href="http://www.gridgainsystems.com/nexus/content/repositories/external" target="_blank">GridGain Maven Repository</a> containing Apache Ignite LGPL artifacts such as ignite-hibernate.
                p Please note that artifacts located at GridGain Maven Repository provided for convenience and are NOT official Apache Ignite artifacts.
                p If you would like to provide your own edition of Apache Ignite here, please send email to <a href="mailto:dev@ignite.apache.org">Ignite dev list.</a>






