Exemplo n.º 1
0
    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);
    }
Exemplo n.º 2
0
    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
    }
Exemplo n.º 3
0
    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());
    }
Exemplo n.º 4
0
    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());
    }
Exemplo n.º 5
0
    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)}");
            }
        }
    }
Exemplo n.º 6
0
    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)}");
            }
        }
    }
Exemplo n.º 7
0
    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
    }
Exemplo n.º 8
0
    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;
    }
Exemplo n.º 10
0
    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);
        }
    }
Exemplo n.º 11
0
    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;
        }
    }
Exemplo n.º 12
0
    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;
    }
Exemplo n.º 13
0
    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);
    }