You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by pt...@apache.org on 2019/04/30 08:34:34 UTC

[ignite] branch master updated: IGNITE-11805 .NET: Add runnable .NET Core assembly, add Dockerfile (#6501)

This is an automated email from the ASF dual-hosted git repository.

ptupitsyn pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new 3963797  IGNITE-11805 .NET: Add runnable .NET Core assembly, add Dockerfile (#6501)
3963797 is described below

commit 3963797cd477b67f5886e177f4af347fe77124fc
Author: Aleksandr Shapkin <14...@users.noreply.github.com>
AuthorDate: Tue Apr 30 11:34:23 2019 +0300

    IGNITE-11805 .NET: Add runnable .NET Core assembly, add Dockerfile (#6501)
---
 docker/apache-ignite-net/Dockerfile                | 33 ++++++++++
 docker/apache-ignite-net/README.txt                | 23 +++++++
 .../platforms/dotnet/Apache.Ignite.DotNetCore.sln  |  6 ++
 .../Apache.Ignite/Apache.Ignite.DotNetCore.csproj  | 25 ++++++++
 .../dotnet/Apache.Ignite/Apache.Ignite.csproj      |  1 +
 .../platforms/dotnet/Apache.Ignite/ConsoleUtils.cs | 69 ++++++++++++++++++++
 .../dotnet/Apache.Ignite/IgniteCoreRunner.cs       | 75 ++++++++++++++++++++++
 .../platforms/dotnet/Apache.Ignite/IgniteRunner.cs | 37 +----------
 modules/platforms/dotnet/DEVNOTES.txt              |  1 +
 modules/platforms/dotnet/build.ps1                 | 29 ++++++++-
 10 files changed, 262 insertions(+), 37 deletions(-)

diff --git a/docker/apache-ignite-net/Dockerfile b/docker/apache-ignite-net/Dockerfile
new file mode 100644
index 0000000..7e354c9
--- /dev/null
+++ b/docker/apache-ignite-net/Dockerfile
@@ -0,0 +1,33 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Build runtime image
+FROM microsoft/dotnet:runtime
+
+## Workaround for apt/jre issues
+RUN mkdir -p /usr/share/man/man1
+RUN apt update && apt install apt-utils -y --no-install-recommends
+
+## Install JRE
+RUN apt update && apt install openjdk-8-jre-headless -y --no-install-recommends
+
+WORKDIR /app
+
+COPY libs ./libs
+COPY publish ./
+
+ENTRYPOINT ["dotnet", "Apache.Ignite.dll"]
diff --git a/docker/apache-ignite-net/README.txt b/docker/apache-ignite-net/README.txt
new file mode 100644
index 0000000..18dae09
--- /dev/null
+++ b/docker/apache-ignite-net/README.txt
@@ -0,0 +1,23 @@
+Apache Ignite .NET Docker module
+===========================
+Apache Ignite .NET Docker module provides Dockerfile and accompanying files for building docker image.
+
+
+Build image
+===========
+1) Build Apache Ignite.NET as described at modules/platforms/dotnet/DEVNOTES.txt
+
+2) Goto Apache Ignite's Docker module directory
+
+        cd modules/docker
+
+3) Copy Apache Ignite.NET's binaries to libs and publish folders
+
+        cp -r ../../modules/platforms/dotnet/bin/libs libs
+        cp -r ../../modules/platforms/dotnet/bin/netcoreapp2.0/publish/ publish
+
+4) Build docker image
+
+        docker build . -t apacheignite/ignite-net[:<version>]
+
+   Prepared image will be available issuing `docker images` command
diff --git a/modules/platforms/dotnet/Apache.Ignite.DotNetCore.sln b/modules/platforms/dotnet/Apache.Ignite.DotNetCore.sln
index ecd2840..3724eab 100644
--- a/modules/platforms/dotnet/Apache.Ignite.DotNetCore.sln
+++ b/modules/platforms/dotnet/Apache.Ignite.DotNetCore.sln
@@ -9,6 +9,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Apache.Ignite.Linq.DotNetCo
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Apache.Ignite.Core.Tests.DotNetCore", "Apache.Ignite.Core.Tests.DotNetCore\Apache.Ignite.Core.Tests.DotNetCore.csproj", "{700215D4-60E8-4DB2-923F-D4F4D95CBD95}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Apache.Ignite.DotNetCore", "Apache.Ignite\Apache.Ignite.DotNetCore.csproj", "{A28AA3F7-BA2B-49C2-B5DA-02707D4470B1}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -27,6 +29,10 @@ Global
 		{700215D4-60E8-4DB2-923F-D4F4D95CBD95}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{700215D4-60E8-4DB2-923F-D4F4D95CBD95}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{700215D4-60E8-4DB2-923F-D4F4D95CBD95}.Release|Any CPU.Build.0 = Release|Any CPU
