Skip to content

Commit 31727f3

Browse files
committed
(build) moving cake logic to separate files
1 parent 595cad1 commit 31727f3

File tree

3 files changed

+622
-0
lines changed

3 files changed

+622
-0
lines changed

build/docker.cake

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
Task("Docker-Build")
2+
.WithCriteria<BuildParameters>((context, parameters) => !parameters.IsRunningOnMacOS, "Docker can be built only on Windows or Linux agents.")
3+
.WithCriteria<BuildParameters>((context, parameters) => parameters.IsRunningOnAzurePipeline, "Docker-Build works only on AzurePipeline.")
4+
.IsDependentOn("Copy-Files")
5+
.Does<BuildParameters>((parameters) =>
6+
{
7+
foreach(var dockerImage in parameters.Docker.Images)
8+
{
9+
DockerBuild(dockerImage, parameters);
10+
}
11+
});
12+
13+
Task("Docker-Test")
14+
.WithCriteria<BuildParameters>((context, parameters) => !parameters.IsRunningOnMacOS, "Docker can be tested only on Windows or Linux agents.")
15+
.WithCriteria<BuildParameters>((context, parameters) => parameters.IsRunningOnAzurePipeline, "Docker-Test works only on AzurePipeline.")
16+
.IsDependentOn("Docker-Build")
17+
.Does<BuildParameters>((parameters) =>
18+
{
19+
var currentDir = MakeAbsolute(Directory("."));
20+
var containerDir = parameters.IsDockerForWindows ? "c:/repo" : "/repo";
21+
var settings = new DockerContainerRunSettings
22+
{
23+
Rm = true,
24+
Volume = new[] { $"{currentDir}:{containerDir}" }
25+
};
26+
27+
foreach(var dockerImage in parameters.Docker.Images)
28+
{
29+
var tags = GetDockerTags(dockerImage, parameters);
30+
foreach (var tag in tags)
31+
{
32+
DockerTestRun(settings, parameters, tag, containerDir);
33+
}
34+
}
35+
});
36+
37+
Task("Publish-DockerHub")
38+
.WithCriteria<BuildParameters>((context, parameters) => parameters.EnabledPublishDocker, "Publish-DockerHub was disabled.")
39+
.WithCriteria<BuildParameters>((context, parameters) => !parameters.IsRunningOnMacOS, "Publish-DockerHub works only on Windows and Linux agents.")
40+
.WithCriteria<BuildParameters>((context, parameters) => parameters.IsRunningOnAzurePipeline, "Publish-DockerHub works only on AzurePipeline.")
41+
.WithCriteria<BuildParameters>((context, parameters) => parameters.IsStableRelease() || parameters.IsPreRelease(), "Publish-DockerHub works only for releases.")
42+
.IsDependentOn("Docker-Build")
43+
.IsDependentOn("Docker-Test")
44+
.Does<BuildParameters>((parameters) =>
45+
{
46+
var username = parameters.Credentials.Docker.UserName;
47+
if (string.IsNullOrEmpty(username)) {
48+
throw new InvalidOperationException("Could not resolve Docker user name.");
49+
}
50+
51+
var password = parameters.Credentials.Docker.Password;
52+
if (string.IsNullOrEmpty(password)) {
53+
throw new InvalidOperationException("Could not resolve Docker password.");
54+
}
55+
56+
DockerStdinLogin(username, password);
57+
58+
foreach(var dockerImage in parameters.Docker.Images)
59+
{
60+
DockerPush(dockerImage, parameters);
61+
}
62+
63+
DockerLogout();
64+
})
65+
.OnError(exception =>
66+
{
67+
Information("Publish-DockerHub Task failed, but continuing with next Task...");
68+
Error(exception.Dump());
69+
publishingError = true;
70+
});

build/pack.cake

