From 6302e681c1fbe6e4982192bbec07d31ea8ef37ce Mon Sep 17 00:00:00 2001 From: Wael Hamze Date: Mon, 28 Jan 2019 08:51:44 +0000 Subject: [PATCH] Fix issues with packing solutions --- .../Logging/TestLogger.cs | 2 +- .../SolutionPackagerTest.cs | 14 ++-- .../SolutionManagement/SolutionPackager.cs | 8 +++ .../SolutionPackagerManager.cs | 69 +++++++++++++++++-- .../SolutionManagement/SolutionXml.cs | 23 +++++++ .../CompressXrmSolutionUsingConfig.cs | 4 +- .../PackSolutionsUsingConfig.ps1 | 3 +- 7 files changed, 107 insertions(+), 16 deletions(-) diff --git a/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.Common.IntegrationTests/Logging/TestLogger.cs b/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.Common.IntegrationTests/Logging/TestLogger.cs index a995e8f9..3b451057 100644 --- a/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.Common.IntegrationTests/Logging/TestLogger.cs +++ b/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.Common.IntegrationTests/Logging/TestLogger.cs @@ -51,7 +51,7 @@ public void LogVerbose(string format, params object[] args) string msg = PrefixMsg("Verbose: ", format); if (args.Length != 0) { - Debug.WriteLine(format, msg); + Debug.WriteLine(msg, args); } else { diff --git a/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.Common.IntegrationTests/SolutionPackagerTest.cs b/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.Common.IntegrationTests/SolutionPackagerTest.cs index 8ae1a6a1..bbedc510 100644 --- a/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.Common.IntegrationTests/SolutionPackagerTest.cs +++ b/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.Common.IntegrationTests/SolutionPackagerTest.cs @@ -93,12 +93,14 @@ public void TestPackSolutions() SolutionPackConfig config = new SolutionPackConfig(); config.Solutions.Add(new SolutionPackOptions() - { - Folder = folder, - MappingFile = mapping, - IncludeVersionInName = true, - PackageType = SolutionPackager_PackageType.Both, - TreamWarningsAsErrors = false, + { + Folder = folder, + MappingFile = mapping, + IncludeVersionInName = true, + PackageType = SolutionPackager_PackageType.Both, + TreamWarningsAsErrors = false, + IncrementReleaseVersion = true, + Version = string.Empty } ); diff --git a/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.Common/SolutionManagement/SolutionPackager.cs b/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.Common/SolutionManagement/SolutionPackager.cs index c8932fc7..8adab008 100644 --- a/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.Common/SolutionManagement/SolutionPackager.cs +++ b/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.Common/SolutionManagement/SolutionPackager.cs @@ -128,6 +128,8 @@ bool treatWarningsAsErrors { StringBuilder arguments = new StringBuilder(); + Logger.LogVerbose("Generating Solution Packager Arguments"); + arguments.Append($" /action:{action.ToString()}"); arguments.Append($" /zipFile:\"{ZipFile}\""); arguments.Append($" /folder:\"{Folder}\""); @@ -183,6 +185,8 @@ bool treatWarningsAsErrors arguments.Append($" /localize"); } + Logger.LogVerbose("Solution Packager Arguments: {0}", arguments.ToString()); + ProcessStartInfo packagerInfo = new ProcessStartInfo() { FileName = Packager, @@ -202,6 +206,8 @@ bool treatWarningsAsErrors packagerProcess.OutputDataReceived += PackagerProcess_OutputDataReceived; packagerProcess.ErrorDataReceived += PackagerProcess_ErrorDataReceived; + Logger.LogVerbose("Invoking SolutionPackager: {0}", Packager); + bool start = packagerProcess.Start(); packagerProcess.BeginOutputReadLine(); packagerProcess.BeginErrorReadLine(); @@ -209,6 +215,8 @@ bool treatWarningsAsErrors packagerProcess.WaitForExit(1000*60*15); //15 minutes exitCode = packagerProcess.ExitCode; + + Logger.LogVerbose("SolutionPackager exit code@ {0}", exitCode); } if (exitCode != 0) diff --git a/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.Common/SolutionManagement/SolutionPackagerManager.cs b/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.Common/SolutionManagement/SolutionPackagerManager.cs index e33ffb1c..902daae7 100644 --- a/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.Common/SolutionManagement/SolutionPackagerManager.cs +++ b/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.Common/SolutionManagement/SolutionPackagerManager.cs @@ -1,9 +1,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using Xrm.Framework.CI.Common.Logging; namespace Xrm.Framework.CI.Common @@ -24,11 +21,14 @@ public SolutionPackagerManager( public bool PackSolution( string solutionPackager, + string outputFolder, string folder, SolutionPackager_PackageType packageType, bool includeVersionInName, string mappingFile, bool treatWarningsAsErrors, + bool incrementReleaseVersion, + string version, string logsDirectory ) { @@ -42,6 +42,32 @@ string logsDirectory throw new Exception("Invalid solution file"); } + Logger.LogInformation("Packing Solution Name: {0} - Version {1}", info.UniqueName, info.Version); + + string newVersion; + + if (incrementReleaseVersion) + { + Logger.LogVerbose("Incrementing release version"); + + int release = Int32.Parse(info.Version.Substring(info.Version.LastIndexOf(".") + 1)); + newVersion = $"{info.Version.Substring(0, info.Version.LastIndexOf(".") + 1)}{release + 1}"; + + solutionXml.UpdateSolutionVersion(folder, newVersion); + } + else if (!string.IsNullOrEmpty(version)) + { + Logger.LogInformation("Updating solution version to {0}", version); + + solutionXml.UpdateSolutionVersion(folder, version); + + newVersion = version; + } + else + { + newVersion = info.Version; + } + SolutionNameGenerator generator = new SolutionNameGenerator(); string zipFile; @@ -51,7 +77,7 @@ string logsDirectory { zipFile = generator.GetZipName( info.UniqueName, - info.Version, + newVersion, managed); } else @@ -61,13 +87,18 @@ string logsDirectory string.Empty, managed); } + string zipFilePath = $"{outputFolder}\\{zipFile}"; - string log = $"PackagerLog_{zipFile.Replace(".zip", "")}_{DateTime.Now.ToString("yyyy_MM_dd__HH_mm")}.txt"; + Logger.LogVerbose("zipFile: {0}", zipFilePath); + + string log = $"{logsDirectory}\\PackagerLog_{zipFile.Replace(".zip", "")}_{DateTime.Now.ToString("yyyy_MM_dd__HH_mm")}.txt"; + + Logger.LogVerbose("log: {0}", log); SolutionPackager packager = new SolutionPackager( Logger, solutionPackager, - zipFile, + zipFilePath, folder, log ); @@ -84,6 +115,26 @@ public List PackSolutions( string configFilePath, string logsDirectory) { + if (!File.Exists(solutionPackager)) + { + throw new Exception(string.Format("SolutionPackager.exe file couldn't be found at {0}", solutionPackager)); + } + + if (!Directory.Exists(outputFolder)) + { + throw new Exception(string.Format("outputFolder couldn't be found at {0}", outputFolder)); + } + + if (!File.Exists(configFilePath)) + { + throw new Exception(string.Format("Config file couldn't be found at {0}", configFilePath)); + } + + if (!Directory.Exists(logsDirectory)) + { + throw new Exception(string.Format("logsDirectory couldn't be found at {0}", logsDirectory)); + } + SolutionPackConfig config = Serializers.ParseJson(configFilePath); @@ -98,11 +149,14 @@ public List PackSolutions( bool result = PackSolution( solutionPackager, + outputFolder, folder, option.PackageType, option.IncludeVersionInName, mapping, option.TreamWarningsAsErrors, + option.IncrementReleaseVersion, + option.Version, logsDirectory ); @@ -114,6 +168,8 @@ public List PackSolutions( } } + Logger.LogInformation("{0} solutions processed out of {1}", results.Count, config.Solutions.Count); + return results; } } @@ -127,6 +183,7 @@ public class SolutionPackOptions public SolutionPackager_PackageType PackageType { get; set; } public bool IncludeVersionInName { get; set; } public bool TreamWarningsAsErrors { get; set; } + public bool IncrementReleaseVersion { get; set; } public string Version { get; set; } #endregion diff --git a/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.Common/SolutionManagement/SolutionXml.cs b/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.Common/SolutionManagement/SolutionXml.cs index 7573d482..a7a7db80 100644 --- a/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.Common/SolutionManagement/SolutionXml.cs +++ b/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.Common/SolutionManagement/SolutionXml.cs @@ -65,6 +65,29 @@ public XrmSolutionInfo GetXrmSolutionInfoFromFolder( } } + public void UpdateSolutionVersion(string folder, string version) + { + string solutionFile = folder + "\\Other\\Solution.xml"; + + Logger.LogVerbose("Reading Solution File: {0}", solutionFile); + + XElement solutionNode; + + using (var reader = new StreamReader(solutionFile)) + { + solutionNode = XElement.Load(reader); + string uniqueName = solutionNode.Descendants("UniqueName").First().Value; + + Logger.LogVerbose(string.Format("Updating Version for Solution: {0}", uniqueName)); + + solutionNode.Descendants("Version").First().Value = version; + } + + solutionNode.Save(solutionFile); + + Logger.LogInformation("Version Updated to: {0}", version); + } + private XrmSolutionInfo GetXrmSolutionInfoFromStream(StreamReader reader) { XrmSolutionInfo info = null; diff --git a/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.PowerShell.Cmdlets/CompressXrmSolutionUsingConfig.cs b/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.PowerShell.Cmdlets/CompressXrmSolutionUsingConfig.cs index 70b3363b..7c07da78 100644 --- a/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.PowerShell.Cmdlets/CompressXrmSolutionUsingConfig.cs +++ b/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.PowerShell.Cmdlets/CompressXrmSolutionUsingConfig.cs @@ -15,7 +15,7 @@ namespace Xrm.Framework.CI.PowerShell.Cmdlets /// C:\PS>Export-XrmSolution -ConnectionString "" -EntityName "account" /// Exports the "" managed solution to "" location /// - [Cmdlet(VerbsData.Compress, "XrmSolution")] + [Cmdlet(VerbsData.Compress, "XrmSolutions")] [OutputType(typeof(WhoAmIResponse))] public class CompressXrmSolutionUsingConfig : CommandBase { @@ -57,7 +57,7 @@ protected override void ProcessRecord() SolutionPackagerManager packagerManager = new SolutionPackagerManager(Logger); - List results = packagerManager.PackSolutions(SolutionPackagerPath, LogsDirectory, ConfigFilePath, LogsDirectory); + List results = packagerManager.PackSolutions(SolutionPackagerPath, OutputFolder, ConfigFilePath, LogsDirectory); if (results.Contains(false)) { diff --git a/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.PowerShell.Scripts/PackSolutionsUsingConfig.ps1 b/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.PowerShell.Scripts/PackSolutionsUsingConfig.ps1 index 5156cbfc..92443b60 100644 --- a/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.PowerShell.Scripts/PackSolutionsUsingConfig.ps1 +++ b/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.PowerShell.Scripts/PackSolutionsUsingConfig.ps1 @@ -6,10 +6,11 @@ param( [string]$solutionPackagerPath, #Path to solutionpackager.exe [string]$OutputFolder, [string]$ConfigFilePath, -[int]$LogsDirectory +[string]$LogsDirectory ) $ErrorActionPreference = "Stop" +$InformationPreference = "Continue" Write-Verbose 'Entering PackSolutionsUsingConfig.ps1'