From f3dffdb82c17daa8231e52dbd71938f062a4ee0b Mon Sep 17 00:00:00 2001 From: Eddy Moulton Date: Fri, 29 May 2026 15:04:50 +1000 Subject: [PATCH 1/3] Block SSH on windows --- .../ArgoCD/Git/AuthenticatingRepositoryFactory.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/source/Calamari/ArgoCD/Git/AuthenticatingRepositoryFactory.cs b/source/Calamari/ArgoCD/Git/AuthenticatingRepositoryFactory.cs index d24b3ee2c..0d65231bc 100644 --- a/source/Calamari/ArgoCD/Git/AuthenticatingRepositoryFactory.cs +++ b/source/Calamari/ArgoCD/Git/AuthenticatingRepositoryFactory.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; using System.Linq; +using Calamari.Common.Commands; +using Calamari.Common.Plumbing; using Calamari.Common.Plumbing.Logging; using Octopus.Calamari.Contracts.ArgoCD; @@ -29,6 +31,15 @@ public AuthenticatingRepositoryFactory( public RepositoryWrapper CloneRepository(string requestedUrl, string targetRevision) { var gitCredential = gitCredentials.GetValueOrDefault(requestedUrl); + + if (gitCredential is SshKeyGitCredentialDto && CalamariEnvironment.IsRunningOnWindows) + { + throw new CommandException( + $"Cannot clone '{requestedUrl}' using an SSH key credential: " + + "SSH git credentials are not supported when Calamari is running on Windows. " + + "Supply a username/password credential for this repository, or run the deployment on a Linux worker."); + } + switch (gitCredential) { case GitCredentialDto passwordCredential: @@ -61,4 +72,4 @@ public RepositoryWrapper CloneRepository(string requestedUrl, string targetRevis var anonGitConnection = new HttpsGitConnection(null, null, GitCloneSafeUrl.ConvertToUriString(requestedUrl), GitReference.CreateFromString(targetRevision)); return repositoryFactory.CloneRepository(UniqueRepoNameGenerator.Generate(), anonGitConnection); } -} \ No newline at end of file +} From 73ee33400ea20fc7b6cb456e0ccbe140e073fa7c Mon Sep 17 00:00:00 2001 From: Eddy Moulton Date: Fri, 29 May 2026 16:38:28 +1000 Subject: [PATCH 2/3] Turn off tests --- .../ArgoCD/Git/AuthenticatingRepositoryFactoryTests.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/Calamari.Tests/ArgoCD/Git/AuthenticatingRepositoryFactoryTests.cs b/source/Calamari.Tests/ArgoCD/Git/AuthenticatingRepositoryFactoryTests.cs index 3d4593717..977977c10 100644 --- a/source/Calamari.Tests/ArgoCD/Git/AuthenticatingRepositoryFactoryTests.cs +++ b/source/Calamari.Tests/ArgoCD/Git/AuthenticatingRepositoryFactoryTests.cs @@ -81,6 +81,8 @@ public void AnonymousCloneWhenNoCredentialsMatch() public class SshUrlTests : AuthenticatingRepositoryFactoryTestBase { [Test] + // SSH not currently functional on Windows + [Category(TestCategory.CompatibleOS.OnlyNixOrMac)] public void SshCredentialBranch_IsSelectedAndDispatchesSshKeyGitConnection() { // Use an ssh:// URL so the new strict validation allows it, and mock the factory @@ -108,6 +110,8 @@ public void HttpsCredentialTakesPriorityOverSshWhenBothMatchAnSshUrl() } [Test] + [Category(TestCategory.CompatibleOS.OnlyNixOrMac)] + // SSH not currently functional on Windows public void KnownHostsFromDtoAreCarriedOntoSshKeyGitConnection() { const string sshUrl = "ssh://git@github.com/org/repo.git"; From 1d18098eb993838331b7f4ad6ad39c749b16e244 Mon Sep 17 00:00:00 2001 From: Eddy Moulton Date: Fri, 29 May 2026 16:39:30 +1000 Subject: [PATCH 3/3] Comment out of order --- .../ArgoCD/Git/AuthenticatingRepositoryFactoryTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Calamari.Tests/ArgoCD/Git/AuthenticatingRepositoryFactoryTests.cs b/source/Calamari.Tests/ArgoCD/Git/AuthenticatingRepositoryFactoryTests.cs index 977977c10..5d559298f 100644 --- a/source/Calamari.Tests/ArgoCD/Git/AuthenticatingRepositoryFactoryTests.cs +++ b/source/Calamari.Tests/ArgoCD/Git/AuthenticatingRepositoryFactoryTests.cs @@ -110,8 +110,8 @@ public void HttpsCredentialTakesPriorityOverSshWhenBothMatchAnSshUrl() } [Test] - [Category(TestCategory.CompatibleOS.OnlyNixOrMac)] // SSH not currently functional on Windows + [Category(TestCategory.CompatibleOS.OnlyNixOrMac)] public void KnownHostsFromDtoAreCarriedOntoSshKeyGitConnection() { const string sshUrl = "ssh://git@github.com/org/repo.git";