Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat!: parallel solution merges #91

Draft
wants to merge 32 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
04ebdb5
chore: platform schema update to site map files
ewingjm Aug 19, 2021
7dcabae
feat!: parallel merges (CI platform agnostic)
ewingjm Aug 19, 2021
f7030fb
refactor: separate flow to delete old solutions
ewingjm Aug 19, 2021
b37ddbf
refactor: move Awaiting PR Merge status to Develop
ewingjm Aug 19, 2021
eb69f8c
feat: set dependent apps templates on a solution
ewingjm Aug 20, 2021
37cf44f
fix: add URL parameter to mark as ready action
ewingjm Aug 21, 2021
80bc302
refactor: move approve changes button to develop
ewingjm Aug 26, 2021
e93eb89
fix: reverted status codes
ewingjm Aug 26, 2021
285c025
feat: parallel solution merges (Azure DevOps)
ewingjm Aug 26, 2021
9b0a4b9
refactor: use existing connection reference
ewingjm Aug 26, 2021
c1f114e
fix: attempting to delete static environments
ewingjm Sep 6, 2021
7464de0
fix: hide solution version by default
ewingjm Sep 7, 2021
9c6aa35
fix: use new pipeline API to allow for parameters
ewingjm Sep 7, 2021
c362d06
refactor: delete outdated sample files
ewingjm Sep 7, 2021
6fef9cf
ci: configure GitVersion for conventional commits
ewingjm Sep 7, 2021
fde1ec5
fix: allow solution merge updates when not merging
ewingjm Sep 13, 2021
18b709c
fix: remove key on environment URL
ewingjm Sep 13, 2021
5ef91c6
refactor: move provision pipeline to solution
ewingjm Jan 16, 2022
584d8b5
chore: ImportExportXml version updates
ewingjm Feb 16, 2022
d17ca6b
fix: App Templates shown for sequential solutions
ewingjm Feb 17, 2022
c89daa5
fix: failure merging sequential solution merges
ewingjm Feb 17, 2022
bab0dd0
fix: migrate existing lifetimes/merge strategies
ewingjm Feb 17, 2022
bb23cd6
refactor: update flow formatting
ewingjm Jun 19, 2022
6aaeccf
fix: sequential solution merges not merged
ewingjm Jun 19, 2022
01d779d
refactor: flow formatting
ewingjm Jun 19, 2022
ca24ef0
fix: solution version not set on sequential merges
ewingjm Jun 19, 2022
902e34a
refactor: delete duplicate flow step
ewingjm Jun 19, 2022
ea35280
fix: existing records not migrated to new config
ewingjm Jun 19, 2022
527569f
chore: increment solution versions
ewingjm Jul 11, 2022
0d92309
fix: null reference exception during import
ewingjm Jul 11, 2022
a70d43a
feat: pass more user details to merge pipeline
ewingjm Jul 14, 2022
fc7dcab
feat: installer script
ewingjm Jul 22, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions GitVersion.yml
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
mode: mainline
major-version-bump-message: "(build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test)(\\([\\w\\s]*\\))?(!:|:.*\\n\\n.*\\n\\n.*BREAKING.*).*"
minor-version-bump-message: "(feat)(\\([\\w\\s]*\\))?:"
patch-version-bump-message: "(build|chore|ci|docs|fix|perf|refactor|revert|style|test)(\\([\\w\\s]*\\))?:(.*\\n\\n.*\\n\\n.*BREAKING.*){0}"
39 changes: 11 additions & 28 deletions deploy/DevelopmentHub.Deployment.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -27,47 +27,30 @@
<Copy DestinationFolder="$(OutputPath)PkgFolder" SourceFiles="@(SolutionsToPack)" />
</Target>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="3.0.0">
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="3.3.2">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.CodeAnalysis.VersionCheckAnalyzer" Version="3.0.0">
<PackageReference Include="Microsoft.CodeAnalysis.VersionCheckAnalyzer" Version="3.3.2">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.CodeQuality.Analyzers" Version="3.0.0">
<PackageReference Include="Microsoft.CodeQuality.Analyzers" Version="3.3.2">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.CrmSdk.CoreAssemblies" Version="9.0.2.29">
<PackageReference Include="Microsoft.CrmSdk.CoreAssemblies" Version="9.0.2.42"/>
<PackageReference Include="Microsoft.CrmSdk.Deployment" Version="9.0.2.34"/>
<PackageReference Include="Microsoft.CrmSdk.Workflow" Version="9.0.2.42"/>
<PackageReference Include="Microsoft.CrmSdk.XrmTooling.CoreAssembly" Version="9.1.0.92"/>
<PackageReference Include="Microsoft.CrmSdk.XrmTooling.PackageDeployment" Version="9.1.0.90"/>
<PackageReference Include="Microsoft.NetCore.Analyzers" Version="3.3.2">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.CrmSdk.Deployment" Version="9.0.2.29">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.CrmSdk.Workflow" Version="9.0.2.28">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.CrmSdk.XrmTooling.CoreAssembly" Version="9.1.0.68">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.CrmSdk.XrmTooling.PackageDeployment" Version="9.1.0.46">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.IdentityModel.Clients.ActiveDirectory" Version="3.19.8">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.NetCore.Analyzers" Version="3.0.0">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.NetFramework.Analyzers" Version="3.0.0">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.Rest.ClientRuntime" Version="2.3.20" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3">
<PackageReference Include="Microsoft.NetFramework.Analyzers" Version="3.3.2">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="StyleCop.Analyzers" Version="1.1.118">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Capgemini.PowerApps.PackageDeployerTemplate" Version="0.2.4" />
<PackageReference Include="Capgemini.PowerApps.PackageDeployerTemplate" Version="0.3.19" />
</ItemGroup>
<ItemGroup>
<Reference Include="PresentationFramework" />
Expand Down
122 changes: 105 additions & 17 deletions deploy/PackageTemplate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@ namespace DevelopmentHub.Deployment
{
using System;
using System.ComponentModel.Composition;
using System.Diagnostics;
using System.ServiceModel;
using Capgemini.PowerApps.PackageDeployerTemplate;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Tooling.PackageDeployment.CrmPackageExtentionBase;

/// <summary>
Expand All @@ -15,7 +19,6 @@ public class PackageTemplate : PackageTemplateBase
private string azureDevOpsOrganisation;
private string solutionPublisherPrefix;
private string azureDevOpsConnectionName;
private string approvalsConnectionName;
private EnvironmentVariableDeploymentService environmentVariableDeploymentSvc;

/// <inheritdoc/>
Expand Down Expand Up @@ -91,22 +94,6 @@ protected string AzureDevOpsConnectionName
}
}

