示例#1
0
        /// <summary>
        /// Gets the effective environment variables, taking into account default and machine-specific values
        /// </summary>
        public IBuildParameters GetEffectiveEnvironmentVariables(Process pip, PipFragmentRenderer pipFragmentRenderer, int currentUserRetryCount, IReadOnlyList <string> globalUnsafePassthroughEnvironmentVariables = null)
        {
            Contract.Requires(pipFragmentRenderer != null);
            Contract.Requires(pip != null);
            Contract.Requires(currentUserRetryCount >= 0);

            var trackedEnv          = pip.EnvironmentVariables.Where(envVar => !envVar.IsPassThrough);
            var passThroughEnvNames = pip.EnvironmentVariables.Where(envVar => envVar.IsPassThrough).Select(envVar => pipFragmentRenderer.Render(envVar.Name));

            // Append any passthrough environment variables if they're specified
            passThroughEnvNames = globalUnsafePassthroughEnvironmentVariables != null?passThroughEnvNames.Union(globalUnsafePassthroughEnvironmentVariables) : passThroughEnvNames;

            IBuildParameters fullEnvironmentForPassThrough = OrchestratorEnvironmentVariables != null?

                                                             // We first look at the env variables from the worker,
                                                             // then if the pass through variable is unset, we look at the env variables from the orchestrator.
                                                             // That's why, if OrchestratorEnvironmentVariables is not null, it is overridden by the current environment variables.
                                                             GetFactory(ReportDuplicateVariable).PopulateFromDictionary(OrchestratorEnvironmentVariables).Override(FullEnvironmentVariables.ToDictionary()) :
                                                                 FullEnvironmentVariables;

            IBuildParameters effectiveVariables = m_baseEnvironmentVariables
                                                  .Override(trackedEnv.ToDictionary(
                                                                envVar => pipFragmentRenderer.Render(envVar.Name),
                                                                envVar => envVar.Value.ToString(pipFragmentRenderer)))
                                                  .Override(fullEnvironmentForPassThrough.Select(passThroughEnvNames).ToDictionary());

            // If the variable to indicate the retry attempt is set, make sure it gets populated
            if (pip.RetryAttemptEnvironmentVariable.IsValid)
            {
                effectiveVariables = effectiveVariables.Override(
                    new[] { new KeyValuePair <string, string>(pipFragmentRenderer.Render(pip.RetryAttemptEnvironmentVariable), currentUserRetryCount.ToString()) });
            }

            return(effectiveVariables);
        }
示例#2
0
        /// <summary>
        /// Gets the effective environment variables, taking into account default and machine-specific values
        /// </summary>
        public IBuildParameters GetEffectiveEnvironmentVariables(Process pip, PipFragmentRenderer pipFragmentRenderer, IReadOnlyList <string> globalUnsafePassthroughEnvironmentVariables = null)
        {
            Contract.Requires(pipFragmentRenderer != null);
            Contract.Requires(pip != null);
            Contract.Ensures(Contract.Result <IBuildParameters>() != null);

            var trackedEnv          = pip.EnvironmentVariables.Where(envVar => !envVar.IsPassThrough);
            var passThroughEnvNames = pip.EnvironmentVariables.Where(envVar => envVar.IsPassThrough).Select(envVar => pipFragmentRenderer.Render(envVar.Name));

            // Append any passthrough environment variables if they're specified
            passThroughEnvNames = globalUnsafePassthroughEnvironmentVariables != null?passThroughEnvNames.Union(globalUnsafePassthroughEnvironmentVariables) : passThroughEnvNames;

            IBuildParameters fullEnvironmentForPassThrough = MasterEnvironmentVariables != null?

                                                             // We first look at the env variables from the worker,
                                                             // then if the pass through variable is unset, we look at the env variables from the master.
                                                             // That's why, if MasterEnvironmentVariables is not null, it is overridden by the current environment variables.
                                                             GetFactory(ReportDuplicateVariable).PopulateFromDictionary(MasterEnvironmentVariables).Override(FullEnvironmentVariables.ToDictionary()) :
                                                                 FullEnvironmentVariables;

            return(m_baseEnvironmentVariables
                   .Override(trackedEnv.ToDictionary(
                                 envVar => pipFragmentRenderer.Render(envVar.Name),
                                 envVar => envVar.Value.ToString(pipFragmentRenderer)))
                   .Override(fullEnvironmentForPassThrough.Select(passThroughEnvNames).ToDictionary()));
        }
示例#3
0
 /// <inheritdoc />
 public ReturnCode PostDependency(IBuildParameters buildParameters, IDependencyData dependencyData)
 {
     if (PostDependencyCallback != null)
     {
         return(PostDependencyCallback(buildParameters, dependencyData));
     }
     return(ReturnCode.Success);
 }
示例#4
0
 /// <inheritdoc />
 public ReturnCode PostPacking(IBuildParameters buildParameters, IDependencyData dependencyData, IWriteData writeData)
 {
     if (PostPackingCallback != null)
     {
         return(PostPackingCallback(buildParameters, dependencyData, writeData));
     }
     return(ReturnCode.Success);
 }
示例#5
0
 /// <inheritdoc />
 public ReturnCode PostWriting(IBuildParameters parameters, IDependencyData dependencyData, IWriteData writeData, IBuildResults results)
 {
     if (PostWritingCallback != null)
     {
         return(PostWritingCallback(parameters, dependencyData, writeData, results));
     }
     return(ReturnCode.Success);
 }
