Skip to content

Commit 139e1b8

Browse files
pjcollinsgrendello
authored andcommitted
[xaprepare] Update ExternalGitDependency usage (#2)
Allows a non-authorized https-based clone for local use cases, and cleans up various logging events to ensure we don't leak secrets. Also includes some minor azure-pipelines.yaml cleanup.
1 parent 24abcf4 commit 139e1b8

File tree

6 files changed

+64
-25
lines changed

6 files changed

+64
-25
lines changed

build-tools/automation/azure-pipelines.yaml

+8-9
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,16 @@ trigger:
88
variables:
99
BundleArtifactName: bundle
1010
AutoProvisionArgs: /p:AutoProvision=True /p:AutoProvisionUsesSudo=True /p:IgnoreMaxMonoVersion=False
11+
AndroidTargetAbiArgs: >-
12+
/p:AndroidSupportedTargetJitAbis=armeabi-v7a:arm64-v8a:x86:x86_64
13+
/p:AndroidSupportedTargetAotAbis=armeabi-v7a:arm64:x86:x86_64:win-armeabi-v7a:win-arm64:win-x86:win-x86_64
1114
1215
# Stage and Job "display names" are shortened because they are combined to form the name of the corresponding GitHub check.
1316
stages:
1417
- stage: prepare
1518
displayName: Prepare
1619
variables:
17-
MSBuildAbiArgs: >-
18-
/p:AndroidSupportedTargetJitAbis=armeabi-v7a:arm64-v8a:x86:x86_64
19-
/p:AndroidSupportedHostJitAbis=Darwin:mxe-Win32:mxe-Win64
20-
/p:AndroidSupportedTargetAotAbis=armeabi-v7a:arm64:x86:x86_64:win-armeabi-v7a:win-arm64:win-x86:win-x86_64
20+
MSBuildAbiArgs: $(AndroidTargetAbiArgs) /p:AndroidSupportedHostJitAbis=Darwin:mxe-Win32:mxe-Win64
2121
jobs:
2222
- job: create_bundle
2323
displayName: Bundle
@@ -35,7 +35,7 @@ stages:
3535
- script: |
3636
make prepare-update-mono PREPARE_CI=1 V=1 CONFIGURATION=$(XA.Build.Configuration) MSBUILD_ARGS="$(AutoProvisionArgs) $(MSBuildAbiArgs)"
3737
make prepare PREPARE_CI=1 V=1 CONFIGURATION=$(XA.Build.Configuration) MSBUILD_ARGS="$(AutoProvisionArgs) $(MSBuildAbiArgs)"
38-
displayName: make prepare-props
38+
displayName: create bundle
3939
4040
- task: CopyFiles@2
4141
displayName: copy bundle
@@ -149,7 +149,6 @@ stages:
149149
cancelTimeoutInMinutes: 5
150150
variables:
151151
JAVA_HOME: '%HOMEDRIVE%%HOMEPATH%\android-toolchain\jdk'
152-
XA_MSBUILD_ARGS: "/p:AndroidSupportedTargetJitAbis=armeabi-v7a:arm64-v8a:x86:x86_64 /p:AndroidSupportedTargetAotAbis=armeabi-v7a:win-armeabi-v7a:arm64:win-arm64:x86:win-x86:x86_64:win-x86_64"
153152
steps:
154153
- checkout: self
155154
clean: true
@@ -175,20 +174,20 @@ stages:
175174
inputs:
176175
solution: Xamarin.Android.sln
177176
configuration: $(XA.Build.Configuration)
178-
msbuildArguments: /t:Build /bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\msbuild-build.binlog /p:BundleRootPath=$(System.DefaultWorkingDirectory) $(XA_MSBUILD_ARGS)
177+
msbuildArguments: /t:Build /bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\msbuild-build.binlog /p:BundleRootPath=$(System.DefaultWorkingDirectory) $(AndroidTargetAbiArgs)
179178

180179
- task: MSBuild@1
181180
displayName: msbuild create-vsix
182181
inputs:
183182
solution: build-tools\create-vsix\create-vsix.csproj
184183
configuration: $(XA.Build.Configuration)
185-
msbuildArguments: /p:CreateVsixContainer=True /p:ZipPackageCompressionLevel=Normal /bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\msbuild-create-vsix.binlog $(XA_MSBUILD_ARGS)
184+
msbuildArguments: /p:CreateVsixContainer=True /p:ZipPackageCompressionLevel=Normal /bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\msbuild-create-vsix.binlog $(AndroidTargetAbiArgs)
186185

187186
- task: CmdLine@1
188187
displayName: xabuild Xamarin.Android-Tests
189188
inputs:
190189
filename: bin\$(XA.Build.Configuration)\bin\xabuild.exe
191-
arguments: Xamarin.Android-Tests.sln /p:Configuration=$(XA.Build.Configuration) /p:XAIntegratedTests=False /bl:$(System.DefaultWorkingDirectory)\bin\Test$(XA.Build.Configuration)\msbuild-build-tests.binlog $(XA_MSBUILD_ARGS)
190+
arguments: Xamarin.Android-Tests.sln /p:Configuration=$(XA.Build.Configuration) /p:XAIntegratedTests=False /bl:$(System.DefaultWorkingDirectory)\bin\Test$(XA.Build.Configuration)\msbuild-build-tests.binlog $(AndroidTargetAbiArgs)
192191

193192
- task: MSBuild@1
194193
displayName: nunit Xamarin.Android.Build.Tests

build-tools/xaprepare/xaprepare/Application/ExternalGitDependency.cs

-11
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ sealed class ExternalGitDependency : AppObject
3232
public string Commit { get; private set; }
3333
public string Name { get; private set; }
3434
public string Owner { get; private set; }
35-
public string Url { get; private set; }
3635

3736
public static List<ExternalGitDependency> GetDependencies (Context context, string externalFilePath)
3837
{
@@ -54,22 +53,12 @@ public static List<ExternalGitDependency> GetDependencies (Context context, stri
5453
Name = match.Groups["repo"].Value,
5554
Owner = match.Groups["owner"].Value,
5655
};
57-
SetGitHubURL (e);
5856
externals.Add (e);
5957
Log.Instance.StatusLine ($" {context.Characters.Bullet} {e.Owner}/{e.Name} ({e.Commit})");
6058
}
6159
}
6260