+		{A28AA3F7-BA2B-49C2-B5DA-02707D4470B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A28AA3F7-BA2B-49C2-B5DA-02707D4470B1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A28AA3F7-BA2B-49C2-B5DA-02707D4470B1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A28AA3F7-BA2B-49C2-B5DA-02707D4470B1}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/modules/platforms/dotnet/Apache.Ignite/Apache.Ignite.DotNetCore.csproj b/modules/platforms/dotnet/Apache.Ignite/Apache.Ignite.DotNetCore.csproj
new file mode 100644
index 0000000..45a9196
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite/Apache.Ignite.DotNetCore.csproj
@@ -0,0 +1,25 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
+    <AssemblyName>Apache.Ignite</AssemblyName>
+    <RootNamespace>Apache.Ignite</RootNamespace>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Compile Remove="Service\**" />
+    <EmbeddedResource Remove="Service\**" />
+    <None Remove="Service\**" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Compile Remove="IgniteRunner.cs" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\Apache.Ignite.Core\Apache.Ignite.Core.DotNetCore.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/modules/platforms/dotnet/Apache.Ignite/Apache.Ignite.csproj b/modules/platforms/dotnet/Apache.Ignite/Apache.Ignite.csproj
index 3e8f83e..97bafa5 100644
--- a/modules/platforms/dotnet/Apache.Ignite/Apache.Ignite.csproj
+++ b/modules/platforms/dotnet/Apache.Ignite/Apache.Ignite.csproj
@@ -47,6 +47,7 @@
     <Compile Include="Config\ArgsConfigurator.cs" />
     <Compile Include="Config\Configurator.cs" />
     <Compile Include="Config\ConfigValueParser.cs" />
+    <Compile Include="ConsoleUtils.cs" />
     <Compile Include="IgniteRunner.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Service\IgniteService.cs">
