static void PushGithub(BuildManagerSettings settings, BuildSequence sequence, BuildData data) { StringBuilder fileName = new StringBuilder(128); StringBuilder args = new StringBuilder(128); string githubReleaseExe = Application.dataPath + "/" + githubReleasesRelativePath; fileName.Append(githubReleaseExe); args.Append(" upload "); args.Append($"--security-token \"{settings.GithubToken}\" "); args.Append($"--user {settings.githubUserName} "); args.Append($"--auth-user {settings.githubUserName} "); args.Append($"--repo {settings.githubRepoName} "); args.Append($"--tag v{PlayerSettings.bundleVersion} "); args.Append($"--name \"{GetPathWithVars(data, data.dirPathForPostProcess)}\" "); //download file name args.Append($"--label \"{GetPathWithVars(data, data.dirPathForPostProcess)}\" "); //name in releases args.Append($"--file \"{Path.Combine(Application.dataPath, "..", data.outputRoot, GetPathWithVarsForZip(data, data.dirPathForPostProcess)).Replace("\\", "/")}\" "); args.Append($"--replace "); Debug.Log(fileName.ToString() + args.ToString()); ProcessStartInfo info = new ProcessStartInfo(fileName.ToString(), args.ToString()) { UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true }; Process.Start(info); }
public static void RunBuildSequnce(BuildManagerSettings settings, BuildSequence sequence, ChangelogData changelog) { // Start init usedChangelog = changelog; ChangelogData.ChangelogVersionEntry usedChangelogEntry = changelog.GetLastVersion(); buildNameString = usedChangelogEntry.GetVersionHeader(); #if GAME_TEMPLATE TemplateGameManager.Instance.buildNameString = buildNameString; TemplateGameManager.Instance.productName = PlayerSettings.productName; EditorUtility.SetDirty(TemplateGameManager.Instance); #endif usedDate = DateTime.Now; //End init Debug.Log("Start building all"); DateTime startTime = DateTime.Now; //Crete release here, because build's not get pushed CreateGitHubReleaseIfNeeded(settings, sequence); Build(settings, sequence); PostBuild(sequence); Compress(sequence); ItchioPush(settings, sequence, changelog); GithubPush(settings, sequence, changelog); Debug.Log($"End building all. Elapsed time: {string.Format("{0:mm\\:ss}", DateTime.Now - startTime)}"); #if UNITY_EDITOR_WIN ShowExplorer(sequence.builds[sequence.builds.Count - 1].outputRoot); #endif }
static void CreateGitHubRelease(BuildManagerSettings settings) { StringBuilder fileName = new StringBuilder(128); StringBuilder args = new StringBuilder(128); string githubReleaseExe = Application.dataPath + "/" + githubReleasesRelativePath; if (!File.Exists(githubReleaseExe)) { Debug.LogWarning("GitHub release not found."); DownloadGithubRelease(); } fileName.Append(githubReleaseExe); args.Append(" release "); args.Append($"--security-token \"{settings.GithubToken}\" "); args.Append($"--user {settings.githubUserName} "); args.Append($"--repo {settings.githubRepoName} "); args.Append($"--tag v{PlayerSettings.bundleVersion} "); args.Append($"--name \"{buildNameString}\" "); args.Append($"--description \"{usedChangelog.GetLastChangelogString()}\" "); Debug.Log(fileName.ToString() + args.ToString()); Process.Start(fileName.ToString(), args.ToString()); }
static void PushItch(BuildManagerSettings settings, BuildSequence sequence, BuildData data) { StringBuilder fileName = new StringBuilder(128); StringBuilder args = new StringBuilder(128); string butlerPath = Application.dataPath + "/" + butlerRelativePath; if (!File.Exists(butlerPath)) { Debug.LogWarning("Butler not found."); DownloadButler(); } fileName.Append(butlerPath); args.Append(" push \""); args.Append(Application.dataPath); args.Append("/../"); args.Append(data.outputRoot + GetPathWithVars(data, data.dirPathForPostProcess)); args.Append("\" "); args.Append($"{settings.itchGameLink}:{data.itchChannel} "); args.Append($"--userversion \"{buildNameString}\" "); Debug.Log(fileName.ToString() + args.ToString()); Process.Start(fileName.ToString(), args.ToString()); }
static void ItchioPush(BuildManagerSettings settings, BuildSequence sequence, ChangelogData changelog) { for (byte i = 0; i < sequence.builds.Count; ++i) { if (!sequence.builds[i].isEnabled || !sequence.builds[i].needItchPush) { continue; } if (!string.IsNullOrEmpty(buildsPath[i])) { if (string.IsNullOrEmpty(settings.itchGameLink)) { Debug.LogWarning($"Can't push itch.io. Required data is missing"); return; } PushItch(settings, sequence, sequence.builds[i]); } else { Debug.LogWarning($"[Itch.io push] Can't find build for {GetBuildTargetExecutable(sequence.builds[i].target)}"); } } }
static void GithubPush(BuildManagerSettings settings, BuildSequence sequence, ChangelogData changelog) { for (byte i = 0; i < sequence.builds.Count; ++i) { if (!sequence.builds[i].isEnabled || !sequence.builds[i].needGithubPush) { continue; } if (!string.IsNullOrEmpty(buildsPath[i])) { if (string.IsNullOrEmpty(settings.GithubToken) || string.IsNullOrEmpty(settings.githubUserName) || string.IsNullOrEmpty(settings.githubRepoName)) { Debug.LogWarning($"Can't push github release. Required data is missing"); return; } PushGithub(settings, sequence, sequence.builds[i]); } else { Debug.LogWarning($"[GitHub push] Can't find build for {GetBuildTargetExecutable(sequence.builds[i].target)}"); } } }
public static void RunBuildSequnce(BuildManagerSettings settings, BuildSequence sequence, ChangelogData changelog) { // Start init buildNameString = $"{PlayerSettings.bundleVersion} - {changelog.updateName}"; #if GAME_TEMPLATE TemplateGameManager.InstanceEditor.buildNameString = buildNameString; TemplateGameManager.InstanceEditor.productName = PlayerSettings.productName; #endif usedDate = DateTime.Now; //End init Debug.Log("Start building all"); DateTime startTime = DateTime.Now; Build(settings, sequence); PostBuild(sequence); Compress(sequence); ItchioPush(sequence, changelog); Debug.Log($"End building all. Elapsed time: {string.Format("{0:mm\\:ss}", DateTime.Now - startTime)}"); #if UNITY_EDITOR_WIN ShowExplorer(sequence.builds[sequence.builds.Count - 1].outputRoot); #endif }
public void CloneInto(BuildManagerSettings settings) { scriptingDefineSymbols = settings.scriptingDefineSymbols; sequences = new List <BuildSequence>(settings.sequences.Count); for (int i = 0; i < settings.sequences.Count; ++i) { sequences.Add(settings.sequences[i].Clone() as BuildSequence); } }
static void LoadSettings() { settingsPath = PlayerPrefs.GetString(SETTINGS_PATH_KEY, ""); settings = null; //Find path. Try to load settings if (!string.IsNullOrEmpty(settingsPath)) { settings = AssetDatabase.LoadAssetAtPath <BuildManagerSettings>(settingsPath); if (settings == null) { settingsPath = null; } } //No path, or cant locate asset at path. Try to find settings in assets. if (string.IsNullOrEmpty(settingsPath)) { string[] guids = AssetDatabase.FindAssets("t:BuildManagerSettings"); if (guids.Length >= 2) { Debug.LogError("[BuildManagerWindow]. 2+ BuildManagerSettings exist. Consider on using only 1 setting. The first on will be used."); } if (guids.Length != 0) { settingsPath = AssetDatabase.GUIDToAssetPath(guids[0]); PlayerPrefs.SetString(SETTINGS_PATH_KEY, settingsPath); settings = AssetDatabase.LoadAssetAtPath <BuildManagerSettings>(settingsPath); } } //Cant find settings. Create new if (settings == null) { settings = (BuildManagerSettings)ScriptableObject.CreateInstance(typeof(BuildManagerSettings)); AssetDatabase.CreateAsset(settings, SETTINGS_DEFAULT_PATH); settingsPath = SETTINGS_DEFAULT_PATH; PlayerPrefs.SetString(SETTINGS_PATH_KEY, SETTINGS_DEFAULT_PATH); } sequencesList = new InspectorList <BuildSequence>(); sequencesList.Init(settings.sequences, "Builds sequences", (BuildSequence seq, int i) => seq.editorName); buidsList = new InspectorList <BuildData>(); buidsList.Init(sequencesList.Selected.builds, "Builds", FormBuildNameInList); sequencesList.OnChangeSelectionAction += OnSequenceSelectionChanged; buidsList.OnChangeSelectionAction += OnBuildSelectionChanged; }
static void LoadSettings() { settingsPath = PlayerPrefs.GetString(SETTINGS_PATH_KEY, ""); settings = null; //Find path. Try to load settings if (!string.IsNullOrEmpty(settingsPath)) { settings = AssetDatabase.LoadAssetAtPath <BuildManagerSettings>(settingsPath); if (settings == null) { settingsPath = null; } } //No path, or cant locate asset at path. Try to find settings in assets. if (string.IsNullOrEmpty(settingsPath)) { string[] guids = AssetDatabase.FindAssets("t:BuildManagerSettings", new string[] { "Assets" }); if (guids.Length >= 2) { Debug.LogError("[BuildManagerWindow]. 2+ BuildManagerSettings exist. Consider on using only 1 setting. The first one will be used."); } if (guids.Length != 0) { settingsPath = AssetDatabase.GUIDToAssetPath(guids[0]); PlayerPrefs.SetString(SETTINGS_PATH_KEY, settingsPath); settings = AssetDatabase.LoadAssetAtPath <BuildManagerSettings>(settingsPath); } } //Cant find settings. Create new if (settings == null) { BuildManagerSettings defaultSettings = AssetDatabase.LoadAssetAtPath <BuildManagerSettings>(AssetDatabase.GUIDToAssetPath(AssetDatabase.FindAssets("t:BuildManagerSettings", new string[] { "Packages" })[0])); settings = (BuildManagerSettings)ScriptableObject.CreateInstance(typeof(BuildManagerSettings)); settings.CloneInto(defaultSettings); AssetDatabase.CreateAsset(settings, SETTINGS_DEFAULT_PATH); settingsPath = SETTINGS_DEFAULT_PATH; PlayerPrefs.SetString(SETTINGS_PATH_KEY, SETTINGS_DEFAULT_PATH); } }
static void CreateGitHubReleaseIfNeeded(BuildManagerSettings settings, BuildSequence sequence) { for (byte i = 0; i < sequence.builds.Count; ++i) { if (!sequence.builds[i].isEnabled || !sequence.builds[i].needGithubPush) { continue; } if (string.IsNullOrEmpty(settings.GithubToken) || string.IsNullOrEmpty(settings.githubUserName) || string.IsNullOrEmpty(settings.githubRepoName)) { Debug.LogWarning($"Can't create github release. Required data is missing"); return; } CreateGitHubRelease(settings); break; } }
static void Build(BuildManagerSettings settings, BuildSequence sequence) { BuildTarget targetBeforeStart = EditorUserBuildSettings.activeBuildTarget; BuildTargetGroup targetGroupBeforeStart = BuildPipeline.GetBuildTargetGroup(targetBeforeStart); string definesBeforeStart = PlayerSettings.GetScriptingDefineSymbolsForGroup(targetGroupBeforeStart); bool isVRSupported = PlayerSettings.virtualRealitySupported; //TODO: PlayerSettings.virtualRealitySupported is deprecated. Replace with smth new buildsPath = new string[sequence.builds.Count]; for (byte i = 0; i < sequence.builds.Count; ++i) { BuildData data = sequence.builds[i]; if (!data.isEnabled) { continue; } if (PlayerSettings.virtualRealitySupported != data.isVirtualRealitySupported) { PlayerSettings.virtualRealitySupported = data.isVirtualRealitySupported; } buildsPath[i] = BaseBuild( data.targetGroup, data.target, data.options, data.outputRoot + GetPathWithVars(data, data.middlePath), string.Concat(settings.scriptingDefineSymbols, ";", sequence.scriptingDefineSymbolsOverride, ";", data.scriptingDefineSymbolsOverride), data.isPassbyBuild, data.isReleaseBuild ); } EditorUserBuildSettings.SwitchActiveBuildTarget(targetGroupBeforeStart, targetBeforeStart); PlayerSettings.SetScriptingDefineSymbolsForGroup(targetGroupBeforeStart, definesBeforeStart); PlayerSettings.virtualRealitySupported = isVRSupported; }
public static void RunBuildSequnce(BuildManagerSettings settings, BuildSequence sequence, ChangelogData changelog) { // Start init string buildNameString = $"{PlayerSettings.bundleVersion} - {changelog.updateName}"; #if GAME_TEMPLATE TemplateGameManager.InstanceEditor.buildNameString = buildNameString; TemplateGameManager.InstanceEditor.productName = PlayerSettings.productName; #endif usedDate = DateTime.Now; //End init Debug.Log("Start building all"); DateTime startTime = DateTime.Now; BuildTarget targetBeforeStart = EditorUserBuildSettings.activeBuildTarget; BuildTargetGroup targetGroupBeforeStart = BuildPipeline.GetBuildTargetGroup(targetBeforeStart); string definesBeforeStart = PlayerSettings.GetScriptingDefineSymbolsForGroup(targetGroupBeforeStart); bool isVRSupported = PlayerSettings.virtualRealitySupported; //TODO: PlayerSettings.virtualRealitySupported is deprecated. Replace with smth new string[] buildsPath = new string[sequence.builds.Count]; for (byte i = 0; i < sequence.builds.Count; ++i) { BuildData data = sequence.builds[i]; if (!data.isEnabled) { continue; } if (PlayerSettings.virtualRealitySupported != data.isVirtualRealitySupported) { PlayerSettings.virtualRealitySupported = data.isVirtualRealitySupported; } buildsPath[i] = BaseBuild( data.targetGroup, data.target, data.options, data.outputRoot + GetPathWithVars(data, data.middlePath), string.Concat(settings.scriptingDefineSymbols, ";", sequence.scriptingDefineSymbolsOverride, ";", data.scriptingDefineSymbolsOverride), data.isPassbyBuild, data.isReleaseBuild ); } EditorUserBuildSettings.SwitchActiveBuildTarget(targetGroupBeforeStart, targetBeforeStart); PlayerSettings.SetScriptingDefineSymbolsForGroup(targetGroupBeforeStart, definesBeforeStart); PlayerSettings.virtualRealitySupported = isVRSupported; Debug.Log($"End building all. Elapsed time: {string.Format("{0:mm\\:ss}", DateTime.Now - startTime)}"); for (byte i = 0; i < sequence.builds.Count; ++i) { if (!sequence.builds[i].needZip || !sequence.builds[i].isEnabled) { continue; } if (sequence.builds[i].target == BuildTarget.Android) { Debug.Log("Skip android build to .zip, because .apk files already compressed"); continue; } if (!string.IsNullOrEmpty(buildsPath[i])) { if (sequence.builds[i].isReleaseBuild) //Destroy IL2CPP junk after build { string buildRootPath = Path.GetDirectoryName(buildsPath[i]); string[] dirs = Directory.GetDirectories(buildRootPath); var il2cppDirs = dirs.Where(s => s.Contains("BackUpThisFolder_ButDontShipItWithYourGame")); foreach (var dir in il2cppDirs) { Directory.Delete(dir, true); } } } } startTime = DateTime.Now; Debug.Log($"Start compressing all"); for (byte i = 0; i < sequence.builds.Count; ++i) { if (!sequence.builds[i].needZip || !sequence.builds[i].isEnabled) { continue; } if (sequence.builds[i].target == BuildTarget.Android) { Debug.Log("Skip android build to .zip, because .apk files already compressed"); continue; } if (!string.IsNullOrEmpty(buildsPath[i])) { BaseCompress(sequence.builds[i].outputRoot + GetPathWithVars(sequence.builds[i], sequence.builds[i].compressDirPath)); } else { Debug.LogWarning($"[Compressing] Can't find build for {GetBuildTargetExecutable(sequence.builds[i].target)}"); } } Debug.Log($"End compressing all. Elapsed time: {string.Format("{0:mm\\:ss}", DateTime.Now - startTime)}"); for (byte i = 0; i < sequence.builds.Count; ++i) { if (!sequence.builds[i].needItchPush || !sequence.builds[i].isEnabled) { continue; } if (!string.IsNullOrEmpty(buildsPath[i])) { if (sequence.builds[i].itchAddLastChangelogUpdateNameToVerison && !string.IsNullOrEmpty(changelog?.updateName)) { sequence.builds[i].itchLastChangelogUpdateName = buildNameString; } PushItch(sequence, sequence.builds[i]); } else { Debug.LogWarning($"[Itch.io push] Can't find build for {GetBuildTargetExecutable(sequence.builds[i].target)}"); } } ShowExplorer(sequence.builds[sequence.builds.Count - 1].outputRoot); }