示例#6
0
 /// <inheritdoc />
 public ReturnCode PostScripts(IBuildParameters parameters, IBuildResults results)
 {
     if (PostScriptsCallbacks != null)
     {
         return(PostScriptsCallbacks(parameters, results));
     }
     return(ReturnCode.Success);
 }
示例#7
0
        /// <summary>
        /// Constructor
        /// </summary>
        public PipEnvironment(LoggingContext loggingContext)
        {
            m_loggingContext = loggingContext;

            FullEnvironmentVariables =
                GetFactory(ReportDuplicateVariable)
                .PopulateFromEnvironment();

#if PLATFORM_WIN
            var comspec = Path.Combine(SpecialFolderUtilities.SystemDirectory, "cmd.exe");
            var pathExt = ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC";
#endif

            var path =
                string.Join(
                    OperatingSystemHelper.IsUnixOS ? ":" : ";",
                    SpecialFolderUtilities.SystemDirectory,
#if PLATFORM_WIN
                    SpecialFolderUtilities.GetFolderPath(Environment.SpecialFolder.Windows),
                    Path.Combine(SpecialFolderUtilities.SystemDirectory, "wbem")
#else
                    MacPaths.UsrBin,
                    MacPaths.UsrSbin,
                    MacPaths.Bin,
                    MacPaths.Sbin
#endif
                    );

            // the environment variable names below should use the casing appropriate for the target OS
            // (on Windows it won't matter, but on Unix-like systems, including Cygwin environment on Windows,
            // it matters, and has to be all upper-cased). See also doc comment for IBuildParameters.Select
            m_baseEnvironmentVariables = FullEnvironmentVariables
                                         .Select(new[]
            {
                "NUMBER_OF_PROCESSORS",
                "OS",
                "PROCESSOR_ARCHITECTURE",
                "PROCESSOR_IDENTIFIER",
                "PROCESSOR_LEVEL",
                "PROCESSOR_REVISION",
                "SystemDrive",
                "SystemRoot",
                "SYSTEMTYPE",
            })
                                         .Override(new Dictionary <string, string>()
            {
                { "PATH", path },
#if PLATFORM_WIN
                { "ComSpec", comspec },
                { "PATHEXT", pathExt }
#endif
            })
                                         .Override(DisallowedTempVariables
                                                   .Select(tmp => new KeyValuePair <string, string>(tmp, RestrictedTemp)));
        }
示例#8
0
        public void DefaultBuildTasks_WriteSerializedFiles()
        {
            IBuildParameters buildParams    = GetBuildParameters();
            IDependencyData  dependencyData = new BuildDependencyData();
            IWriteData       writeData      = new BuildWriteData();
            IBuildResults    results        = new BuildResults();

            ReturnCode exitCode = RunTask <WriteSerializedFiles>(buildParams, dependencyData, writeData, results);

            Assert.AreEqual(ReturnCode.Success, exitCode);
        }
示例#9
0
        public string GetTargetBuildLocation(IBuildParameters buildParameters)
        {
            var file         = buildParameters.OutputFile;
            var folder       = buildParameters.OutputFolder;
            var artifactPath = folder.
                               CombinePath(buildParameters.BuildTarget.ToString()).
                               CombinePath(file);

            buildParameters.ArtifactPath = artifactPath;

            return(artifactPath);
        }
示例#10
0
        public HostService(string baseDir, IEnumerable <FileModel> models, string versionName, string versionDir, int lruSize, GroupInfo groupInfo, IBuildParameters buildParameters)
        {
            VersionName         = versionName;
            VersionOutputFolder = versionDir;
            GroupInfo           = groupInfo;
            BuildParameters     = buildParameters;

            // Disable LRU, when Content.get, it is possible that the value is Serialized before the modification on the content does not complete yet
            //if (lruSize > 0)
            //{
            //    _lru = LruList<ModelWithCache>.CreateSynchronized(lruSize, OnLruRemoving);
            //}
            LoadCore(models);
        }
示例#11
0
        private static ReturnCode PostPackingForSelectiveBuild(IBuildParameters buildParams, IDependencyData dependencyData, IWriteData writeData)
        {
            var includedBundles = AssetbundleBuildSettings.EditorInstance.BundleSettings
                                  .Where(setting => setting.IncludedInPlayer)
                                  .Select(setting => setting.BundleName)
                                  .ToList();

            //quick exit
            if (includedBundles == null || includedBundles.Count == 0)
            {
                return(ReturnCode.Success);
            }

            for (int i = writeData.WriteOperations.Count - 1; i >= 0; --i)
            {
                string bundleName;

                //derive bundle name from operation
                if (writeData.WriteOperations[i] is AssetBundleWriteOperation bundleOp)
                {
                    bundleName = bundleOp.Info.bundleName;
                }
                else if (writeData.WriteOperations[i] is SceneBundleWriteOperation sceneBundleOp)
                {
                    bundleName = sceneBundleOp.Info.bundleName;
                }
                else if (writeData.WriteOperations[i] is SceneDataWriteOperation sceneDataOp)
                {
                    //this is the simplest way to derive bundle name from SceneDataWriteOperation
                    var bundleWriteData = writeData as IBundleWriteData;
                    bundleName = bundleWriteData.FileToBundle[sceneDataOp.Command.internalName];
                }
                else
                {
                    Debug.LogError("Unexpected write operation");
                    return(ReturnCode.Error);
                }

                // if we do not want to build that bundle, remove the write operation from the list
                if (includedBundles.Contains(bundleName) == false)
                {
                    writeData.WriteOperations.RemoveAt(i);
                }
            }

            return(ReturnCode.Success);
        }
