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>

    
    .cgi(hidden).
        <!-- Update the following template variables for every release -->
        [define distdir]ignite[end]
        [define disturl]https://www.apache.org/dist[end]



    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
                include _components/download-select.html
    // /.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>