Lines changed: 302 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,302 @@
1+
#region Build
2+
3+
Task("Clean")
4+
.Does<BuildParameters>((parameters) =>
5+
{
6+
Information("Cleaning directories..");
7+
8+
CleanDirectories("./src/**/bin/" + parameters.Configuration);
9+
CleanDirectories("./src/**/obj");
10+
CleanDirectories("./src/GitVersionTfsTask/scripts/**");
11+
12+
DeleteFiles("src/GitVersionTfsTask/*.vsix");
13+
DeleteFiles("src/GitVersionRubyGem/*.gem");
14+
15+
CleanDirectories(parameters.Paths.Directories.ToClean);
16+
});
17+
18+
// This build task can be run to just build
19+
Task("DogfoodBuild")
20+
.IsDependentOn("Clean")
21+
.Does<BuildParameters>((parameters) =>
22+
{
23+
Build(parameters.Configuration);
24+
});
25+
26+
Task("Build")
27+
.IsDependentOn("Clean")
28+
.Does<BuildParameters>((parameters) =>
29+
{
30+
Build(parameters.Configuration);
31+
});
32+
33+
#endregion
34+
35+
#region Tests
36+
37+
Task("Test")
38+
.WithCriteria<BuildParameters>((context, parameters) => parameters.EnabledUnitTests, "Unit tests were disabled.")
39+
.IsDependentOn("Build")
40+
.Does<BuildParameters>((parameters) =>
41+
{
42+
var framework = parameters.FullFxVersion;
43+
44+
// run using dotnet test
45+
var projects = GetFiles("./src/**/*.Tests.csproj");
46+
foreach(var project in projects)
47+
{
48+
var settings = new DotNetCoreTestSettings
49+
{
50+
Framework = framework,
51+
NoBuild = true,
52+
NoRestore = true,
53+
Configuration = parameters.Configuration
54+
};
55+
56+
var coverletSettings = new CoverletSettings {
57+
CollectCoverage = true,
58+
CoverletOutputFormat = CoverletOutputFormat.opencover,
59+
CoverletOutputDirectory = parameters.Paths.Directories.TestCoverageOutput + "/",
60+
CoverletOutputName = $"{project.GetFilenameWithoutExtension()}.coverage.xml"
61+
};
62+
63+
if (IsRunningOnUnix())
64+
{
65+
settings.Filter = "TestCategory!=NoMono";
66+
}
67+
68+
DotNetCoreTest(project.FullPath, settings, coverletSettings);
69+
}
70+
71+
// run using NUnit
72+
var testAssemblies = GetFiles("./src/**/bin/" + parameters.Configuration + "/" + framework + "/*.Tests.dll");
73+
74+
var nunitSettings = new NUnit3Settings
75+
{
76+
Results = new List<NUnit3Result> { new NUnit3Result { FileName = parameters.Paths.Files.TestCoverageOutputFilePath } }
77+
};
78+
79+
if(IsRunningOnUnix()) {
80+
nunitSettings.Where = "cat!=NoMono";
81+
nunitSettings.Agents = 1;
82+
}
83+
84+
NUnit3(testAssemblies, nunitSettings);
85+
});
86+
87+
#endregion
88+
89+
#region Package
90+
91+
Task("Copy-Files")
92+
.IsDependentOn("Test")
93+
.Does<BuildParameters>((parameters) =>
94+
{
95+
// .NET Core
96+
var coreFxDir = parameters.Paths.Directories.ArtifactsBinCoreFx.Combine("tools");
97+
DotNetCorePublish("./src/GitVersionExe/GitVersionExe.csproj", new DotNetCorePublishSettings
98+
{
99+
Framework = parameters.CoreFxVersion,
100+
NoRestore = true,
101+
Configuration = parameters.Configuration,
102+
OutputDirectory = coreFxDir,
103+
MSBuildSettings = parameters.MSBuildSettings
104+
});
105+
106+
// Copy license & Copy GitVersion.XML (since publish does not do this anymore)
107+
CopyFileToDirectory("./LICENSE", coreFxDir);
108+
CopyFileToDirectory($"./src/GitVersionExe/bin/{parameters.Configuration}/{parameters.CoreFxVersion}/GitVersion.xml", coreFxDir);
109+
110+
// .NET Framework
111+
DotNetCorePublish("./src/GitVersionExe/GitVersionExe.csproj", new DotNetCorePublishSettings
112+
{
113+
Framework = parameters.FullFxVersion,
114+
NoBuild = true,
115+
NoRestore = true,
116+
Configuration = parameters.Configuration,
117+
OutputDirectory = parameters.Paths.Directories.ArtifactsBinFullFx,
118+
MSBuildSettings = parameters.MSBuildSettings
119+
});
120+
121+
DotNetCorePublish("./src/GitVersionTask/GitVersionTask.csproj", new DotNetCorePublishSettings
122+
{
123+
Framework = parameters.FullFxVersion,
124+
NoBuild = true,
125+
NoRestore = true,
126+
Configuration = parameters.Configuration,
127+
MSBuildSettings = parameters.MSBuildSettings
128+
});
129+
130+
// .NET Core
131+
DotNetCorePublish("./src/GitVersionTask/GitVersionTask.csproj", new DotNetCorePublishSettings
132+
{
133+
Framework = parameters.CoreFxVersion,
134+
NoBuild = true,
135+
NoRestore = true,
136+
Configuration = parameters.Configuration,
137+
MSBuildSettings = parameters.MSBuildSettings
138+
});
139+
var ilMergeDir = parameters.Paths.Directories.ArtifactsBinFullFxILMerge;
140+
var portableDir = parameters.Paths.Directories.ArtifactsBinFullFxPortable.Combine("tools");
141+
var cmdlineDir = parameters.Paths.Directories.ArtifactsBinFullFxCmdline.Combine("tools");
142+
143+
// Portable
144+
PublishILRepackedGitVersionExe(true, parameters.Paths.Directories.ArtifactsBinFullFx, ilMergeDir, portableDir, parameters.Configuration, parameters.FullFxVersion);
145+
// Commandline
146+
PublishILRepackedGitVersionExe(false, parameters.Paths.Directories.ArtifactsBinFullFx, ilMergeDir, cmdlineDir, parameters.Configuration, parameters.FullFxVersion);
147+
148+
// Vsix
149+
var vsixPath = new DirectoryPath("./src/GitVersionTfsTask/GitVersionTask");
150+
151+
var vsixPathFull = vsixPath.Combine("full");
152+
EnsureDirectoryExists(vsixPathFull);
153+
CopyFileToDirectory(portableDir + "/" + "LibGit2Sharp.dll.config", vsixPathFull);
154+
CopyFileToDirectory(portableDir + "/" + "GitVersion.exe", vsixPathFull);
155+
CopyDirectory(portableDir.Combine("lib"), vsixPathFull.Combine("lib"));
156+
157+
// Vsix dotnet core
158+
var vsixPathCore = vsixPath.Combine("core");
159+
EnsureDirectoryExists(vsixPathCore);
160+
CopyDirectory(coreFxDir, vsixPathCore);
161+
162+
// Ruby Gem
163+
var gemPath = new DirectoryPath("./src/GitVersionRubyGem/bin");
164+
EnsureDirectoryExists(gemPath);
165+
CopyFileToDirectory(portableDir + "/" + "LibGit2Sharp.dll.config", gemPath);
166+
CopyFileToDirectory(portableDir + "/" + "GitVersion.exe", gemPath);
167+
CopyDirectory(portableDir.Combine("lib"), gemPath.Combine("lib"));
168+
});
169+
170+
Task("Pack-Vsix")
171+
.IsDependentOn("Copy-Files")
172+
.Does<BuildParameters>((parameters) =>
173+
{
174+
var workDir = "./src/GitVersionTfsTask";
175+
var idSuffix = parameters.IsStableRelease() ? "" : "-preview";
176+
var titleSuffix = parameters.IsStableRelease() ? "" : " (Preview)";
177+
var visibility = parameters.IsStableRelease() ? "Public" : "Preview";
178+
var taskId = parameters.IsStableRelease() ? "e5983830-3f75-11e5-82ed-81492570a08e" : "25b46667-d5a9-4665-97f7-e23de366ecdf";
179+
180+
ReplaceTextInFile(new FilePath(workDir + "/vss-extension.json"), "$idSuffix$", idSuffix);
181+
ReplaceTextInFile(new FilePath(workDir + "/vss-extension.json"), "$titleSuffix$", titleSuffix);
182+
ReplaceTextInFile(new FilePath(workDir + "/vss-extension.json"), "$visibility$", visibility);
183+
184+
// update version number
185+
ReplaceTextInFile(new FilePath(workDir + "/vss-extension.json"), "$version$", parameters.Version.VsixVersion);
186+
UpdateTaskVersion(new FilePath(workDir + "/GitVersionTask/task.json"), taskId, parameters.Version.GitVersion);
187+
188+
// build and pack
189+
NpmSet(new NpmSetSettings { WorkingDirectory = workDir, LogLevel = NpmLogLevel.Silent, Key = "progress", Value = "false" });
190+
NpmInstall(new NpmInstallSettings { WorkingDirectory = workDir, LogLevel = NpmLogLevel.Silent });
191+
NpmRunScript(new NpmRunScriptSettings { WorkingDirectory = workDir, LogLevel = NpmLogLevel.Silent, ScriptName = "build" });
192+
193+
var settings = new TfxExtensionCreateSettings
194+
{
195+
ToolPath = workDir + "/node_modules/.bin/" + (parameters.IsRunningOnWindows ? "tfx.cmd" : "tfx"),
196+
WorkingDirectory = workDir,
197+
OutputPath = parameters.Paths.Directories.BuildArtifact
198+
};
199+
200+
settings.ManifestGlobs = new List<string>(){ "vss-extension.json" };
201+
TfxExtensionCreate(settings);
202+
});
203+
204+
Task("Pack-Gem")
205+
.IsDependentOn("Copy-Files")
206+
.Does<BuildParameters>((parameters) =>
207+
{
208+
var workDir = "./src/GitVersionRubyGem";
209+
210+
var gemspecFile = new FilePath(workDir + "/gitversion.gemspec");
211+
// update version number
212+
ReplaceTextInFile(gemspecFile, "$version$", parameters.Version.GemVersion);
213+
214+
var toolPath = FindToolInPath(IsRunningOnWindows() ? "gem.cmd" : "gem");
215+
GemBuild(gemspecFile, new Cake.Gem.Build.GemBuildSettings()
216+
{
217+
WorkingDirectory = workDir,
218+
ToolPath = toolPath
219+
});
220+
221+
CopyFiles(workDir + "/*.gem", parameters.Paths.Directories.BuildArtifact);
222+
});
223+
224+
Task("Pack-Nuget")
225+
.IsDependentOn("Copy-Files")
226+
.Does<BuildParameters>((parameters) =>
227+
{
228+
foreach(var package in parameters.Packages.Nuget)
229+
{
230+
if (FileExists(package.NuspecPath)) {
231+
var artifactPath = MakeAbsolute(parameters.PackagesBuildMap[package.Id]).FullPath;
232+
233+
var nugetSettings = new NuGetPackSettings
234+
{
235+
Version = parameters.Version.NugetVersion,
236+
NoPackageAnalysis = true,
237+
OutputDirectory = parameters.Paths.Directories.NugetRoot,
238+
Files = GetFiles(artifactPath + "/**/*.*")
239+
.Select(file => new NuSpecContent { Source = file.FullPath, Target = file.FullPath.Replace(artifactPath, "") })
240+
.ToArray()
241+
};
242+
243+
NuGetPack(package.NuspecPath, nugetSettings);
244+
}
245+
}
246+
247+
var settings = new DotNetCorePackSettings
248+
{
249+
Configuration = parameters.Configuration,
250+
OutputDirectory = parameters.Paths.Directories.NugetRoot,
251+
NoBuild = true,
252+
NoRestore = true,
253+
MSBuildSettings = parameters.MSBuildSettings
254+
};
255+
256+
// GitVersionCore, GitVersionTask, & global tool
257+
DotNetCorePack("./src/GitVersionCore", settings);
258+
DotNetCorePack("./src/GitVersionTask", settings);
259+
DotNetCorePack("./src/GitVersionExe/GitVersion.Tool.csproj", settings);
260+
});
261+
262+
Task("Pack-Chocolatey")
263+
.WithCriteria<BuildParameters>((context, parameters) => parameters.IsRunningOnWindows, "Pack-Chocolatey works only on Windows agents.")
264+
.WithCriteria<BuildParameters>((context, parameters) => parameters.IsMainBranch, "Pack-Chocolatey works only for main branch.")
265+
.IsDependentOn("Copy-Files")
266+
.Does<BuildParameters>((parameters) =>
267+
{
268+
foreach(var package in parameters.Packages.Chocolatey)
269+
{
270+
if (FileExists(package.NuspecPath)) {
271+
var artifactPath = MakeAbsolute(parameters.PackagesBuildMap[package.Id]).FullPath;
272+
273+
var files = GetFiles(artifactPath + "/**/*.*")
274+
.Select(file => new ChocolateyNuSpecContent { Source = file.FullPath, Target = file.FullPath.Replace(artifactPath, "") });
275+
var txtFiles = (GetFiles("./nuspec/*.txt") + GetFiles("./nuspec/*.ps1"))
276+
.Select(file => new ChocolateyNuSpecContent { Source = file.FullPath, Target = file.GetFilename().ToString() });
277+
278+
ChocolateyPack(package.NuspecPath, new ChocolateyPackSettings {
279+
Verbose = true,
280+
Version = parameters.Version.SemVersion,
281+
OutputDirectory = parameters.Paths.Directories.NugetRoot,
282+
Files = files.Concat(txtFiles).ToArray()
283+
});
284+
}
285+
}
286+
});
287+
288+
Task("Zip-Files")
289+
.IsDependentOn("Copy-Files")
290+
.Does<BuildParameters>((parameters) =>
291+
{
292+
// .NET Framework
293+
var cmdlineDir = parameters.Paths.Directories.ArtifactsBinFullFxCmdline.Combine("tools");
294+
var fullFxFiles = GetFiles(cmdlineDir.FullPath + "/**/*");
295+
Zip(cmdlineDir, parameters.Paths.Files.ZipArtifactPathDesktop, fullFxFiles);
296+
297+
// .NET Core
298+
var coreFxDir = parameters.Paths.Directories.ArtifactsBinCoreFx.Combine("tools");
299+
var coreclrFiles = GetFiles(coreFxDir.FullPath + "/**/*");
300+
Zip(coreFxDir, parameters.Paths.Files.ZipArtifactPathCoreClr, coreclrFiles);
301+
});
302+
#endregion

0 commit comments

Comments
 (0)