示例#12
0
        internal LocalTc(IBuildParameters buildParameters = null, ITeamCityWriterFactory teamCityWriterFactory = null, params object[] overrides)
        {
            var bootstrapper = new Bootstrapper(overrides);

            m_BuildParameters     = buildParameters ?? bootstrapper.Get <IBuildParameters>();
            teamCityWriterFactory = teamCityWriterFactory ?? bootstrapper.Get <ITeamCityWriterFactory>();
            m_TeamCityWriter      = teamCityWriterFactory.CreateTeamCityWriter();

            string changedFilesPath;

            if (m_BuildParameters.TryGetBuildParameter("build.changedFiles.file", out changedFilesPath))
            {
                m_ChangedFiles = bootstrapper.Get <IChangedFilesParser>().ParseChangedFiles(changedFilesPath);
            }
            else
            {
                m_ChangedFiles = new List <IChangedFile>();
            }
        }
示例#13
0
        public void DefaultBuildTasks_PostScriptsCallbacks()
        {
            bool scriptsCallbackCalled = false;

            IBuildParameters buildParameters = GetBuildParameters();
            IBuildResults    results         = new BuildResults();
            BuildCallbacks   callback        = new BuildCallbacks();

            callback.PostScriptsCallbacks = (parameters, buildResults) =>
            {
                scriptsCallbackCalled = true;
                return(ReturnCode.Success);
            };

            ReturnCode exitCode = RunTask <PostScriptsCallback>(buildParameters, results, callback);

            Assert.AreEqual(ReturnCode.Success, exitCode);
            Assert.IsTrue(scriptsCallbackCalled);
        }
示例#14
0
        public void DefaultBuildTasks_PostDependencyCallback()
        {
            bool dependencyCallbackCalled = false;

            IBuildParameters buildParameters = GetBuildParameters();
            IDependencyData  dep             = GetDependencyData();
            BuildCallbacks   callback        = new BuildCallbacks();

            callback.PostDependencyCallback = (parameters, data) =>
            {
                dependencyCallbackCalled = true;
                return(ReturnCode.Success);
            };

            ReturnCode exitCode = RunTask <PostDependencyCallback>(buildParameters, dep, callback);

            Assert.AreEqual(ReturnCode.Success, exitCode);
            Assert.IsTrue(dependencyCallbackCalled);
        }
示例#15
0
        public void DefaultBuildTasks_PostPackingCallback()
        {
            bool packingCallbackCalled = false;

            IBuildParameters buildParams = GetBuildParameters();
            IDependencyData  dep         = GetDependencyData();
            IBundleWriteData writeData   = new BundleWriteData();
            BuildCallbacks   callback    = new BuildCallbacks();

            callback.PostPackingCallback = (parameters, data, arg3) =>
            {
                packingCallbackCalled = true;
                return(ReturnCode.Success);
            };

            ReturnCode exitCode = RunTask <PostPackingCallback>(buildParams, dep, writeData, callback);

            Assert.AreEqual(ReturnCode.Success, exitCode);
            Assert.IsTrue(packingCallbackCalled);
        }
    /// <summary>
    /// This callback is what remove the unwanted AssetBundle writing operation from being processed with the WriteSerializedFiles
    /// and ArchiveAndCompressBundles taskes
    /// </summary>
    /// <param name="buildParams"></param>
    /// <param name="dependencyData"></param>
    /// <param name="writeData"></param>
    /// <returns></returns>
    private static ReturnCode PostPackingCallback(IBuildParameters buildParams, IDependencyData dependencyData, IWriteData writeData)
    {
        if (includedBundles != null && includedBundles.Count > 0)
        {
            for (int i = writeData.WriteOperations.Count - 1; i >= 0; --i)
            {
                // get the AssetBundle name that the writeOperation is for
                AssetBundleWriteOperation op = writeData.WriteOperations[i] as AssetBundleWriteOperation;
                string bundleName            = null;
                if (op != null)
                {
                    bundleName = op.Info.bundleName;
                }
                else
                {
                    // scene bundles are also different
                    if (writeData.WriteOperations[i] is SceneBundleWriteOperation s_op)
                    {
                        bundleName = s_op.Info.bundleName;
                    }
                    else
                    {
                        Debug.LogError("Unexpected write operation");
                        return(ReturnCode.Error);
                    }
                }

                // if we do not want to build that bundle, remove the write operation from the list
                if (includedBundles.Contains(bundleName) == false)
                {
                    writeData.WriteOperations.RemoveAt(i);
                }
            }
        }

        return(ReturnCode.Success);
    }
