Skip to content

Commit c4e912d

Browse files
committed
Install mixpanel
1 parent 9e7a93c commit c4e912d

10 files changed

Lines changed: 222 additions & 149 deletions

File tree

.github/workflows/main.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ jobs:
4141
buildsPath: Build
4242
projectPath: ${{ matrix.projectPath }}
4343
targetPlatform: ${{ matrix.targetPlatform }}
44-
customParameters: -Development -test ${{ secrets.TEST_SECRET }}
44+
customParameters: -Development -mixpanelToken ${{ secrets.MIXPANEL_TOKEN }}
4545
buildMethod: UnityBuilderAction.Builder.BuildProject
4646
- uses: actions/upload-artifact@v3
4747
with:
Lines changed: 91 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Linq;
34
using System.Reflection;
5+
using mixpanel;
46
using UnityBuilderAction.Input;
57
using UnityBuilderAction.Reporting;
68
using UnityBuilderAction.Versioning;
@@ -10,84 +12,105 @@
1012

1113
namespace UnityBuilderAction
1214
{
13-
static class Builder
14-
{
15-
public static void BuildProject()
15+
internal static class Builder
1616
{
17-
// Gather values from args
18-
var options = ArgumentsParser.GetValidatedOptions();
17+
public static void BuildProject()
18+
{
19+
// Gather values from args
20+
var options = ArgumentsParser.GetValidatedOptions();
1921

20-
// Gather values from project
21-
var scenes = EditorBuildSettings.scenes.Where(scene => scene.enabled).Select(s => s.path).ToArray();
22-
23-
// Get all buildOptions from options
24-
BuildOptions buildOptions = BuildOptions.None;
25-
foreach (string buildOptionString in Enum.GetNames(typeof(BuildOptions))) {
26-
if (options.ContainsKey(buildOptionString)) {
27-
BuildOptions buildOptionEnum = (BuildOptions) Enum.Parse(typeof(BuildOptions), buildOptionString);
28-
buildOptions |= buildOptionEnum;
29-
}
30-
}
22+
InjectSecrets(options);
23+
24+
// Gather values from project
25+
var scenes = EditorBuildSettings.scenes.Where(scene => scene.enabled).Select(s => s.path).ToArray();
26+
27+
// Get all buildOptions from options
28+
var buildOptions = BuildOptions.None;
29+
foreach (var buildOptionString in Enum.GetNames(typeof(BuildOptions)))
30+
{
31+
if (options.ContainsKey(buildOptionString))
32+
{
33+
var buildOptionEnum = (BuildOptions)Enum.Parse(typeof(BuildOptions), buildOptionString);
34+
buildOptions |= buildOptionEnum;
35+
}
36+
}
3137

3238
#if UNITY_2021_2_OR_NEWER
33-
// Determine subtarget
34-
StandaloneBuildSubtarget buildSubtarget;
35-
if (!options.TryGetValue("standaloneBuildSubtarget", out var subtargetValue) || !Enum.TryParse(subtargetValue, out buildSubtarget)) {
36-
buildSubtarget = default;
37-
}
39+
// Determine subtarget
40+
StandaloneBuildSubtarget buildSubtarget;
41+
if (!options.TryGetValue("standaloneBuildSubtarget", out var subtargetValue) || !Enum.TryParse(subtargetValue, out buildSubtarget))
42+
{
43+
buildSubtarget = default;
44+
}
3845
#endif
3946

40-
// Define BuildPlayer Options
41-
var buildPlayerOptions = new BuildPlayerOptions {
42-
scenes = scenes,
43-
locationPathName = options["customBuildPath"],
44-
target = (BuildTarget) Enum.Parse(typeof(BuildTarget), options["buildTarget"]),
45-
options = buildOptions,
47+
// Define BuildPlayer Options
48+
var buildPlayerOptions = new BuildPlayerOptions
49+
{
50+
scenes = scenes,
51+
locationPathName = options["customBuildPath"],
52+
target = (BuildTarget)Enum.Parse(typeof(BuildTarget), options["buildTarget"]),
53+
options = buildOptions,
4654
#if UNITY_2021_2_OR_NEWER
47-
subtarget = (int) buildSubtarget
55+
subtarget = (int)buildSubtarget
4856
#endif
49-
};
57+
};
5058

51-
// Set version for this build
52-
VersionApplicator.SetVersion(options["buildVersion"]);
53-
54-
// Apply Android settings
55-
if (buildPlayerOptions.target == BuildTarget.Android)
56-
{
57-
VersionApplicator.SetAndroidVersionCode(options["androidVersionCode"]);
58-
AndroidSettings.Apply(options);
59-
}
60-
61-
// Execute default AddressableAsset content build, if the package is installed.
62-
// Version defines would be the best solution here, but Unity 2018 doesn't support that,
63-
// so we fall back to using reflection instead.
64-
var addressableAssetSettingsType = Type.GetType(
65-
"UnityEditor.AddressableAssets.Settings.AddressableAssetSettings,Unity.Addressables.Editor");
66-
if (addressableAssetSettingsType != null)
67-
{
68-
// ReSharper disable once PossibleNullReferenceException, used from try-catch
69-
try
70-
{
71-
addressableAssetSettingsType.GetMethod("CleanPlayerContent", BindingFlags.Static | BindingFlags.Public)
72-
.Invoke(null, new object[] {null});
73-
addressableAssetSettingsType.GetMethod("BuildPlayerContent", new Type[0]).Invoke(null, new object[0]);
74-
}
75-
catch (Exception e)
76-
{
77-
Debug.LogError($"Failed to run default addressables build:\n{e}");
78-
}
79-
}
59+
// Set version for this build
60+
VersionApplicator.SetVersion(options["buildVersion"]);
8061

81-
// Perform build
82-
BuildReport buildReport = BuildPipeline.BuildPlayer(buildPlayerOptions);
62+
// Apply Android settings
63+
if (buildPlayerOptions.target == BuildTarget.Android)
64+
{
65+
VersionApplicator.SetAndroidVersionCode(options["androidVersionCode"]);
66+
AndroidSettings.Apply(options);
67+
}
8368

84-
// Summary
85-
BuildSummary summary = buildReport.summary;
86-
StdOutReporter.ReportSummary(summary);
69+
// Execute default AddressableAsset content build, if the package is installed.
70+
// Version defines would be the best solution here, but Unity 2018 doesn't support that,
71+
// so we fall back to using reflection instead.
72+
var addressableAssetSettingsType = Type.GetType(
73+
"UnityEditor.AddressableAssets.Settings.AddressableAssetSettings,Unity.Addressables.Editor");
74+
if (addressableAssetSettingsType != null)
75+
{
76+
// ReSharper disable once PossibleNullReferenceException, used from try-catch
77+
try
78+
{
79+
addressableAssetSettingsType.GetMethod("CleanPlayerContent", BindingFlags.Static | BindingFlags.Public)
80+
.Invoke(null, new object[]
81+
{
82+
null
83+
});
84+
addressableAssetSettingsType.GetMethod("BuildPlayerContent", new Type[0]).Invoke(null, new object[0]);
85+
}
86+
catch (Exception e)
87+
{
88+
Debug.LogError($"Failed to run default addressables build:\n{e}");
89+
}
90+
}
8791

88-
// Result
89-
BuildResult result = summary.result;
90-
StdOutReporter.ExitWithResult(result);
92+
// Perform build
93+
var buildReport = BuildPipeline.BuildPlayer(buildPlayerOptions);
94+
95+
// Summary
96+
var summary = buildReport.summary;
97+
StdOutReporter.ReportSummary(summary);
98+
99+
// Result
100+
var result = summary.result;
101+
StdOutReporter.ExitWithResult(result);
102+
}
103+
104+
private static void InjectSecrets(Dictionary<string, string> options)
105+
{
106+
if (options.TryGetValue("mixpanelToken", out var mixpanelToken))
107+
{
108+
var mixpanelSettings = MixpanelSettings.Instance;
109+
mixpanelSettings.RuntimeToken = mixpanelToken;
110+
EditorUtility.SetDirty(mixpanelSettings);
111+
}
112+
113+
AssetDatabase.SaveAssets();
114+
}
91115
}
92-
}
93-
}
116+
}

