GoogleApisForiOSComponents/build.cake

250 строки
7.0 KiB
Plaintext
Исходник Постоянная ссылка Обычный вид История

#addin nuget:?package=Cake.XCode&version=4.2.0
2019-08-23 22:03:43 +03:00
#addin nuget:?package=Cake.Xamarin.Build&version=4.1.1
#addin nuget:?package=Cake.FileHelpers&version=3.2.0
#load "poco.cake"
#load "components.cake"
#load "common.cake"
var TARGET = Argument ("t", Argument ("target", "ci"));
var NAMES = Argument ("names", "");
var BUILD_COMMIT = EnvironmentVariable("BUILD_COMMIT") ?? "DEV";
var BUILD_NUMBER = EnvironmentVariable("BUILD_NUMBER") ?? "DEBUG";
var BUILD_TIMESTAMP = DateTime.UtcNow.ToString();
var IS_LOCAL_BUILD = true;
var BACKSLASH = string.Empty;
var SOLUTION_PATH = "./Xamarin.Google.sln";
var EXTERNALS_PATH = new DirectoryPath ("./externals");
// Artifacts that need to be built from pods or be copied from pods
var ARTIFACTS_TO_BUILD = new List<Artifact> ();
var SOURCES_TARGETS = new List<string> ();
2019-08-06 01:23:02 +03:00
var SAMPLES_TARGETS = new List<string> ();
FilePath GetCakeToolPath ()
{
var possibleExe = GetFiles ("./**/tools/Cake/Cake.exe").FirstOrDefault ();
if (possibleExe != null)
return possibleExe;
var p = System.Diagnostics.Process.GetCurrentProcess ();
return new FilePath (p.Modules[0].FileName);
}
void BuildCake (string target)
{
var cakeSettings = new CakeSettings {
ToolPath = GetCakeToolPath (),
Arguments = new Dictionary<string, string> { { "target", target }, { "names", NAMES } },
Verbosity = Verbosity.Diagnostic
};
// Run the script from the subfolder
CakeExecuteScript ("./build.cake", cakeSettings);
}
// From Cake.Xamarin.Build, dumps out versions of things
2019-08-24 00:49:32 +03:00
// LogSystemInfo ();
Setup (context =>
{
IS_LOCAL_BUILD = string.IsNullOrWhiteSpace (EnvironmentVariable ("AGENT_ID"));
2019-08-26 21:09:25 +03:00
Information ($"Is a local build? {IS_LOCAL_BUILD}");
BACKSLASH = IS_LOCAL_BUILD ? @"\" : @"\";
});
Task("build")
.Does(() =>
{
BuildCake ("nuget");
BuildCake ("samples");
});
// Prepares the artifacts to be built.
// From CI will always build everything but, locally you can customize what
// you build, just to save some time when testing locally.
Task("prepare-artifacts")
.IsDependeeOf("externals")
.Does(() =>
{
SetArtifactsDependencies ();
SetArtifactsPodSpecs ();
SetArtifactsExtraPodfileLines ();
2019-08-06 01:23:02 +03:00
SetArtifactsSamples ();
var orderedArtifactsForBuild = new List<Artifact> ();
2019-08-06 07:51:50 +03:00
var orderedArtifactsForSamples = new List<Artifact> ();
if (string.IsNullOrWhiteSpace (NAMES)) {
var artifacts = ARTIFACTS.Values.Where (a => !a.Ignore);
orderedArtifactsForBuild.AddRange (artifacts);
orderedArtifactsForSamples.AddRange (artifacts);
} else {
var names = NAMES.Split (',');
foreach (var name in names) {
if (!(ARTIFACTS.ContainsKey (name) && ARTIFACTS [name] is Artifact artifact))
throw new Exception($"The {name} component does not exist.");
if (artifact.Ignore)
continue;
orderedArtifactsForBuild.Add (artifact);
AddArtifactDependencies (orderedArtifactsForBuild, artifact.Dependencies);
2019-08-06 07:51:50 +03:00
orderedArtifactsForSamples.Add (artifact);
}
orderedArtifactsForBuild = orderedArtifactsForBuild.Distinct ().ToList ();
2019-08-06 07:51:50 +03:00
orderedArtifactsForSamples = orderedArtifactsForSamples.Distinct ().ToList ();
}
orderedArtifactsForBuild.Sort ((f, s) => s.BuildOrder.CompareTo (f.BuildOrder));
2019-08-06 07:51:50 +03:00
orderedArtifactsForSamples.Sort ((f, s) => s.BuildOrder.CompareTo (f.BuildOrder));
ARTIFACTS_TO_BUILD.AddRange (orderedArtifactsForBuild);
Information ("Build order:");
foreach (var artifact in ARTIFACTS_TO_BUILD) {
SOURCES_TARGETS.Add($@"{artifact.ComponentGroup}{BACKSLASH}{artifact.CsprojName.Replace ('.', '_')}");
2019-08-06 07:51:50 +03:00
Information (artifact.Id);
}
foreach (var artifact in orderedArtifactsForSamples)
2019-08-06 01:23:02 +03:00
if (artifact.Samples != null)
foreach (var sample in artifact.Samples)
SAMPLES_TARGETS.Add($@"{artifact.ComponentGroup}{BACKSLASH}{sample.Replace ('.', '_')}");
});
Task ("externals")
2019-08-28 06:33:26 +03:00
.WithCriteria (!DirectoryExists (EXTERNALS_PATH) || !string.IsNullOrWhiteSpace (NAMES))
.Does (() =>
{
EnsureDirectoryExists (EXTERNALS_PATH);
Information ("////////////////////////////////////////");
Information ("// Pods Repo Update Started //");
Information ("////////////////////////////////////////");
Information ("\nUpdating Cocoapods repo...");
CocoaPodRepoUpdate ();
Information ("////////////////////////////////////////");
Information ("// Pods Repo Update Ended //");
Information ("////////////////////////////////////////");
2022-03-19 06:55:42 +03:00
foreach (var artifact in ARTIFACTS_TO_BUILD) {
UpdateVersionInCsproj (artifact);
CreateAndInstallPodfile (artifact);
BuildSdkOnPodfileV2 (artifact);
}
// Call here custom methods created at custom_externals_download.cake file
// to download frameworks and/or bundles for the artifact
// if (ARTIFACTS_TO_BUILD.Contains (FIREBASE_CORE_ARTIFACT))
// FirebaseCoreDownload ();
});
Task ("ci-setup")
.WithCriteria (!BuildSystem.IsLocalBuild)
.Does (() =>
{
var glob = "./source/**/AssemblyInfo.cs";
ReplaceTextInFiles(glob, "{BUILD_COMMIT}", BUILD_COMMIT);
ReplaceTextInFiles(glob, "{BUILD_NUMBER}", BUILD_NUMBER);
ReplaceTextInFiles(glob, "{BUILD_TIMESTAMP}", BUILD_TIMESTAMP);
});
Task ("libs")
.IsDependentOn("externals")
.IsDependentOn("ci-setup")
.Does(() =>
{
var msBuildSettings = new DotNetCoreMSBuildSettings ();
var dotNetCoreBuildSettings = new DotNetCoreBuildSettings {
Configuration = "Release",
2022-03-23 01:09:14 +03:00
Verbosity = DotNetCoreVerbosity.Diagnostic,
MSBuildSettings = msBuildSettings
};
2019-08-24 04:26:35 +03:00
foreach (var target in SOURCES_TARGETS)
msBuildSettings.Targets.Add($@"source\{target}");
DotNetCoreBuild(SOLUTION_PATH, dotNetCoreBuildSettings);
});
Task ("samples")
.IsDependentOn("libs")
.Does(() =>
{
var msBuildSettings = new DotNetCoreMSBuildSettings ();
var dotNetCoreBuildSettings = new DotNetCoreBuildSettings {
Configuration = "Release",
Verbosity = DotNetCoreVerbosity.Diagnostic,
MSBuildSettings = msBuildSettings
};
2019-08-09 00:07:22 +03:00
foreach (var target in SAMPLES_TARGETS)
msBuildSettings.Targets.Add($@"samples-using-source\{target}");
DotNetCoreBuild(SOLUTION_PATH, dotNetCoreBuildSettings);
});
Task ("nuget")
.IsDependentOn("libs")
.Does(() =>
{
2019-09-19 03:22:44 +03:00
EnsureDirectoryExists("./output/");
var dotNetCorePackSettings = new DotNetCorePackSettings {
Configuration = "Release",
NoRestore = true,
NoBuild = true,
OutputDirectory = "./output/",
Verbosity = DotNetCoreVerbosity.Diagnostic,
};
2019-08-24 04:26:35 +03:00
foreach (var target in SOURCES_TARGETS)
DotNetCorePack($"./source/{target}", dotNetCorePackSettings);
});
Task ("clean")
.Does (() =>
{
CleanVisualStudioSolution ();
var deleteDirectorySettings = new DeleteDirectorySettings {
Recursive = true,
Force = true
};
2019-08-09 00:07:22 +03:00
if (DirectoryExists ("./externals/"))
DeleteDirectory ("./externals", deleteDirectorySettings);
2019-09-19 03:22:44 +03:00
if (DirectoryExists ("./output/"))
DeleteDirectory ("./output", deleteDirectorySettings);
});
Task ("ci")
.IsDependentOn("externals")
.IsDependentOn("libs")
.IsDependentOn("nuget")
.IsDependentOn("samples");
Teardown (context =>
{
var artifacts = GetFiles ("./output/**/*");
if (artifacts?.Count () <= 0)
return;
Information ($"Found Artifacts ({artifacts.Count ()})");
foreach (var a in artifacts)
Information ("{0}", a);
});
RunTarget (TARGET);