示例#17
0
        private ReturnCode PostWriting(IBuildParameters buildParameters, IDependencyData dependencyData, IWriteData writeData, IBuildResults results)
        {
            var parameters = buildParameters as BundleBuildParameters;

            return(ReturnCode.Success);
        }
        public void SerializeSandboxedProcessInfo(bool useNullFileStorage, bool useRootJail)
        {
            var pt  = new PathTable();
            var fam =
                new FileAccessManifest(pt, CreateDirectoryTranslator())
            {
                FailUnexpectedFileAccesses   = false,
                IgnoreCodeCoverage           = false,
                ReportFileAccesses           = false,
                ReportUnexpectedFileAccesses = false,
                MonitorChildProcesses        = false
            };

            var vac = new ValidationDataCreator(fam, pt);

            vac.AddScope(A("C", "Users", "AppData"), FileAccessPolicy.AllowAll);
            vac.AddPath(A("C", "Source", "source.txt"), FileAccessPolicy.AllowReadAlways);
            vac.AddPath(A("C", "Out", "out.txt"), FileAccessPolicy.AllowAll);

            SandboxedProcessStandardFiles standardFiles = null;
            ISandboxedProcessFileStorage  fileStorage;

            if (useNullFileStorage)
            {
                fileStorage = null;
            }
            else
            {
                standardFiles = new SandboxedProcessStandardFiles(A("C", "pip", "pip.out"), A("C", "pip", "pip.err"));
                fileStorage   = new StandardFileStorage(standardFiles);
            }

            var envVars = new Dictionary <string, string>()
            {
                ["Var1"] = "Val1",
                ["Var2"] = "Val2",
            };
            IBuildParameters buildParameters = BuildParameters.GetFactory().PopulateFromDictionary(envVars);

            var sidebandLogFile = A("C", "engine-cache", "sideband-logs", "log-1");
            var loggerRootDirs  = new[] { A("C", "out", "dir1"), A("C", "out", "dir2") };

            var sharedOpaqueOutputLogger = new SidebandWriter(DefaultSidebandMetadata, sidebandLogFile, loggerRootDirs);

            SandboxedProcessInfo info = new SandboxedProcessInfo(
                pt,
                fileStorage,
                A("C", "tool", "tool.exe"),
                fam,
                true,
                null,
                LoggingContext,
                sidebandWriter: sharedOpaqueOutputLogger)
            {
                Arguments            = @"/arg1:val1 /arg2:val2",
                WorkingDirectory     = A("C", "Source"),
                RootJailInfo         = useRootJail ? (RootJailInfo?)new RootJailInfo(A("C", "RootJail"), 123, 234) : null,
                EnvironmentVariables = buildParameters,
                Timeout              = TimeSpan.FromMinutes(15),
                PipSemiStableHash    = 0x12345678,
                PipDescription       = nameof(SerializeSandboxedProcessInfo),
                TimeoutDumpDirectory = A("C", "Timeout"),
                SandboxKind          = global::BuildXL.Utilities.Configuration.SandboxKind.Default,
                AllowedSurvivingChildProcessNames = new[] { "conhost.exe", "mspdbsrv.exe" },
                NestedProcessTerminationTimeout   = SandboxedProcessInfo.DefaultNestedProcessTerminationTimeout,
                StandardInputSourceInfo           = StandardInputInfo.CreateForData("Data"),
                StandardObserverDescriptor        = new SandboxObserverDescriptor()
                {
                    WarningRegex = new ExpandedRegexDescriptor("*warn", System.Text.RegularExpressions.RegexOptions.Compiled)
                },
            };

            // Serialize and deserialize.
            SandboxedProcessInfo readInfo = null;

            using (var stream = new MemoryStream())
            {
                info.Serialize(stream);
                stream.Position = 0;
                readInfo        = SandboxedProcessInfo.Deserialize(
                    stream,
                    new global::BuildXL.Utilities.Instrumentation.Common.LoggingContext("Test"),
                    null);
            }

            using (readInfo.SidebandWriter)
            {
                // Verify.
                XAssert.AreEqual(info.FileName, readInfo.FileName);
                XAssert.AreEqual(info.Arguments, readInfo.Arguments);
                XAssert.AreEqual(info.WorkingDirectory, readInfo.WorkingDirectory);
                XAssert.AreEqual(info.RootJailInfo?.RootJail, readInfo.RootJailInfo?.RootJail);
                XAssert.AreEqual(info.RootJailInfo?.UserId, readInfo.RootJailInfo?.UserId);
                XAssert.AreEqual(info.RootJailInfo?.GroupId, readInfo.RootJailInfo?.GroupId);
                var readEnvVars = readInfo.EnvironmentVariables.ToDictionary();
                XAssert.AreEqual(envVars.Count, readEnvVars.Count);
                foreach (var kvp in envVars)
                {
                    XAssert.AreEqual(kvp.Value, readEnvVars[kvp.Key]);
                }

                XAssert.AreEqual(info.Timeout, readInfo.Timeout);
                XAssert.AreEqual(info.PipSemiStableHash, readInfo.PipSemiStableHash);
                XAssert.AreEqual(info.PipDescription, readInfo.PipDescription);
                XAssert.AreEqual(info.TimeoutDumpDirectory, readInfo.TimeoutDumpDirectory);
                XAssert.AreEqual(info.SandboxKind, readInfo.SandboxKind);

                XAssert.AreEqual(info.AllowedSurvivingChildProcessNames.Length, readInfo.AllowedSurvivingChildProcessNames.Length);
                for (int i = 0; i < info.AllowedSurvivingChildProcessNames.Length; ++i)
                {
                    XAssert.AreEqual(info.AllowedSurvivingChildProcessNames[i], readInfo.AllowedSurvivingChildProcessNames[i]);
                }

                XAssert.AreEqual(info.NestedProcessTerminationTimeout, readInfo.NestedProcessTerminationTimeout);
                XAssert.AreEqual(info.StandardInputSourceInfo, readInfo.StandardInputSourceInfo);

                if (useNullFileStorage)
                {
                    XAssert.IsNull(readInfo.SandboxedProcessStandardFiles);
                    XAssert.IsNull(readInfo.FileStorage);
                }
                else
                {
                    XAssert.IsNotNull(readInfo.SandboxedProcessStandardFiles);
                    XAssert.AreEqual(standardFiles.StandardOutput, readInfo.SandboxedProcessStandardFiles.StandardOutput);
                    XAssert.AreEqual(standardFiles.StandardError, readInfo.SandboxedProcessStandardFiles.StandardError);
                    XAssert.AreEqual(standardFiles.StandardOutput, readInfo.FileStorage.GetFileName(SandboxedProcessFile.StandardOutput));
                    XAssert.AreEqual(standardFiles.StandardError, readInfo.FileStorage.GetFileName(SandboxedProcessFile.StandardError));
                }

                XAssert.IsFalse(readInfo.ContainerConfiguration.IsIsolationEnabled);

                XAssert.AreEqual(sidebandLogFile, readInfo.SidebandWriter.SidebandLogFile);
                XAssert.ArrayEqual(loggerRootDirs, readInfo.SidebandWriter.RootDirectories.ToArray());

                if (!OperatingSystemHelper.IsUnixOS)
                {
                    // this validator examines serialized FAM bytes using the same Windows-only native parser used by Detours
                    ValidationDataCreator.TestManifestRetrieval(vac.DataItems, readInfo.FileAccessManifest, false);
                }
            }
        }
        private static ReturnCode PostPackingForSelectiveBuild(IBuildParameters buildParams, IDependencyData dependencyData, IWriteData writeData)
        {
            var customBuildParams = buildParams as CustomBuildParameters;

            List <string> includedBundles;

            if (customBuildParams.CurrentBuildType == BuildType.Local)
            {
                includedBundles = customBuildParams.CurrentSettings.BundleSettings
                                  .Where(setting => setting.IncludedInPlayer)
                                  .Select(setting => setting.BundleName)
                                  .ToList();
            }
            //if not local build, we include everything
            else
            {
                includedBundles = customBuildParams.CurrentSettings.BundleSettings
                                  .Select(setting => setting.BundleName)
                                  .ToList();
            }

            //quick exit
            if (includedBundles == null || includedBundles.Count == 0)
            {
                Debug.Log("Nothing to build");
                return(ReturnCode.Success);
            }

            var bundleHashDic = new Dictionary <string, HashSet <GUID> >();

            for (int i = writeData.WriteOperations.Count - 1; i >= 0; --i)
            {
                string         bundleName;
                HashSet <GUID> guidHashSet;
                switch (writeData.WriteOperations[i])
                {
                case SceneBundleWriteOperation sceneOperation:
                    bundleName = sceneOperation.Info.bundleName;
                    if (!bundleHashDic.TryGetValue(bundleName, out guidHashSet))
                    {
                        guidHashSet = new HashSet <GUID>();
                        bundleHashDic.Add(bundleName, guidHashSet);
                    }

                    foreach (var bundleSceneInfo in sceneOperation.Info.bundleScenes)
                    {
                        guidHashSet.Add(bundleSceneInfo.asset);
                    }

                    foreach (var asset in sceneOperation.PreloadInfo.preloadObjects)
                    {
                        if (asset.fileType == UnityEditor.Build.Content.FileType.NonAssetType)
                        {
                            continue;
                        }
                        guidHashSet.Add(asset.guid);
                    }

                    break;

                case SceneDataWriteOperation sceneDataOperation:
                    var bundleWriteData = writeData as IBundleWriteData;
                    bundleName = bundleWriteData.FileToBundle[sceneDataOperation.Command.internalName];
                    if (!bundleHashDic.TryGetValue(bundleName, out guidHashSet))
                    {
                        guidHashSet = new HashSet <GUID>();
                        bundleHashDic.Add(bundleName, guidHashSet);
                    }
                    foreach (var identifier in sceneDataOperation.PreloadInfo.preloadObjects)
                    {
                        if (identifier.fileType == UnityEditor.Build.Content.FileType.NonAssetType)
                        {
                            continue;
                        }
                        guidHashSet.Add(identifier.guid);
                    }
                    break;

                case AssetBundleWriteOperation assetBundleOperation:
                    bundleName = assetBundleOperation.Info.bundleName;
                    if (!bundleHashDic.TryGetValue(bundleName, out guidHashSet))
                    {
                        guidHashSet = new HashSet <GUID>();
                        bundleHashDic.Add(bundleName, guidHashSet);
                    }

                    foreach (var bs in assetBundleOperation.Info.bundleAssets)
                    {
                        foreach (var asset in bs.includedObjects)
                        {
                            if (asset.fileType == UnityEditor.Build.Content.FileType.NonAssetType)
                            {
                                continue;
                            }
                            guidHashSet.Add(asset.guid);
                        }

                        foreach (var asset in bs.referencedObjects)
                        {
                            if (asset.fileType == UnityEditor.Build.Content.FileType.NonAssetType)
                            {
                                continue;
                            }
                            guidHashSet.Add(asset.guid);
                        }
                    }
                    break;

                default:
                    Debug.LogError("Unexpected write operation");
                    return(ReturnCode.Error);
                }

                // if we do not want to build that bundle, remove the write operation from the list
                if (!includedBundles.Contains(bundleName) || customBuildParams.CurrentBuildType == BuildType.Dry)
                {
                    writeData.WriteOperations.RemoveAt(i);
                }
            }

            //log deps file
            WriteDuplicateLogFile(Application.dataPath + "/../", bundleHashDic);

            return(ReturnCode.Success);
        }