/// <summary>
/// Gets a value for the approvals connection name used for the Development Hub (if found).
/// </summary>
protected string ApprovalsConnectionName
{
get
{
if (string.IsNullOrEmpty(this.approvalsConnectionName))
{
this.approvalsConnectionName = this.GetSetting<string>(nameof(this.ApprovalsConnectionName));
}

return this.approvalsConnectionName;
}
}

/// <summary>
/// Gets an <see cref="EnvironmentVariableDeploymentSvc"/>.
/// </summary>
Expand All @@ -131,6 +118,33 @@ public override bool AfterPrimaryImport()
return base.AfterPrimaryImport();
}

/// <inheritdoc/>
public override void RunSolutionUpgradeMigrationStep(string solutionName, string oldVersion, string newVersion, Guid oldSolutionId, Guid newSolutionId)
{
if (string.IsNullOrEmpty(solutionName))
{
throw new ArgumentException($"'{nameof(solutionName)}' cannot be null or empty", nameof(solutionName));
}

if (string.IsNullOrEmpty(oldVersion))
{
throw new ArgumentException($"'{nameof(oldVersion)}' cannot be null or empty", nameof(oldVersion));
}

if (string.IsNullOrEmpty(newVersion))
{
throw new ArgumentException($"'{nameof(newVersion)}' cannot be null or empty", nameof(newVersion));
}

base.RunSolutionUpgradeMigrationStep(solutionName, oldVersion, newVersion, oldSolutionId, newSolutionId);

if (solutionName == "devhub_DevelopmentHub_Develop" && oldVersion.StartsWith("0.2", StringComparison.OrdinalIgnoreCase))
{
this.DefaultEnvironmentLifetimes();
this.DefaultMergeStrategies();
}
}