diff --git a/modules/platforms/dotnet/Apache.Ignite/ConsoleUtils.cs b/modules/platforms/dotnet/Apache.Ignite/ConsoleUtils.cs
new file mode 100644
index 0000000..bd56a9f
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite/ConsoleUtils.cs
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite
+{
+    using System;
+
+    /// <summary>
+    /// Console utilities.
+    /// </summary>
+    internal static class ConsoleUtils
+    {
+        /// <summary>
+        /// Prints help.
+        /// </summary>
+        /// <param name="entryPoint">Application entry point.</param>
+        /// <param name="useServices">Indicates whether include service info in help or not.</param>
+        public static void PrintHelp(string entryPoint, bool useServices)
+        {
+            if (useServices)
+            {
+                Console.WriteLine("Usage: {0} [/install] [/uninstall] [-options]", entryPoint);
+                Console.WriteLine("");
+                Console.WriteLine("\t/install [-options]    installs Ignite Windows service with provided options.");
+                Console.WriteLine("\t/uninstall             uninstalls Ignite Windows service.");
+            }
+            else
+            {
+                Console.WriteLine("Usage: {0}  [-options]", entryPoint);
+            }
+            Console.WriteLine("");
+            Console.WriteLine("Options:");
+            Console.WriteLine("\t-IgniteHome            path to Ignite installation directory (if not provided IGNITE_HOME environment variable is used).");
+            Console.WriteLine("\t-ConfigSectionName     name of the IgniteConfigurationSection in app.config to use.");
+            Console.WriteLine("\t-ConfigFileName        path to the app.config file (if not provided Apache.Ignite.exe.config is used).");
+            Console.WriteLine("\t-springConfigUrl       path to Spring configuration file.");
+            Console.WriteLine("\t-jvmDll                path to JVM library jvm.dll (if not provided JAVA_HOME environment variable is used).");
+            Console.WriteLine("\t-jvmClasspath          classpath passed to JVM (enlist additional jar files here).");
+            Console.WriteLine("\t-suppressWarnings      whether to print warnings.");
+            Console.WriteLine("\t-J<javaOption>         JVM options passed to created JVM.");
+            Console.WriteLine("\t-assembly=userLib.dll  additional .NET assemblies to be loaded.");
+            Console.WriteLine("\t-jvmInitialMemoryMB    Initial Java heap size, in megabytes. Maps to -Xms Java parameter. Defaults to 512.");
+            Console.WriteLine("\t-jvmMaxMemoryMB        Maximum Java heap size, in megabytes. Maps to -Xmx Java parameter. Defaults to 1024.");
+            Console.WriteLine("");
+            Console.WriteLine("Examples:");
+            Console.WriteLine("\t{0} -J-Xms1024m -J-Xmx1024m -springConfigUrl=C:/woer/gg-test/my-test-gg-confignative.xml", entryPoint);
+            Console.WriteLine("\t{0} -IgniteHome=c:/apache-ignite -jvmClasspath=libs/myLib1.jar;libs/myLib2.jar", entryPoint);
+            Console.WriteLine("\t{0} -assembly=c:/myProject/libs/lib1.dll -assembly=c:/myProject/libs/lib2.dll", entryPoint);
+            Console.WriteLine("\t{0} -jvmInitialMemoryMB=1024 -jvmMaxMemoryMB=4096", entryPoint);
+            Console.WriteLine("");
+            Console.WriteLine("Note:");
+            Console.WriteLine("Command line settings have priority over Apache.Ignite.exe.config settings. JVM options and assemblies are concatenated; data from config file comes first, then data from command line.");
+        }
+    }
+}
diff --git a/modules/platforms/dotnet/Apache.Ignite/IgniteCoreRunner.cs b/modules/platforms/dotnet/Apache.Ignite/IgniteCoreRunner.cs
new file mode 100644
index 0000000..f1f9bd4
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite/IgniteCoreRunner.cs
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite
+{
+    using System;
+    using System.Collections.Generic;
+    using System.Configuration;
+    using System.Linq;
+    using System.Threading;
+    using Apache.Ignite.Config;
+    using Apache.Ignite.Core;
+
+    /// <summary>
+    /// Runner class.
+    /// </summary>
+    public static class IgniteCoreRunner
+    {
+        /** Help commands. */
+        private static readonly IList<string> Help = new List<string> { "/help", "-help", "--help" };
+
+        /// <summary>
+        /// Application entry point.
+        /// </summary>
+        internal static void Main(string[] args)
+        {
+            try
+            {
+                // Check for special cases.
+                if (args.Length > 0)
+                {
+                    string first = args[0].ToLowerInvariant();
+
+                    if (Help.Contains(first))
+                    {
+                        ConsoleUtils.PrintHelp("Apache.Ignite.dll", false);
+
+                        return;
+                    }
+                }
+
+                // Pick application configuration first, command line arguments second.
+                var allArgs = AppSettingsConfigurator.GetArgs(ConfigurationManager.AppSettings)
+                    .Concat(ArgsConfigurator.GetArgs(args)).ToArray();
+
+                var ignite = Ignition.Start(Configurator.GetConfiguration(allArgs));
+
+                // Wait until stopped.
+                var evt = new ManualResetEventSlim(false);
+                ignite.Stopped += (s, a) => evt.Set();
+                evt.Wait();
+            }
+            catch (Exception e)
+            {
+                Console.WriteLine("ERROR: " + e);
+
+                Environment.Exit(-1);
+            }
+        }
+    }
+}
diff --git a/modules/platforms/dotnet/Apache.Ignite/IgniteRunner.cs b/modules/platforms/dotnet/Apache.Ignite/IgniteRunner.cs
index 8924591..c88494a 100644
--- a/modules/platforms/dotnet/Apache.Ignite/IgniteRunner.cs
+++ b/modules/platforms/dotnet/Apache.Ignite/IgniteRunner.cs
@@ -30,7 +30,7 @@ namespace Apache.Ignite
     /// <summary>
     /// Runner class.
     /// </summary>
