Skip to content

Commit af7be86

Browse files
authored
E2E test with minikube on gh action (#513)
* add minikube as e2e test server * fix format * update env * force no skip * fix then * finish skip test * add skip blocker * fix path * output skipped case * enable test env var * final merge * add missing file
1 parent 16845ba commit af7be86

File tree

8 files changed

+216
-4
lines changed

8 files changed

+216
-4
lines changed

.github/workflows/dotnet.yaml renamed to .github/workflows/buildtest.yaml

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: .NET Core
1+
name: Build and Test
22

33
jobs:
44
build:
@@ -34,6 +34,31 @@ jobs:
3434
# path: tests/KubernetesClient.Tests/coverage.netcoreapp2.1.cobertura.xml
3535
# repo_token: ${{ secrets.GITHUB_TOKEN }}
3636
# minimum_coverage: 0
37+
e2e:
38+
runs-on: ubuntu-latest
39+
steps:
40+
- uses: actions/checkout@v1
41+
with:
42+
fetch-depth: 0
43+
- name: Setup dotnet SDK 2.1
44+
uses: actions/setup-dotnet@v1
45+
with:
46+
dotnet-version: '2.1.x'
47+
- name: Setup dotnet SDK 3.1
48+
uses: actions/setup-dotnet@v1
49+
with:
50+
dotnet-version: '3.1.x'
51+
- name: Minikube
52+
run: minikube start
53+
- name: Test
54+
run: |
55+
true > skip.log
56+
env K8S_E2E_MINIKUBE=1 dotnet test tests/E2E.Tests --logger "SkipTestLogger;file=$PWD/skip.log"
57+
if [ -s skip.log ]; then
58+
cat skip.log
59+
echo "CASES MUST NOT BE SKIPPED"
60+
exit 1
61+
fi
3762
3863
on:
3964
pull_request:

Directory.Build.targets

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<PrivateAssets>All</PrivateAssets>
55
</PackageReference>
66

7-
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8">
7+
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="3.3.1">
88
<PrivateAssets>All</PrivateAssets>
99
</PackageReference>
1010
</ItemGroup>

kubernetes-client.sln

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,13 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KubernetesWatchGenerator",
3333
EndProject
3434
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "patch", "examples\patch\patch.csproj", "{04DE2C84-117D-4E21-8B45-B7AE627697BD}"
3535
EndProject
36-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "httpClientFactory", "examples\httpClientFactory\httpClientFactory.csproj", "{A07314A0-02E8-4F36-B233-726D59D28F08}"
36+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "httpClientFactory", "examples\httpClientFactory\httpClientFactory.csproj", "{A07314A0-02E8-4F36-B233-726D59D28F08}"
3737
EndProject
38-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "metrics", "examples\metrics\metrics.csproj", "{B9647AD4-F6B0-406F-8B79-6781E31600EC}"
38+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "metrics", "examples\metrics\metrics.csproj", "{B9647AD4-F6B0-406F-8B79-6781E31600EC}"
39+
EndProject
40+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "E2E.Tests", "tests\E2E.Tests\E2E.Tests.csproj", "{5056C4A2-5E12-4C16-8DA7-8835DA58BFF2}"
41+
EndProject
42+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkipTestLogger", "tests\SkipTestLogger\SkipTestLogger.csproj", "{4D2AE427-F856-49E5-B61D-EA6B17D89051}"
3943
EndProject
4044
Global
4145
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -203,6 +207,30 @@ Global
203207
{B9647AD4-F6B0-406F-8B79-6781E31600EC}.Release|x64.Build.0 = Release|Any CPU
204208
{B9647AD4-F6B0-406F-8B79-6781E31600EC}.Release|x86.ActiveCfg = Release|Any CPU
205209
{B9647AD4-F6B0-406F-8B79-6781E31600EC}.Release|x86.Build.0 = Release|Any CPU
210+
{5056C4A2-5E12-4C16-8DA7-8835DA58BFF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
211+
{5056C4A2-5E12-4C16-8DA7-8835DA58BFF2}.Debug|Any CPU.Build.0 = Debug|Any CPU
212+
{5056C4A2-5E12-4C16-8DA7-8835DA58BFF2}.Debug|x64.ActiveCfg = Debug|Any CPU
213+
{5056C4A2-5E12-4C16-8DA7-8835DA58BFF2}.Debug|x64.Build.0 = Debug|Any CPU
214+
{5056C4A2-5E12-4C16-8DA7-8835DA58BFF2}.Debug|x86.ActiveCfg = Debug|Any CPU
215+
{5056C4A2-5E12-4C16-8DA7-8835DA58BFF2}.Debug|x86.Build.0 = Debug|Any CPU
216+
{5056C4A2-5E12-4C16-8DA7-8835DA58BFF2}.Release|Any CPU.ActiveCfg = Release|Any CPU
217+
{5056C4A2-5E12-4C16-8DA7-8835DA58BFF2}.Release|Any CPU.Build.0 = Release|Any CPU
218+
{5056C4A2-5E12-4C16-8DA7-8835DA58BFF2}.Release|x64.ActiveCfg = Release|Any CPU
219+
{5056C4A2-5E12-4C16-8DA7-8835DA58BFF2}.Release|x64.Build.0 = Release|Any CPU
220+
{5056C4A2-5E12-4C16-8DA7-8835DA58BFF2}.Release|x86.ActiveCfg = Release|Any CPU
221+
{5056C4A2-5E12-4C16-8DA7-8835DA58BFF2}.Release|x86.Build.0 = Release|Any CPU
222+
{4D2AE427-F856-49E5-B61D-EA6B17D89051}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
223+
{4D2AE427-F856-49E5-B61D-EA6B17D89051}.Debug|Any CPU.Build.0 = Debug|Any CPU
224+
{4D2AE427-F856-49E5-B61D-EA6B17D89051}.Debug|x64.ActiveCfg = Debug|Any CPU
225+
{4D2AE427-F856-49E5-B61D-EA6B17D89051}.Debug|x64.Build.0 = Debug|Any CPU
226+
{4D2AE427-F856-49E5-B61D-EA6B17D89051}.Debug|x86.ActiveCfg = Debug|Any CPU
227+
{4D2AE427-F856-49E5-B61D-EA6B17D89051}.Debug|x86.Build.0 = Debug|Any CPU
228+
{4D2AE427-F856-49E5-B61D-EA6B17D89051}.Release|Any CPU.ActiveCfg = Release|Any CPU
229+
{4D2AE427-F856-49E5-B61D-EA6B17D89051}.Release|Any CPU.Build.0 = Release|Any CPU
230+
{4D2AE427-F856-49E5-B61D-EA6B17D89051}.Release|x64.ActiveCfg = Release|Any CPU
231+
{4D2AE427-F856-49E5-B61D-EA6B17D89051}.Release|x64.Build.0 = Release|Any CPU
232+
{4D2AE427-F856-49E5-B61D-EA6B17D89051}.Release|x86.ActiveCfg = Release|Any CPU
233+
{4D2AE427-F856-49E5-B61D-EA6B17D89051}.Release|x86.Build.0 = Release|Any CPU
206234
EndGlobalSection
207235
GlobalSection(SolutionProperties) = preSolution
208236
HideSolutionNode = FALSE
@@ -221,6 +249,8 @@ Global
221249
{04DE2C84-117D-4E21-8B45-B7AE627697BD} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
222250
{A07314A0-02E8-4F36-B233-726D59D28F08} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
223251
{B9647AD4-F6B0-406F-8B79-6781E31600EC} = {B70AFB57-57C9-46DC-84BE-11B7DDD34B40}
252+
{5056C4A2-5E12-4C16-8DA7-8835DA58BFF2} = {8AF4A5C2-F0CE-47D5-A4C5-FE4AB83CA509}
253+
{4D2AE427-F856-49E5-B61D-EA6B17D89051} = {8AF4A5C2-F0CE-47D5-A4C5-FE4AB83CA509}
224254
EndGlobalSection
225255
GlobalSection(ExtensibilityGlobals) = postSolution
226256
SolutionGuid = {049A763A-C891-4E8D-80CF-89DD3E22ADC7}

tests/E2E.Tests/E2E.Tests.csproj

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
<PropertyGroup>
3+
<IsPackable>false</IsPackable>
4+
<SignAssembly>true</SignAssembly>
5+
<AssemblyOriginatorKeyFile>..\..\src\KubernetesClient\kubernetes-client.snk</AssemblyOriginatorKeyFile>
6+
<RootNamespace>k8s.E2E</RootNamespace>
7+
<TargetFrameworks>netcoreapp3.1</TargetFrameworks>
8+
</PropertyGroup>
9+
10+
<ItemGroup>
11+
12+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" />
13+
<PackageReference Include="xunit" Version="2.4.1" />
14+
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
15+
<PrivateAssets>all</PrivateAssets>
16+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
17+
</PackageReference>
18+
<DotNetCliToolReference Include="dotnet-xunit" Version="2.3.1" />
19+
</ItemGroup>
20+
21+
<ItemGroup>
22+
<ProjectReference Include="..\..\src\KubernetesClient\KubernetesClient.csproj" />
23+
<ProjectReference Include="..\SkipTestLogger\SkipTestLogger.csproj" />
24+
</ItemGroup>
25+
26+
<ItemGroup>
27+
<PackageReference Update="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="3.3.1" />
28+
</ItemGroup>
29+
</Project>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System;
2+
using Xunit;
3+
4+
namespace k8s.E2E
5+
{
6+
public sealed class MinikubeFactAttribute : FactAttribute
7+
{
8+
private static readonly bool HasEnv = !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("K8S_E2E_MINIKUBE"));
9+
10+
public override string Skip => !HasEnv ? "K8S_E2_MINIKUBE not set" : null;
11+
}
12+
}

tests/E2E.Tests/MnikubeTests.cs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
using System;
2+
using System.Linq;
3+
using k8s.Models;
4+
using Microsoft.Rest;
5+
using Xunit;
6+
7+
namespace k8s.E2E
8+
{
9+
public class MnikubeTests
10+
{
11+
[MinikubeFact]
12+
public void SimpleTest()
13+
{
14+
var namespaceParameter = "default";
15+
var podName = "k8s-e2e-pod";
16+
17+
var client = CreateClient();
18+
19+
void Cleanup()
20+
{
21+
var pods = client.ListNamespacedPod(namespaceParameter);
22+
if (pods.Items.Any(p => p.Metadata.Name == podName))
23+
{
24+
client.DeleteNamespacedPod(podName, namespaceParameter);
25+
}
26+
}
27+
28+
try
29+
{
30+
Cleanup();
31+
32+
client.CreateNamespacedPod(
33+
new V1Pod()
34+
{
35+
Metadata = new V1ObjectMeta { Name = podName, },
36+
Spec = new V1PodSpec
37+
{
38+
Containers = new[] { new V1Container() { Name = "k8s-e2e", Image = "nginx", }, },
39+
},
40+
},
41+
namespaceParameter);
42+
43+
var pods = client.ListNamespacedPod(namespaceParameter);
44+
Assert.Contains(pods.Items, p => p.Metadata.Name == podName);
45+
}
46+
finally
47+
{
48+
Cleanup();
49+
}
50+
}
51+
52+
private static IKubernetes CreateClient()
53+
{
54+
return new Kubernetes(KubernetesClientConfiguration.BuildDefaultConfig());
55+
}
56+
}
57+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using Microsoft.VisualStudio.TestPlatform.ObjectModel;
5+
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Client;
6+
7+
namespace k8s.E2E
8+
{
9+
// This TestLogger is to log test cases skipped by accident
10+
// when E2E test runs in github action
11+
12+
[FriendlyName("SkipTestLogger")]
13+
[ExtensionUri("logger://Microsoft/TestPlatform/SkipTestLogger/v1")]
14+
public class SkipTestLogger : ITestLoggerWithParameters
15+
{
16+
public void Initialize(TestLoggerEvents events, Dictionary<string, string> parameters)
17+
{
18+
if (parameters.TryGetValue("file", out var file))
19+
{
20+
InnerInitialize(events, file);
21+
}
22+
else
23+
{
24+
throw new ArgumentNullException("file", "log file path must be set");
25+
}
26+
}
27+
28+
private static void InnerInitialize(TestLoggerEvents events, string file)
29+
{
30+
Console.WriteLine($"using {file} for skipped test case log");
31+
events.TestResult += (sender, args) =>
32+
{
33+
using (var w = File.AppendText(file))
34+
{
35+
if (args.Result.Outcome == TestOutcome.Skipped)
36+
{
37+
w.WriteLine(args.Result.DisplayName);
38+
}
39+
}
40+
};
41+
}
42+
43+
public void Initialize(TestLoggerEvents events, string testRunDirectory)
44+
{
45+
InnerInitialize(events, Path.Combine(testRunDirectory, "skip.log"));
46+
}
47+
}
48+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>netstandard2.0</TargetFramework>
5+
</PropertyGroup>
6+
7+
<ItemGroup>
8+
<PackageReference Include="Microsoft.TestPlatform.ObjectModel" Version="16.7.1" />
9+
</ItemGroup>
10+
11+
</Project>

0 commit comments

Comments
 (0)