示例#20
0
 public EditorBuildConfiguration(IArgumentsProvider argumentsProvider, IBuildParameters parameters)
 {
     arguments       = argumentsProvider;
     buildParameters = parameters;
 }
示例#21
0
        /// <nodoc />
        public static SandboxedProcessInfo Deserialize(Stream stream, LoggingContext loggingContext, IDetoursEventListener detoursEventListener)
        {
            using (var reader = new BuildXLReader(false, stream, true))
            {
                string           arguments             = reader.ReadNullableString();
                string           commandLine           = reader.ReadNullableString();
                bool             disableConHostSharing = reader.ReadBoolean();
                string           fileName = reader.ReadNullableString();
                Encoding         standardInputEncoding  = reader.ReadNullable(r => r.ReadEncoding());
                Encoding         standardOutputEncoding = reader.ReadNullable(r => r.ReadEncoding());
                Encoding         standardErrorEncoding  = reader.ReadNullable(r => r.ReadEncoding());
                string           workingDirectory       = reader.ReadNullableString();
                IBuildParameters buildParameters        = null;
                var envVars = reader.ReadNullable(r => r.ReadReadOnlyList(r2 => new KeyValuePair <string, string>(r2.ReadString(), r2.ReadString())));
                if (envVars != null)
                {
                    buildParameters = BuildParameters.GetFactory().PopulateFromDictionary(envVars.ToDictionary(kvp => kvp.Key, kvp => kvp.Value));
                }

                string[]    allowedSurvivingChildNames = reader.ReadNullable(r => r.ReadReadOnlyList(r2 => r2.ReadString()))?.ToArray();
                int         maxLengthInMemory          = reader.ReadInt32();
                TimeSpan?   timeout = reader.ReadNullableStruct(r => r.ReadTimeSpan());
                TimeSpan    nestedProcessTerminationTimeout = reader.ReadTimeSpan();
                long        pipSemiStableHash    = reader.ReadInt64();
                string      timeoutDumpDirectory = reader.ReadNullableString();
                SandboxKind sandboxKind          = (SandboxKind)reader.ReadByte();
                string      pipDescription       = reader.ReadNullableString();
                SandboxedProcessStandardFiles sandboxedProcessStandardFiles = SandboxedProcessStandardFiles.Deserialize(reader);
                StandardInputInfo             standardInputSourceInfo       = reader.ReadNullable(r => StandardInputInfo.Deserialize(r));
                SandboxObserverDescriptor     standardObserverDescriptor    = reader.ReadNullable(r => SandboxObserverDescriptor.Deserialize(r));

                FileAccessManifest fam = reader.ReadNullable(r => FileAccessManifest.Deserialize(stream));

                return(new SandboxedProcessInfo(
                           new PathTable(),
                           new StandardFileStorage(sandboxedProcessStandardFiles),
                           fileName,
                           fam,
                           disableConHostSharing,
                           // TODO: serialize/deserialize container configuration.
                           containerConfiguration: ContainerConfiguration.DisabledIsolation,
                           loggingContext: loggingContext,
                           detoursEventListener: detoursEventListener)
                {
                    m_arguments = arguments,
                    m_commandLine = commandLine,
                    StandardInputEncoding = standardInputEncoding,
                    StandardOutputEncoding = standardOutputEncoding,
                    StandardErrorEncoding = standardErrorEncoding,
                    WorkingDirectory = workingDirectory,
                    EnvironmentVariables = buildParameters,
                    AllowedSurvivingChildProcessNames = allowedSurvivingChildNames,
                    MaxLengthInMemory = maxLengthInMemory,
                    Timeout = timeout,
                    NestedProcessTerminationTimeout = nestedProcessTerminationTimeout,
                    PipSemiStableHash = pipSemiStableHash,
                    TimeoutDumpDirectory = timeoutDumpDirectory,
                    SandboxKind = sandboxKind,
                    PipDescription = pipDescription,
                    SandboxedProcessStandardFiles = sandboxedProcessStandardFiles,
                    StandardInputSourceInfo = standardInputSourceInfo,
                    StandardObserverDescriptor = standardObserverDescriptor
                });
            }
        }