/// <inheritdoc/>
public override string GetNameOfImport(bool plural) => "Development Hub";

Expand All @@ -145,6 +159,80 @@ public override UserRequestedImportAction OverrideSolutionImportDecision(string
return base.OverrideSolutionImportDecision(solutionUniqueName, organizationVersion, packageSolutionVersion, inboundSolutionVersion, deployedSolutionVersion, systemSelectedImportAction);
}

private void DefaultEnvironmentLifetimes()
{
this.PackageLog.Log("Default existing environment lifetimes to 'Static'.");

var environmentQuery = new QueryByAttribute("devhub_environment");
environmentQuery.AddAttributeValue("devhub_lifetime", null);

var environments = this.CrmServiceAdapter.RetrieveMultiple(environmentQuery);
this.PackageLog.Log($"Found {environments.Entities.Count} environments to update.");

foreach (var environment in environments.Entities)
{
this.PackageLog.Log($"Updating environment {environment.Id}.");

environment.Attributes.Add("devhub_lifetime", new OptionSetValue(353400000) /*Static*/);
try
{
this.CrmSvc.Update(environment);
}
catch (FaultException<OrganizationServiceFault> ex)
{
this.PackageLog.Log($"Failed to update environment {environment.Id}.", TraceEventType.Error, ex);
}
}
}

private void DefaultMergeStrategies()
{
this.PackageLog.Log("Default existing solutions to a merge strategy of 'Sequential'.");

var solutionQuery = new QueryByAttribute("devhub_solution");
solutionQuery.AddAttributeValue("devhub_mergestrategy", null);
solutionQuery.ColumnSet = new ColumnSet("devhub_stagingenvironment");

var solutions = this.CrmServiceAdapter.RetrieveMultiple(solutionQuery);
this.PackageLog.Log($"Found {solutions.Entities.Count} solutions to update.");

foreach (var solution in solutions.Entities)
{
this.PackageLog.Log($"Updating solution {solution.Id}.");
solution.Attributes.Add("devhub_mergestrategy", new OptionSetValue(353400000) /*Sequential*/);

try
{
this.CrmSvc.Update(solution);
}
catch (FaultException<OrganizationServiceFault> ex)
{
this.PackageLog.Log($"Failed to update solution {solution.Id}.", TraceEventType.Error, ex);
}

this.PackageLog.Log("Getting solution merges for solution.");

var solutionMergeQuery = new QueryByAttribute("devhub_solutionmerge");
solutionMergeQuery.AddAttributeValue("devhub_targetsolution", solution.Id);
var solutionMerges = this.CrmServiceAdapter.RetrieveMultiple(solutionMergeQuery);

foreach (var solutionMerge in solutionMerges.Entities)
{
solutionMerge.Attributes.Add("devhub_environment", solution["devhub_stagingenvironment"]);
solutionMerge.Attributes.Add("devhub_mergestrategy", new OptionSetValue(353400000) /*Sequential*/);

try
{
this.CrmSvc.Update(solutionMerge);
}
catch (FaultException<OrganizationServiceFault> ex)
{
this.PackageLog.Log($"Failed to update solution merge {solutionMerge.Id}.", TraceEventType.Error, ex);
}
}
}
}

private void SetDevelopmentHubEnvironmentVariables()
{
this.EnvironmentVariableDeploymentSvc.SetEnvironmentVariable("devhub_AzureDevOpsOrganization", this.AzureDevOpsOrganisation);
Expand Down
Loading