private static BuildMetaInfo GetBuildMetaInfo()
        {
            BuildMetaInfo instance = BuildMetaInfo.Instance;

            if (instance != null)
            {
                return(instance);
            }

            instance = ScriptableObject.CreateInstance <BuildMetaInfo>();
            AssetDatabase.CreateAsset(instance, BuildMetaInfoPath);

            return(instance);
        }
        public void OnPreprocessBuild(BuildReport report)
        {
#if UNITY_CLOUD_BUILD
            BuildMetaInfo buildMetaInfo = BuildMetaInfo.Instance;

#if UNITY_IOS
            Version version = buildMetaInfo.Version;
            PlayerSettings.bundleVersion = $"{version.Major}.{version.Minor}.{version.Build}";
#else
            PlayerSettings.bundleVersion = buildMetaInfo.ShortVersionName;
#endif
            PlayerSettings.macOS.buildNumber         = buildMetaInfo.CloudBuildBuildNumber.ToString();
            PlayerSettings.iOS.buildNumber           = buildMetaInfo.CloudBuildBuildNumber.ToString();
            PlayerSettings.Android.bundleVersionCode = buildMetaInfo.CloudBuildBuildNumber;
#endif
        }
        private static void PreBuildInternal()
        {
            BuildMetaInfo buildMetaInfo = GetBuildMetaInfo();

            buildMetaInfo.BuildDateTime  = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ssZ");
            buildMetaInfo.BuildDayOfYear = DateTime.UtcNow.DayOfYear;

#if !UNITY_CLOUD_BUILD
            string output;
            int    exitCode;
            try
            {
                ExecuteCommand("git", "rev-parse --abbrev-ref HEAD", out output, out exitCode, timeout: 20000);
                if (exitCode != 0)
                {
                    throw new Exception("exitCode != 0");
                }

                buildMetaInfo.GitBranchName = output;
            }
            catch (Exception e)
            {
                buildMetaInfo.GitBranchName = "[error]";
                Debug.LogException(e);
            }

            try
            {
                ExecuteCommand("git", "log --pretty=format:%h -n 1", out output, out exitCode, timeout: 20000);
                if (exitCode != 0)
                {
                    throw new Exception("exitCode != 0");
                }

                buildMetaInfo.GitCommitHash = output;
            }
            catch (Exception e)
            {
                buildMetaInfo.GitCommitHash = "[error]";
                Debug.LogException(e);
            }
#endif

            EditorUtility.SetDirty(buildMetaInfo);
        }
        // ReSharper disable once RedundantNameQualifier
        public static void PreCloudBuildExport(UnityEngine.CloudBuild.BuildManifestObject manifest)
        {
#if UNITY_CLOUD_BUILD
            Debug.Log("Cloud Build manifest:\r\n" + manifest.ToJson());
#endif

            BuildMetaInfo buildMetaInfo = GetBuildMetaInfo();
            buildMetaInfo.GitBranchName         = manifest.GetValue <string>("scmBranch");
            buildMetaInfo.GitCommitHash         = manifest.GetValue <string>("scmCommitId");
            buildMetaInfo.CloudBuildBuildNumber = Convert.ToInt32(manifest.GetValue <string>("buildNumber"));
            buildMetaInfo.CloudBuildTargetName  = manifest.GetValue <string>("cloudBuildTargetName");

            const int gitShortHashLength = 8;
            buildMetaInfo.GitCommitHash = buildMetaInfo.GitCommitHash.Substring(0,
                                                                                buildMetaInfo.GitCommitHash.Length > gitShortHashLength ?
                                                                                gitShortHashLength :
                                                                                buildMetaInfo.GitCommitHash.Length);

            EditorUtility.SetDirty(buildMetaInfo);
        }