示例#22
0
        public void SerializeSandboxedProcessInfo()
        {
            var pt  = new PathTable();
            var fam =
                new FileAccessManifest(pt, CreateDirectoryTranslator())
            {
                FailUnexpectedFileAccesses   = false,
                IgnoreCodeCoverage           = false,
                ReportFileAccesses           = false,
                ReportUnexpectedFileAccesses = false,
                MonitorChildProcesses        = false
            };

            var vac = new ValidationDataCreator(fam, pt);

            vac.AddScope(A("C", "Users", "AppData"), FileAccessPolicy.AllowAll);
            vac.AddPath(A("C", "Source", "source.txt"), FileAccessPolicy.AllowReadAlways);
            vac.AddPath(A("C", "Out", "out.txt"), FileAccessPolicy.AllowAll);

            var standardFiles = new SandboxedProcessStandardFiles(A("C", "pip", "pip.out"), A("C", "pip", "pip.err"));
            var envVars       = new Dictionary <string, string>()
            {
                ["Var1"] = "Val1",
                ["Var2"] = "Val2",
            };
            IBuildParameters buildParameters = BuildParameters.GetFactory().PopulateFromDictionary(envVars);

            SandboxedProcessInfo info = new SandboxedProcessInfo(
                pt,
                new StandardFileStorage(standardFiles),
                A("C", "tool", "tool.exe"),
                fam,
                true,
                null)
            {
                Arguments            = @"/arg1:val1 /arg2:val2",
                WorkingDirectory     = A("C", "Source"),
                EnvironmentVariables = buildParameters,
                Timeout              = TimeSpan.FromMinutes(15),
                PipSemiStableHash    = 0x12345678,
                PipDescription       = nameof(SerializeSandboxedProcessInfo),
                ProcessIdListener    = null,
                TimeoutDumpDirectory = A("C", "Timeout"),
                SandboxKind          = global::BuildXL.Utilities.Configuration.SandboxKind.Default,
                AllowedSurvivingChildProcessNames = new[] { "conhost.exe", "mspdbsrv.exe" },
                NestedProcessTerminationTimeout   = SandboxedProcessInfo.DefaultNestedProcessTerminationTimeout,
                StandardInputSourceInfo           = StandardInputInfo.CreateForData("Data"),
                StandardObserverDescriptor        = new SandboxObserverDescriptor()
                {
                    WarningRegex = new ExpandedRegexDescriptor("*warn", System.Text.RegularExpressions.RegexOptions.Compiled)
                },
            };

            // Serialize and deserialize.
            SandboxedProcessInfo readInfo = null;

            using (var stream = new MemoryStream())
            {
                info.Serialize(stream);
                stream.Position = 0;
                readInfo        = SandboxedProcessInfo.Deserialize(
                    stream,
                    new global::BuildXL.Utilities.Instrumentation.Common.LoggingContext("Test"),
                    null);
            }

            // Verify.
            XAssert.AreEqual(info.FileName, readInfo.FileName);
            XAssert.AreEqual(info.Arguments, readInfo.Arguments);
            XAssert.AreEqual(info.WorkingDirectory, readInfo.WorkingDirectory);
            var readEnvVars = readInfo.EnvironmentVariables.ToDictionary();

            XAssert.AreEqual(envVars.Count, readEnvVars.Count);
            foreach (var kvp in envVars)
            {
                XAssert.AreEqual(kvp.Value, readEnvVars[kvp.Key]);
            }

            XAssert.AreEqual(info.Timeout, readInfo.Timeout);
            XAssert.AreEqual(info.PipSemiStableHash, readInfo.PipSemiStableHash);
            XAssert.AreEqual(info.PipDescription, readInfo.PipDescription);
            XAssert.AreEqual(info.ProcessIdListener, readInfo.ProcessIdListener);
            XAssert.AreEqual(info.TimeoutDumpDirectory, readInfo.TimeoutDumpDirectory);
            XAssert.AreEqual(info.SandboxKind, readInfo.SandboxKind);

            XAssert.AreEqual(info.AllowedSurvivingChildProcessNames.Length, readInfo.AllowedSurvivingChildProcessNames.Length);
            for (int i = 0; i < info.AllowedSurvivingChildProcessNames.Length; ++i)
            {
                XAssert.AreEqual(info.AllowedSurvivingChildProcessNames[i], readInfo.AllowedSurvivingChildProcessNames[i]);
            }

            XAssert.AreEqual(info.NestedProcessTerminationTimeout, readInfo.NestedProcessTerminationTimeout);
            XAssert.AreEqual(info.StandardInputSourceInfo, readInfo.StandardInputSourceInfo);
            XAssert.IsNotNull(readInfo.SandboxedProcessStandardFiles);
            XAssert.AreEqual(standardFiles.StandardOutput, readInfo.SandboxedProcessStandardFiles.StandardOutput);
            XAssert.AreEqual(standardFiles.StandardError, readInfo.SandboxedProcessStandardFiles.StandardError);
            XAssert.AreEqual(standardFiles.StandardOutput, readInfo.FileStorage.GetFileName(SandboxedProcessFile.StandardOutput));
            XAssert.AreEqual(standardFiles.StandardError, readInfo.FileStorage.GetFileName(SandboxedProcessFile.StandardError));
            XAssert.IsFalse(readInfo.ContainerConfiguration.IsIsolationEnabled);

            ValidationDataCreator.TestManifestRetrieval(vac.DataItems, readInfo.FileAccessManifest, false);
        }
        private static ReturnCode PostPackingForSelectiveBuild(IBuildParameters buildParams, IDependencyData dependencyData, IWriteData writeData)
        {
            var customBuildParams = buildParams as CustomBuildParameters;
            var depsDic           = customBuildParams.DependencyDic;

            List <string> includedBundles;

            if (customBuildParams.CurrentBuildType == BuildType.Local)
            {
                //deps includes every local dependencies recursively
                includedBundles = customBuildParams.CurrentSettings.BundleSettings
                                  .Where(setting => setting.IncludedInPlayer)
                                  .Select(setting => setting.BundleName)
                                  .SelectMany(bundleName => Utility.CollectBundleDependencies(depsDic, bundleName, true))
                                  .Distinct()
                                  .ToList();
            }
            //if not local build, we include everything
            else
            {
                includedBundles = depsDic.Keys.ToList();
            }

            //quick exit
            if (includedBundles == null || includedBundles.Count == 0)
            {
                Debug.Log("Nothing to build");
                writeData.WriteOperations.Clear();
                return(ReturnCode.Success);
            }

            for (int i = writeData.WriteOperations.Count - 1; i >= 0; --i)
            {
                string bundleName;
                switch (writeData.WriteOperations[i])
                {
                case SceneBundleWriteOperation sceneOperation:
                    bundleName = sceneOperation.Info.bundleName;
                    break;

                case SceneDataWriteOperation sceneDataOperation:
                    var bundleWriteData = writeData as IBundleWriteData;
                    bundleName = bundleWriteData.FileToBundle[sceneDataOperation.Command.internalName];
                    break;

                case AssetBundleWriteOperation assetBundleOperation:
                    bundleName = assetBundleOperation.Info.bundleName;
                    break;

                default:
                    Debug.LogError("Unexpected write operation");
                    return(ReturnCode.Error);
                }

                // if we do not want to build that bundle, remove the write operation from the list
                if (!includedBundles.Contains(bundleName))
                {
                    writeData.WriteOperations.RemoveAt(i);
                }
            }

            return(ReturnCode.Success);
        }
