This is an automated email from the ASF dual-hosted git repository. amashenkov pushed a commit to branch gg-18540 in repository https://gitbox.apache.org/repos/asf/ignite.git
commit 98aec2d069d3b5a8e52ba7a0c39268fa2b813cdf Author: Aleksandr Shapkin <[email protected]> AuthorDate: Tue Apr 30 11:34:23 2019 +0300 GG-17383 [IGNITE-11805] .NET: Add runnable .NET Core assembly, add Dockerfile (#6501) (cherry picked from commit 3963797cd477b67f5886e177f4af347fe77124fc) (cherry picked from commit aeb631ab53add1dec1d22d8f82345c8f70f244c6) --- docker/apache-ignite-net/Dockerfile | 32 ++++++++++ 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 | 68 ++++++++++++++++++++ .../dotnet/Apache.Ignite/IgniteCoreRunner.cs | 74 ++++++++++++++++++++++ .../platforms/dotnet/Apache.Ignite/IgniteRunner.cs | 37 +---------- modules/platforms/dotnet/DEVNOTES.txt | 1 + modules/platforms/dotnet/build.ps1 | 29 ++++++++- 10 files changed, 259 insertions(+), 37 deletions(-) diff --git a/docker/apache-ignite-net/Dockerfile b/docker/apache-ignite-net/Dockerfile new file mode 100644 index 0000000..3381b61 --- /dev/null +++ b/docker/apache-ignite-net/Dockerfile @@ -0,0 +1,32 @@ +# +# Copyright 2019 GridGain Systems, Inc. and Contributors. +# +# Licensed under the GridGain Community Edition License (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.gridgain.com/products/software/community-edition/gridgain-community-edition-license +# +# 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..117f17a --- /dev/null +++ b/modules/platforms/dotnet/Apache.Ignite/ConsoleUtils.cs @@ -0,0 +1,68 @@ +/* + * Copyright 2019 GridGain Systems, Inc. and Contributors. + * + * Licensed under the GridGain Community Edition License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.gridgain.com/products/software/community-edition/gridgain-community-edition-license + * + * 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..1622cce --- /dev/null +++ b/modules/platforms/dotnet/Apache.Ignite/IgniteCoreRunner.cs @@ -0,0 +1,74 @@ +/* + * Copyright 2019 GridGain Systems, Inc. and Contributors. + * + * Licensed under the GridGain Community Edition License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.gridgain.com/products/software/community-edition/gridgain-community-edition-license + * + * 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 808d393..422a373 100644 --- a/modules/platforms/dotnet/Apache.Ignite/IgniteRunner.cs +++ b/modules/platforms/dotnet/Apache.Ignite/IgniteRunner.cs @@ -29,7 +29,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" }; @@ -60,7 +60,7 @@ namespace Apache.Ignite if (Help.Contains(first)) { - PrintHelp(); + ConsoleUtils.PrintHelp("Apache.Ignite.exe", true); return; } @@ -122,39 +122,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 415087f..6677c1e 100644 --- a/modules/platforms/dotnet/build.ps1 +++ b/modules/platforms/dotnet/build.ps1 @@ -33,6 +33,9 @@ Skip Java build. .PARAMETER skipDotNet Skip .NET build. +.PARAMETER skipDotNetCore +Skip .NET Core build. + .PARAMETER skipNuGet Skip NuGet packaging. @@ -76,6 +79,7 @@ NuGet version override (normally inferred from assembly version). param ( [switch]$skipJava, [switch]$skipDotNet, + [switch]$skipDotNetCore, [switch]$skipNuGet, [switch]$skipCodeAnalysis, [switch]$clean, @@ -190,7 +194,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) { @@ -199,6 +203,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(',') | % ` { @@ -218,7 +243,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*" `