-    public class IgniteRunner
+    public static class IgniteRunner
     {
         /** Help commands. */
         private static readonly IList<string> Help = new List<string> { "/help", "-help", "--help" };
@@ -61,7 +61,7 @@ namespace Apache.Ignite
 
                     if (Help.Contains(first))
                     {
-                        PrintHelp();
+                        ConsoleUtils.PrintHelp("Apache.Ignite.exe", true);
 
                         return;
                     }
@@ -123,39 +123,6 @@ namespace Apache.Ignite
         }
 
         /// <summary>
-        /// Prints help.
-        /// </summary>
-        private static void PrintHelp()
-        {
-            Console.WriteLine("Usage: Apache.Ignite.exe [/install] [/uninstall] [-options]");
-            Console.WriteLine("");
-            Console.WriteLine("\t/install [-options]    installs Ignite Windows service with provided options.");
-            Console.WriteLine("\t/uninstall             uninstalls Ignite Windows service.");
-            Console.WriteLine("");
-            Console.WriteLine("Options:");
-            Console.WriteLine("\t-IgniteHome            path to Ignite installation directory (if not provided IGNITE_HOME environment variable is used).");
-            Console.WriteLine("\t-ConfigSectionName     name of the IgniteConfigurationSection in app.config to use.");
-            Console.WriteLine("\t-ConfigFileName        path to the app.config file (if not provided Apache.Ignite.exe.config is used).");
-            Console.WriteLine("\t-springConfigUrl       path to Spring configuration file.");
-            Console.WriteLine("\t-jvmDll                path to JVM library jvm.dll (if not provided JAVA_HOME environment variable is used).");
-            Console.WriteLine("\t-jvmClasspath          classpath passed to JVM (enlist additional jar files here).");
-            Console.WriteLine("\t-suppressWarnings      whether to print warnings.");
-            Console.WriteLine("\t-J<javaOption>         JVM options passed to created JVM.");
-            Console.WriteLine("\t-assembly=userLib.dll  additional .NET assemblies to be loaded.");
-            Console.WriteLine("\t-jvmInitialMemoryMB    Initial Java heap size, in megabytes. Maps to -Xms Java parameter. Defaults to 512.");
-            Console.WriteLine("\t-jvmMaxMemoryMB        Maximum Java heap size, in megabytes. Maps to -Xmx Java parameter. Defaults to 1024.");
-            Console.WriteLine("");
-            Console.WriteLine("Examples:");
-            Console.WriteLine("\tApache.Ignite.exe -J-Xms1024m -J-Xmx1024m -springConfigUrl=C:/woer/gg-test/my-test-gg-confignative.xml");
-            Console.WriteLine("\tApache.Ignite.exe -IgniteHome=c:/apache-ignite -jvmClasspath=libs/myLib1.jar;libs/myLib2.jar");
-            Console.WriteLine("\tApache.Ignite.exe -assembly=c:/myProject/libs/lib1.dll -assembly=c:/myProject/libs/lib2.dll");
-            Console.WriteLine("\tApache.Ignite.exe -jvmInitialMemoryMB=1024 -jvmMaxMemoryMB=4096");
-            Console.WriteLine("");
-            Console.WriteLine("Note:");
-            Console.WriteLine("Command line settings have priority over Apache.Ignite.exe.config settings. JVM options and assemblies are concatenated; data from config file comes first, then data from command line.");
-        }
-
-        /// <summary>
         /// Remove the first argument.
         /// </summary>
         /// <param name="args">Arguments.</param>