Samples/AppKit Sample/Assets/Editor/UnityBuilderAction/Input/ArgumentsParser.cs

Lines changed: 81 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -5,82 +5,97 @@
55

66
namespace UnityBuilderAction.Input
77
{
8-
public class ArgumentsParser
9-
{
10-
static string EOL = Environment.NewLine;
11-
static readonly string[] Secrets = { "androidKeystorePass", "androidKeyaliasName", "androidKeyaliasPass" };
12-
13-
public static Dictionary<string, string> GetValidatedOptions()
8+
public class ArgumentsParser
149
{
15-
Dictionary<string, string> validatedOptions;
16-
ParseCommandLineArguments(out validatedOptions);
10+
private static string EOL = Environment.NewLine;
1711

18-
string projectPath;
19-
if (!validatedOptions.TryGetValue("projectPath", out projectPath)) {
20-
Console.WriteLine("Missing argument -projectPath");
21-
EditorApplication.Exit(110);
22-
}
12+
private static readonly string[] Secrets =
13+
{
14+
"androidKeystorePass",
15+
"androidKeyaliasName",
16+
"androidKeyaliasPass",
17+
"mixpanelToken"
18+
};
2319

24-
string buildTarget;
25-
if (!validatedOptions.TryGetValue("buildTarget", out buildTarget)) {
26-
Console.WriteLine("Missing argument -buildTarget");
27-
EditorApplication.Exit(120);
28-
}
20+
public static Dictionary<string, string> GetValidatedOptions()
21+
{
22+
Dictionary<string, string> validatedOptions;
23+
ParseCommandLineArguments(out validatedOptions);
2924

30-
if (!Enum.IsDefined(typeof(BuildTarget), buildTarget)) {
31-
Console.WriteLine($"{buildTarget} is not a defined {nameof(BuildTarget)}");
32-
EditorApplication.Exit(121);
33-
}
25+
string projectPath;
26+
if (!validatedOptions.TryGetValue("projectPath", out projectPath))
27+
{
28+
Console.WriteLine("Missing argument -projectPath");
29+
EditorApplication.Exit(110);
30+
}
3431

35-
string customBuildPath;
36-
if (!validatedOptions.TryGetValue("customBuildPath", out customBuildPath)) {
37-
Console.WriteLine("Missing argument -customBuildPath");
38-
EditorApplication.Exit(130);
39-
}
32+
string buildTarget;
33+
if (!validatedOptions.TryGetValue("buildTarget", out buildTarget))
34+
{
35+
Console.WriteLine("Missing argument -buildTarget");
36+
EditorApplication.Exit(120);
37+
}
4038

41-
const string defaultCustomBuildName = "TestBuild";
42-
string customBuildName;
43-
if (!validatedOptions.TryGetValue("customBuildName", out customBuildName)) {
44-
Console.WriteLine($"Missing argument -customBuildName, defaulting to {defaultCustomBuildName}.");
45-
validatedOptions.Add("customBuildName", defaultCustomBuildName);
46-
} else if (customBuildName == "") {
47-
Console.WriteLine($"Invalid argument -customBuildName, defaulting to {defaultCustomBuildName}.");
48-
validatedOptions.Add("customBuildName", defaultCustomBuildName);
49-
}
39+
if (!Enum.IsDefined(typeof(BuildTarget), buildTarget))
40+
{
41+
Console.WriteLine($"{buildTarget} is not a defined {nameof(BuildTarget)}");
42+
EditorApplication.Exit(121);
43+
}
5044

51-
return validatedOptions;
52-
}
45+
string customBuildPath;
46+
if (!validatedOptions.TryGetValue("customBuildPath", out customBuildPath))
47+
{
48+
Console.WriteLine("Missing argument -customBuildPath");
49+
EditorApplication.Exit(130);
50+
}
5351

54-
static void ParseCommandLineArguments(out Dictionary<string, string> providedArguments)
55-
{
56-
providedArguments = new Dictionary<string, string>();
57-
string[] args = Environment.GetCommandLineArgs();
52+
const string defaultCustomBuildName = "TestBuild";
53+
string customBuildName;
54+
if (!validatedOptions.TryGetValue("customBuildName", out customBuildName))
55+
{
56+
Console.WriteLine($"Missing argument -customBuildName, defaulting to {defaultCustomBuildName}.");
57+
validatedOptions.Add("customBuildName", defaultCustomBuildName);
58+
}
59+
else if (customBuildName == "")
60+
{
61+
Console.WriteLine($"Invalid argument -customBuildName, defaulting to {defaultCustomBuildName}.");
62+
validatedOptions.Add("customBuildName", defaultCustomBuildName);
63+
}
64+
65+
return validatedOptions;
66+
}
67+
68+
private static void ParseCommandLineArguments(out Dictionary<string, string> providedArguments)
69+
{
70+
providedArguments = new Dictionary<string, string>();
71+
var args = Environment.GetCommandLineArgs();
5872

59-
Console.WriteLine(
60-
$"{EOL}" +
61-
$"###########################{EOL}" +
62-
$"# Parsing settings #{EOL}" +
63-
$"###########################{EOL}" +
64-
$"{EOL}"
65-
);
73+
Console.WriteLine(
74+
$"{EOL}" +
75+
$"###########################{EOL}" +
76+
$"# Parsing settings #{EOL}" +
77+
$"###########################{EOL}" +
78+
$"{EOL}"
79+
);
6680

67-
// Extract flags with optional values
68-
for (int current = 0, next = 1; current < args.Length; current++, next++) {
69-
// Parse flag
70-
bool isFlag = args[current].StartsWith("-");
71-
if (!isFlag) continue;
72-
string flag = args[current].TrimStart('-');
81+
// Extract flags with optional values
82+
for (int current = 0, next = 1; current < args.Length; current++, next++)
83+
{
84+
// Parse flag
85+
var isFlag = args[current].StartsWith("-");
86+
if (!isFlag) continue;
87+
var flag = args[current].TrimStart('-');
7388

74-
// Parse optional value
75-
bool flagHasValue = next < args.Length && !args[next].StartsWith("-");
76-
string value = flagHasValue ? args[next].TrimStart('-') : "";
77-
bool secret = Secrets.Contains(flag);
78-
string displayValue = secret ? "*HIDDEN*" : "\"" + value + "\"";
89+
// Parse optional value
90+
var flagHasValue = next < args.Length && !args[next].StartsWith("-");
91+
var value = flagHasValue ? args[next].TrimStart('-') : "";
92+
var secret = Secrets.Contains(flag);
93+
var displayValue = secret ? "*HIDDEN*" : "\"" + value + "\"";
7994

80-
// Assign
81-
Console.WriteLine($"Found flag \"{flag}\" with value {displayValue}.");
82-
providedArguments.Add(flag, value);
83-
}
95+
// Assign
96+
Console.WriteLine($"Found flag \"{flag}\" with value {displayValue}.");
97+
providedArguments.Add(flag, value);
98+
}
99+
}
84100
}
85-
}
86-
}
101+
}