6361
return externals;
6462
}
65-
66-
static void SetGitHubURL (ExternalGitDependency egd)
67-
{
68-
string ghToken = Environment.GetEnvironmentVariable ("GH_AUTH_SECRET");
69-
if (!String.IsNullOrEmpty (ghToken))
70-
egd.Url = $"https://{ghToken}@github.com:/{egd.Owner}/{egd.Name}";
71-
else
72-
egd.Url = $"git@github.com:/{egd.Owner}/{egd.Name}";
73-
}
7463
}
7564
}

build-tools/xaprepare/xaprepare/Application/ProcessRunner.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public string FullCommandLine {
6262
public Dictionary <string, string> Environment { get; } = new Dictionary <string, string> (StringComparer.Ordinal);
6363
public int ExitCode { get; private set; } = -1;
6464
public ErrorReasonCode ErrorReason { get; private set; } = ErrorReasonCode.NotExecutedYet;
65+
public bool EchoCmdAndArguments { get; set; } = true;
6566
public bool EchoStandardOutput { get; set; }
6667
public ProcessStandardStreamWrapper.LogLevel EchoStandardOutputLevel { get; set; } = ProcessStandardStreamWrapper.LogLevel.Message;
6768
public bool EchoStandardError { get; set; }
@@ -232,7 +233,8 @@ public bool Run ()
232233
StartInfo = psi
233234
};
234235

235-
Log.DebugLine ($"Running: {FullCommandLine}");
236+
if (EchoCmdAndArguments)
237+
Log.DebugLine ($"Running: {FullCommandLine}");
236238