diff --git a/modules/platforms/dotnet/DEVNOTES.txt b/modules/platforms/dotnet/DEVNOTES.txt
index 199fe90..189f04e 100644
--- a/modules/platforms/dotnet/DEVNOTES.txt
+++ b/modules/platforms/dotnet/DEVNOTES.txt
@@ -5,6 +5,7 @@ Requirements:
 * Windows (XP and up), Windows Server (2008 and up)
 * Oracle JDK 8 and above
 * .NET Framework 4.0
+* .NET Core 2.0+
 * PowerShell 3.0+
 * Visual Studio 2010+
 * JAVA_HOME environment variable set to the corresponding JDK (x64 or x86)
diff --git a/modules/platforms/dotnet/build.ps1 b/modules/platforms/dotnet/build.ps1
index 59918b5..4db0031 100644
--- a/modules/platforms/dotnet/build.ps1
+++ b/modules/platforms/dotnet/build.ps1
@@ -36,6 +36,9 @@ Skip Java build.
 .PARAMETER skipDotNet
 Skip .NET build.
 
+.PARAMETER skipDotNetCore
+Skip .NET Core build.
+
 .PARAMETER skipNuGet
 Skip NuGet packaging.
 
@@ -79,6 +82,7 @@ NuGet version override (normally inferred from assembly version).
 param (
     [switch]$skipJava,
 	[switch]$skipDotNet,
+    [switch]$skipDotNetCore,
     [switch]$skipNuGet,
     [switch]$skipCodeAnalysis,  
     [switch]$clean,
@@ -193,7 +197,7 @@ if (!$skipDotNet) {
 	$codeAnalysis = if ($skipCodeAnalysis) {"/p:RunCodeAnalysis=false"} else {""}
 	$msBuildCommand = "`"$msBuildExe`" Apache.Ignite.sln /target:$targets /p:Configuration=$configuration /p:Platform=`"$platform`" $codeAnalysis /p:UseSharedCompilation=false"
 	echo "Starting MsBuild: '$msBuildCommand'"
-	cmd /c $msBuildCommand
+	cmd /c $msBuildCommand   
 
 	# Check result
 	if ($LastExitCode -ne 0) {
@@ -202,6 +206,27 @@ if (!$skipDotNet) {
 	}
 }
 
+if(!$skipDotNetCore) {
+    
+    # Build core
+    $targetSolution =  ".\Apache.Ignite\Apache.Ignite.DotNetCore.csproj"
+    if ($clean) {
+        $cleanCommand = "dotnet clean $targetSolution -c $configuration"
+        echo "Starting dotnet clean: '$cleanCommand'"
+        cmd /c $cleanCommand
+    }
+
+    $publishCommand = "dotnet publish $targetSolution -c $configuration"
+	echo "Starting dotnet publish: '$publishCommand'"
+	cmd /c $publishCommand    
+
+    # Check result
+    if ($LastExitCode -ne 0) {
+        echo ".NET Core build failed."
+        exit -1
+    }
+}
+
 if ($asmDirs) {
     ls $asmDirs.Split(',') | % `
     {
@@ -221,7 +246,7 @@ if ($asmDirs) {
 }
 
 # Copy binaries
-mkdir -Force bin; del -Force bin\*.*
+mkdir -Force bin; del -Force -Recurse bin\*.*
 
 ls *.csproj -Recurse | where Name -NotLike "*Examples*" `
                      | where Name -NotLike "*Tests*" `