public void MarkForGarbageCollection(IExecutionContext executionContext, TrackingConfigBase2 config) { Trace.Entering(); // Convert legacy format to the new format. LegacyTrackingConfig2 legacyConfig = config as LegacyTrackingConfig2; if (legacyConfig != null) { // Convert legacy format to the new format. config = new TrackingConfig2( executionContext, legacyConfig, // The sources folder wasn't stored in the legacy format - only the // build folder was stored. Since the hash key has changed, it is // unknown what the source folder was named. Just set the folder name // to "s" so the property isn't left blank. sourcesDirectoryNameOnly: Constants.Build.Path.SourcesDirectory); } // Write a copy of the tracking config to the GC folder. string gcDirectory = Path.Combine( IOUtil.GetWorkPath(HostContext), Constants.Build.Path.SourceRootMappingDirectory, Constants.Build.Path.GarbageCollectionDirectory); string file = Path.Combine( gcDirectory, StringUtil.Format("{0}.json", Guid.NewGuid())); WriteToFile(file, config); }
private TrackingConfig2 ConvertToNewFormat( IExecutionContext executionContext, ServiceEndpoint endpoint, TrackingConfigBase2 config) { Trace.Entering(); // If it's already in the new format, return it. TrackingConfig2 newConfig = config as TrackingConfig2; if (newConfig != null) { return(newConfig); } // Delete the legacy artifact/staging directories. LegacyTrackingConfig2 legacyConfig = config as LegacyTrackingConfig2; DeleteDirectory( executionContext, description: "legacy artifacts directory", path: Path.Combine(legacyConfig.BuildDirectory, Constants.Build.Path.LegacyArtifactsDirectory)); DeleteDirectory( executionContext, description: "legacy staging directory", path: Path.Combine(legacyConfig.BuildDirectory, Constants.Build.Path.LegacyStagingDirectory)); // Determine the source directory name. Check if the directory is named "s" already. // Convert the source directory to be named "s" if there is a problem with the old name. string sourcesDirectoryNameOnly = Constants.Build.Path.SourcesDirectory; if (!Directory.Exists(Path.Combine(legacyConfig.BuildDirectory, sourcesDirectoryNameOnly)) && !String.Equals(endpoint.Name, Constants.Build.Path.ArtifactsDirectory, StringComparison.OrdinalIgnoreCase) && !String.Equals(endpoint.Name, Constants.Build.Path.LegacyArtifactsDirectory, StringComparison.OrdinalIgnoreCase) && !String.Equals(endpoint.Name, Constants.Build.Path.LegacyStagingDirectory, StringComparison.OrdinalIgnoreCase) && !String.Equals(endpoint.Name, Constants.Build.Path.TestResultsDirectory, StringComparison.OrdinalIgnoreCase) && !endpoint.Name.Contains("\\") && !endpoint.Name.Contains("/") && Directory.Exists(Path.Combine(legacyConfig.BuildDirectory, endpoint.Name))) { sourcesDirectoryNameOnly = endpoint.Name; } // Convert to the new format. newConfig = new TrackingConfig2( executionContext, legacyConfig, sourcesDirectoryNameOnly, // The legacy artifacts directory has been deleted at this point - see above - so // switch the configuration to using the new naming scheme. useNewArtifactsDirectoryName: true); return(newConfig); }
public TrackingConfig2 PrepareDirectory( IExecutionContext executionContext, string repositoryUrl) { // Validate parameters. Trace.Entering(); ArgUtil.NotNull(executionContext, nameof(executionContext)); ArgUtil.NotNull(executionContext.Variables, nameof(executionContext.Variables)); var trackingManager = HostContext.GetService <ITrackingManager2>(); // Defer to the source provider to calculate the hash key. Trace.Verbose("Calculating build directory hash key."); string hashKey = GetBuildDirectoryHashKey(executionContext, repositoryUrl); Trace.Verbose($"Hash key: {hashKey}"); // Load the existing tracking file if one already exists. string trackingFile = Path.Combine( IOUtil.GetWorkPath(HostContext), Constants.Build.Path.SourceRootMappingDirectory, executionContext.Variables.System_CollectionId, executionContext.Variables.System_DefinitionId, Constants.Build.Path.TrackingConfigFile); Trace.Verbose($"Loading tracking config if exists: {trackingFile}"); TrackingConfigBase2 existingConfig = trackingManager.LoadIfExists(executionContext, trackingFile); // Check if the build needs to be garbage collected. If the hash key // has changed, then the existing build directory cannot be reused. TrackingConfigBase2 garbageConfig = null; if (existingConfig != null && !string.Equals(existingConfig.HashKey, hashKey, StringComparison.OrdinalIgnoreCase)) { // Just store a reference to the config for now. It can safely be // marked for garbage collection only after the new build directory // config has been created. Trace.Verbose($"Hash key from existing tracking config does not match. Existing key: {existingConfig.HashKey}"); garbageConfig = existingConfig; existingConfig = null; } //TODO(omeshp): figure out what goes here var endpoint = new ServiceEndpoint { Name = "s" }; // Create a new tracking config if required. TrackingConfig2 newConfig; if (existingConfig == null) { Trace.Verbose("Creating a new tracking config file."); newConfig = trackingManager.Create(executionContext, repositoryUrl, hashKey, trackingFile); ArgUtil.NotNull(newConfig, nameof(newConfig)); } else { // Convert legacy format to the new format if required. newConfig = ConvertToNewFormat(executionContext, endpoint, existingConfig); // For existing tracking config files, update the job run properties. Trace.Verbose("Updating job run properties."); trackingManager.UpdateJobRunProperties(executionContext, newConfig, trackingFile); } // Mark the old configuration for garbage collection. if (garbageConfig != null) { Trace.Verbose("Marking existing config for garbage collection."); trackingManager.MarkForGarbageCollection(executionContext, garbageConfig); } // Prepare the build directory. // There are 2 ways to provide build directory clean policy. // 1> set definition variable build.clean or agent.clean.buildDirectory. (on-prem user need to use this, since there is no Web UI in TFS 2016) // 2> select source clean option in definition repository tab. (VSTS will have this option in definition designer UI) BuildCleanOption cleanOption = GetBuildDirectoryCleanOption(executionContext, endpoint); CreateDirectory( executionContext, description: "build directory", path: Path.Combine(IOUtil.GetWorkPath(HostContext), newConfig.BuildDirectory), deleteExisting: cleanOption == BuildCleanOption.All); CreateDirectory( executionContext, description: "artifacts directory", path: Path.Combine(IOUtil.GetWorkPath(HostContext), newConfig.ArtifactsDirectory), deleteExisting: true); CreateDirectory( executionContext, description: "test results directory", path: Path.Combine(IOUtil.GetWorkPath(HostContext), newConfig.TestResultsDirectory), deleteExisting: true); CreateDirectory( executionContext, description: "binaries directory", path: Path.Combine(IOUtil.GetWorkPath(HostContext), newConfig.BuildDirectory, Constants.Build.Path.BinariesDirectory), deleteExisting: cleanOption == BuildCleanOption.Binary); CreateDirectory( executionContext, description: "source directory", path: Path.Combine(IOUtil.GetWorkPath(HostContext), newConfig.BuildDirectory, Constants.Build.Path.SourcesDirectory), deleteExisting: cleanOption == BuildCleanOption.Source); return(newConfig); }