237239
try {
238240
process.Start ();

build-tools/xaprepare/xaprepare/Steps/Step_PrepareExternalGitDependencies.cs

+21-4
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,23 @@ protected override async Task<bool> Execute (Context context)
1818
bool failed = false;
1919
Log.StatusLine ();
2020
Log.StatusLine ("Updating external repositories");
21-
var git = new GitRunner (context);
21+
var git = new GitRunner (context) {
22+
EchoCmdAndArguments = false
23+
};
2224
foreach (ExternalGitDependency egd in externalDependencies) {
2325
Log.StatusLine ($" {context.Characters.Bullet} {egd.Name}");
2426
string destDir = Path.Combine (Configurables.Paths.ExternalGitDepsDestDir, egd.Name);
2527
if (!Directory.Exists (destDir)) {
26-
Log.StatusLine ($" {context.Characters.Link} cloning from {egd.Url}");
27-
if (!await git.Clone (egd.Url, destDir)) {
28+
var egdUrl = await GetGitHubURL (egd, git);
29+
Log.StatusLine ($" {context.Characters.Link} cloning from {egd.Owner}/{egd.Name}");
30+
if (!await git.Clone (egdUrl, destDir)) {
2831
Log.ErrorLine ($"Failed to clone {egd.Name}");
2932
failed = true;
3033
continue;
3134
}
3235
}
3336

34-
Log.StatusLine ($" {context.Characters.Link} fetching changes from {egd.Url}");
37+
Log.StatusLine ($" {context.Characters.Link} fetching changes from {egd.Owner}/{egd.Name}");
3538
if (!await git.Fetch (destDir)) {
3639
Log.ErrorLine ($"Failed to fetch changes for {egd.Name}");
3740
failed = true;
@@ -65,5 +68,19 @@ protected override async Task<bool> Execute (Context context)
6568

6669
return !failed;
6770
}
71+
72+
async Task<string> GetGitHubURL (ExternalGitDependency egd, GitRunner git)
73+
{
74+
string ghToken = Environment.GetEnvironmentVariable("GH_AUTH_SECRET");
75+
if (!String.IsNullOrEmpty (ghToken)) {
76+
return $"https://{ghToken}@github.com:/{egd.Owner}/{egd.Name}";
77+
} else {
78+
if (await git.IsRepoUrlHttps (BuildPaths.XamarinAndroidSourceRoot)) {
79+
return $"https://github.com:/{egd.Owner}/{egd.Name}";
80+
} else {
81+
return $"git@github.com:/{egd.Owner}/{egd.Name}";
82+
}
83+
}
84+
}
6885
}
6986
}

build-tools/xaprepare/xaprepare/ToolRunners/GitRunner.cs

+30
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,36 @@ public async Task<IList<BlamePorcelainEntry>> Blame (string filePath, List<strin
160160
return parserState.Entries;
161161
}
162162

163+
public async Task<bool> IsRepoUrlHttps (string workingDirectory)
164+
{
165+
if (!Directory.Exists (workingDirectory))
166+
throw new ArgumentException ("must exist", nameof (workingDirectory));
167+
168+
var runner = CreateGitRunner (workingDirectory);
169+
runner.AddArgument ("config");
170+
runner.AddArgument ("--get");
171+
runner.AddArgument ("remote.origin.url");
172+
173+
bool containsHttps = false;
174+
175+
bool success = await RunTool (
176+
() => {
177+
using (var outputSink = (OutputSink)SetupOutputSink (runner)) {
178+
outputSink.LineCallback = (string line) => {
179+
containsHttps = !string.IsNullOrEmpty (line) && line.Contains ("https://");
180+
};
181+
runner.WorkingDirectory = DetermineRunnerWorkingDirectory (workingDirectory);
182+
return runner.Run ();
183+
}
184+
}
185+
);
186+
187+
if (!success)
188+
return false;
189+
190+
return containsHttps;
191+
}
192+
163193
ProcessRunner CreateGitRunner (string workingDirectory, List<string> arguments = null)
164194
{
165195
var runner = CreateProcessRunner ();

build-tools/xaprepare/xaprepare/ToolRunners/ToolRunner.cs

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ abstract partial class ToolRunner : AppObject
2121
public string FullToolPath { get; }
2222
protected string VersionString => GetVersion ();
2323

24+
public bool EchoCmdAndArguments { get; set; } = true;
2425
public bool EchoStandardError { get; set; } = true;
2526
public bool EchoStandardOutput { get; set; }
2627
public string LogMessageIndent { get; set; } = String.Empty;
@@ -88,6 +89,7 @@ protected virtual ProcessRunner CreateProcessRunner (params string[] initialPara
8889

8990
var runner = new ProcessRunner (managedRunner ?? FullToolPath, initialParams) {
9091
ProcessTimeout = ProcessTimeout,
92+
EchoCmdAndArguments = EchoCmdAndArguments,
9193
EchoStandardError = EchoStandardError,
9294
EchoStandardOutput = EchoStandardOutput,
9395
};

0 commit comments

Comments
 (0)