示例#24
0
        private static ReturnCode PostPackingForSelectiveBuild(IBuildParameters buildParams, IDependencyData dependencyData, IWriteData writeData)
        {
            List <string> includedBundles;

            if (s_CurrentBuildType == BuildType.Local)
            {
                includedBundles = s_CurrentBuildingSettings.BundleSettings
                                  .Where(setting => setting.IncludedInPlayer)
                                  .Select(setting => setting.BundleName)
                                  .ToList();
            }
            //if not local build, we include everything
            else
            {
                includedBundles = s_CurrentBuildingSettings.BundleSettings
                                  .Select(setting => setting.BundleName)
                                  .ToList();
            }

            //quick exit
            if (includedBundles == null || includedBundles.Count == 0)
            {
                Debug.Log("Nothing to build");
                return(ReturnCode.Success);
            }

            var sb = new System.Text.StringBuilder();

            sb.AppendLine($"Build Time : {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
            sb.AppendLine();

            var bundleHashDic = new Dictionary <string, HashSet <GUID> >();

            for (int i = writeData.WriteOperations.Count - 1; i >= 0; --i)
            {
                string         bundleName;
                HashSet <GUID> guidHashSet;
                switch (writeData.WriteOperations[i])
                {
                case SceneBundleWriteOperation sceneOperation:
                    bundleName = sceneOperation.Info.bundleName;
                    if (!bundleHashDic.TryGetValue(bundleName, out guidHashSet))
                    {
                        guidHashSet = new HashSet <GUID>();
                        bundleHashDic.Add(bundleName, guidHashSet);
                    }

                    foreach (var bundleSceneInfo in sceneOperation.Info.bundleScenes)
                    {
                        guidHashSet.Add(bundleSceneInfo.asset);
                    }

                    foreach (var asset in sceneOperation.PreloadInfo.preloadObjects)
                    {
                        if (asset.fileType == UnityEditor.Build.Content.FileType.NonAssetType)
                        {
                            continue;
                        }
                        guidHashSet.Add(asset.guid);
                    }

                    break;

                case SceneDataWriteOperation sceneDataOperation:
                    var bundleWriteData = writeData as IBundleWriteData;
                    bundleName = bundleWriteData.FileToBundle[sceneDataOperation.Command.internalName];
                    if (!bundleHashDic.TryGetValue(bundleName, out guidHashSet))
                    {
                        guidHashSet = new HashSet <GUID>();
                        bundleHashDic.Add(bundleName, guidHashSet);
                    }
                    foreach (var identifier in sceneDataOperation.PreloadInfo.preloadObjects)
                    {
                        if (identifier.fileType == UnityEditor.Build.Content.FileType.NonAssetType)
                        {
                            continue;
                        }
                        guidHashSet.Add(identifier.guid);
                    }
                    break;

                case AssetBundleWriteOperation assetBundleOperation:
                    bundleName = assetBundleOperation.Info.bundleName;
                    if (!bundleHashDic.TryGetValue(bundleName, out guidHashSet))
                    {
                        guidHashSet = new HashSet <GUID>();
                        bundleHashDic.Add(bundleName, guidHashSet);
                    }

                    foreach (var bs in assetBundleOperation.Info.bundleAssets)
                    {
                        foreach (var asset in bs.includedObjects)
                        {
                            if (asset.fileType == UnityEditor.Build.Content.FileType.NonAssetType)
                            {
                                continue;
                            }
                            guidHashSet.Add(asset.guid);
                        }

                        foreach (var asset in bs.referencedObjects)
                        {
                            if (asset.fileType == UnityEditor.Build.Content.FileType.NonAssetType)
                            {
                                continue;
                            }
                            guidHashSet.Add(asset.guid);
                        }
                    }
                    break;

                default:
                    Debug.LogError("Unexpected write operation");
                    return(ReturnCode.Error);
                }

                // if we do not want to build that bundle, remove the write operation from the list
                if (!includedBundles.Contains(bundleName) || s_CurrentBuildType == BuildType.Dry)
                {
                    writeData.WriteOperations.RemoveAt(i);
                }
            }

            foreach (var kv in bundleHashDic)
            {
                sb.AppendLine($"----File Path : {kv.Key}----");

                foreach (var guid in kv.Value)
                {
                    sb.AppendLine($"{(GetCompressedFileSize(guid.ToString()) * 0.000001f).ToString("0.00000").PadLeft(10)} mb - {AssetDatabase.GUIDToAssetPath(guid.ToString())}");
                }

                sb.AppendLine();
            }

            var path = Application.dataPath + "/../";

            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }
            File.WriteAllText(Path.Combine(path, LogDependencyName), sb.ToString());
            return(ReturnCode.Success);
        }
示例#25
0
 internal LocalTc(IBuildParameters buildParameters, ITeamCityWriterFactory teamCityWriterFactory)
 {
     m_BuildParameters = buildParameters;
     m_TeamCityWriter = teamCityWriterFactory.CreateTeamCityWriter();
 }