Samples/AppKit Sample/Assets/Editor/UnityBuilderAction/UnityBuilderAction.asmdef

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
{
22
"name": "UnityBuilderAction",
3-
"references": [],
3+
"rootNamespace": "",
4+
"references": [
5+
"GUID:21462402cefc5dd4ba284fb769521eff",
6+
"GUID:4b36be810ca32874697e674b28afe620",
7+
"GUID:9887bf5401cdc9140916d3edbea10b69"
8+
],
49
"includePlatforms": [
510
"Editor"
611
],
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
%YAML 1.1
2+
%TAG !u! tag:unity3d.com,2011:
3+
--- !u!114 &11400000
4+
MonoBehaviour:
5+
m_ObjectHideFlags: 0
6+
m_CorrespondingSourceObject: {fileID: 0}
7+
m_PrefabInstance: {fileID: 0}
8+
m_PrefabAsset: {fileID: 0}
9+
m_GameObject: {fileID: 0}
10+
m_Enabled: 1
11+
m_EditorHideFlags: 0
12+
m_Script: {fileID: 11500000, guid: 5e37f1d599a72b64eba3799d826c755b, type: 3}
13+
m_Name: Mixpanel
14+
m_EditorClassIdentifier:
15+
ShowDebug: 1
16+
ManualInitialization: 0
17+
APIHostAddress: https://api.mixpanel.com/
18+
RuntimeToken:
19+
DebugToken:
20+
FlushInterval: 60
21+
UseIpAddressForGeolocation: 1

0 commit comments

Comments
 (0)