public async Task DownloadAsync(IExecutionContext executionContext, ArtifactDefinition artifactDefinition, string downloadFolderPath) { ArgUtil.NotNull(executionContext, nameof(executionContext)); ArgUtil.NotNull(artifactDefinition, nameof(artifactDefinition)); ArgUtil.NotNullOrEmpty(downloadFolderPath, nameof(downloadFolderPath)); var gitArtifactDetails = artifactDefinition.Details as TfsGitArtifactDetails; ArgUtil.NotNull(gitArtifactDetails, nameof(gitArtifactDetails)); ServiceEndpoint endpoint = executionContext.Endpoints.FirstOrDefault((e => string.Equals(e.Name, gitArtifactDetails.RepositoryId, StringComparison.OrdinalIgnoreCase))); if (endpoint == null) { throw new InvalidOperationException(StringUtil.Loc("RMGitEndpointNotFound")); } var extensionManager = HostContext.GetService <IExtensionManager>(); ISourceProvider sourceProvider = (extensionManager.GetExtensions <ISourceProvider>()).FirstOrDefault(x => x.RepositoryType == WellKnownRepositoryTypes.TfsGit); if (sourceProvider == null) { throw new InvalidOperationException(StringUtil.Loc("SourceArtifactProviderNotFound", WellKnownRepositoryTypes.TfsGit)); } var tfsGitEndpoint = endpoint.Clone(); tfsGitEndpoint.Data.Add(Constants.EndpointData.SourcesDirectory, downloadFolderPath); tfsGitEndpoint.Data.Add(Constants.EndpointData.SourceBranch, gitArtifactDetails.Branch); tfsGitEndpoint.Data.Add(Constants.EndpointData.SourceVersion, artifactDefinition.Version); await sourceProvider.GetSourceAsync(executionContext, tfsGitEndpoint, executionContext.CancellationToken); }
public override async Task RunAsync(AgentTaskPluginExecutionContext executionContext, CancellationToken token) { var repoAlias = executionContext.GetInput("repository", true); var repo = executionContext.Repositories.Single(x => string.Equals(x.Alias, repoAlias, StringComparison.OrdinalIgnoreCase)); MergeInputs(executionContext, repo); ISourceProvider sourceProvider = GetSourceProvider(repo.Type); await sourceProvider.GetSourceAsync(executionContext, repo, token); }
public override async Task RunAsync(AgentTaskPluginExecutionContext executionContext, CancellationToken token) { var sourceSkipVar = StringUtil.ConvertToBoolean(executionContext.Variables.GetValueOrDefault("agent.source.skip")?.Value); if (sourceSkipVar) { executionContext.Output($"Skip sync source for repository."); return; } var repoAlias = executionContext.GetInput(Pipelines.PipelineConstants.CheckoutTaskInputs.Repository, true); var repo = executionContext.Repositories.Single(x => string.Equals(x.Alias, repoAlias, StringComparison.OrdinalIgnoreCase)); ISourceProvider sourceProvider = GetSourceProvider(repo.Type); await sourceProvider.GetSourceAsync(executionContext, repo, token); }
public async Task DownloadAsync( IExecutionContext executionContext, ArtifactDefinition artifactDefinition, string localFolderPath) { ArgUtil.NotNull(executionContext, nameof(executionContext)); ArgUtil.NotNull(artifactDefinition, nameof(artifactDefinition)); ArgUtil.NotNullOrEmpty(localFolderPath, nameof(localFolderPath)); var gitHubDetails = artifactDefinition.Details as GitHubArtifactDetails; ArgUtil.NotNull(gitHubDetails, nameof(gitHubDetails)); executionContext.Output(StringUtil.Loc("RMReceivedGithubArtifactDetails")); ServiceEndpoint endpoint = executionContext.Endpoints.FirstOrDefault((e => string.Equals(e.Name, gitHubDetails.ConnectionName, StringComparison.OrdinalIgnoreCase))); if (endpoint == null) { throw new InvalidOperationException(StringUtil.Loc("RMGitHubEndpointNotFound", gitHubDetails.ConnectionName)); } ServiceEndpoint gitHubEndpoint = PrepareGitHubTaskEndpoint(endpoint, gitHubDetails.CloneUrl); var extensionManager = HostContext.GetService <IExtensionManager>(); ISourceProvider sourceProvider = (extensionManager.GetExtensions <ISourceProvider>()).FirstOrDefault(x => x.RepositoryType == Microsoft.TeamFoundation.DistributedTask.Pipelines.RepositoryTypes.GitHub); if (sourceProvider == null) { throw new InvalidOperationException(StringUtil.Loc("SourceArtifactProviderNotFound", Microsoft.TeamFoundation.DistributedTask.Pipelines.RepositoryTypes.GitHub)); } gitHubEndpoint.Data.Add(Constants.EndpointData.SourcesDirectory, localFolderPath); gitHubEndpoint.Data.Add(Constants.EndpointData.SourceBranch, gitHubDetails.Branch); gitHubEndpoint.Data.Add(Constants.EndpointData.SourceVersion, artifactDefinition.Version); gitHubEndpoint.Data.Add(EndpointData.CheckoutSubmodules, gitHubDetails.CheckoutSubmodules); gitHubEndpoint.Data.Add(EndpointData.CheckoutNestedSubmodules, gitHubDetails.CheckoutNestedSubmodules); gitHubEndpoint.Data.Add("fetchDepth", gitHubDetails.FetchDepth); gitHubEndpoint.Data.Add("GitLfsSupport", gitHubDetails.GitLfsSupport); try { await sourceProvider.GetSourceAsync(executionContext, gitHubEndpoint, executionContext.CancellationToken); } catch (InvalidOperationException ex) { throw new ArtifactDownloadException(StringUtil.Loc("RMDownloadArtifactUnexpectedError"), ex); } }
public async Task DownloadAsync(IExecutionContext executionContext, ArtifactDefinition artifactDefinition, string downloadFolderPath) { ArgUtil.NotNull(executionContext, nameof(executionContext)); ArgUtil.NotNull(artifactDefinition, nameof(artifactDefinition)); ArgUtil.NotNullOrEmpty(downloadFolderPath, nameof(downloadFolderPath)); var tfsVcArtifactDetails = artifactDefinition.Details as TfsVCArtifactDetails; ArgUtil.NotNull(tfsVcArtifactDetails, nameof(tfsVcArtifactDetails)); ServiceEndpoint endpoint = executionContext.Endpoints.FirstOrDefault((e => string.Equals(e.Name, tfsVcArtifactDetails.RepositoryId, StringComparison.OrdinalIgnoreCase))); if (endpoint == null) { throw new InvalidOperationException(StringUtil.Loc("RMTfsVCEndpointNotFound")); } var tfsVCEndpoint = endpoint.Clone(); PrepareTfsVCEndpoint(tfsVCEndpoint, tfsVcArtifactDetails); var extensionManager = HostContext.GetService <IExtensionManager>(); ISourceProvider sourceProvider = (extensionManager.GetExtensions <ISourceProvider>()).FirstOrDefault(x => x.RepositoryType == Microsoft.TeamFoundation.DistributedTask.Pipelines.RepositoryTypes.Tfvc); if (sourceProvider == null) { throw new InvalidOperationException(StringUtil.Loc("SourceArtifactProviderNotFound", Microsoft.TeamFoundation.DistributedTask.Pipelines.RepositoryTypes.Tfvc)); } var rootDirectory = Directory.GetParent(downloadFolderPath).Name; executionContext.Variables.Set(Constants.Variables.Agent.BuildDirectory, rootDirectory); tfsVCEndpoint.Data.Add(Constants.EndpointData.SourcesDirectory, downloadFolderPath); tfsVCEndpoint.Data.Add(Constants.EndpointData.SourceVersion, artifactDefinition.Version); await sourceProvider.GetSourceAsync(executionContext, tfsVCEndpoint, executionContext.CancellationToken); }
public async Task DownloadAsync( IExecutionContext executionContext, ArtifactDefinition artifactDefinition, string localFolderPath) { ArgUtil.NotNull(executionContext, nameof(executionContext)); ArgUtil.NotNull(artifactDefinition, nameof(artifactDefinition)); ArgUtil.NotNullOrEmpty(localFolderPath, nameof(localFolderPath)); var gitHubDetails = artifactDefinition.Details as GitHubArtifactDetails; ArgUtil.NotNull(gitHubDetails, nameof(gitHubDetails)); executionContext.Output(StringUtil.Loc("RMReceivedGithubArtifactDetails")); ServiceEndpoint endpoint = executionContext.Endpoints.FirstOrDefault((e => string.Equals(e.Name, gitHubDetails.ConnectionName, StringComparison.OrdinalIgnoreCase))); if (endpoint == null) { throw new InvalidOperationException(StringUtil.Loc("RMGitHubEndpointNotFound", gitHubDetails.ConnectionName)); } ServiceEndpoint gitHubEndpoint = PrepareGitHubTaskEndpoint(endpoint, gitHubDetails.CloneUrl); var extensionManager = HostContext.GetService <IExtensionManager>(); ISourceProvider sourceProvider = (extensionManager.GetExtensions <ISourceProvider>()).FirstOrDefault(x => x.RepositoryType == WellKnownRepositoryTypes.GitHub); if (sourceProvider == null) { throw new InvalidOperationException(StringUtil.Loc("SourceArtifactProviderNotFound", WellKnownRepositoryTypes.GitHub)); } gitHubEndpoint.Data.Add(Constants.EndpointData.SourcesDirectory, localFolderPath); gitHubEndpoint.Data.Add(Constants.EndpointData.SourceBranch, gitHubDetails.Branch); gitHubEndpoint.Data.Add(Constants.EndpointData.SourceVersion, artifactDefinition.Version); await sourceProvider.GetSourceAsync(executionContext, gitHubEndpoint, executionContext.CancellationToken); }
public override async Task RunAsync(AgentTaskPluginExecutionContext executionContext, CancellationToken token) { var sourceSkipVar = StringUtil.ConvertToBoolean(executionContext.Variables.GetValueOrDefault("agent.source.skip")?.Value) || !StringUtil.ConvertToBoolean(executionContext.Variables.GetValueOrDefault("build.syncSources")?.Value ?? bool.TrueString); if (sourceSkipVar) { executionContext.Output($"Skip sync source for repository."); return; } var repoAlias = executionContext.GetInput(Pipelines.PipelineConstants.CheckoutTaskInputs.Repository, true); var repo = executionContext.Repositories.Single(x => string.Equals(x.Alias, repoAlias, StringComparison.OrdinalIgnoreCase)); executionContext.PublishTelemetry(area: "AzurePipelinesAgent", feature: "Checkout", properties: new Dictionary <string, string> { { "RepoType", $"{repo.Type}" }, { "HostOS", $"{PlatformUtil.HostOS}" } }); MergeCheckoutOptions(executionContext, repo); var currentRepoPath = repo.Properties.Get <string>(Pipelines.RepositoryPropertyNames.Path); var buildDirectory = executionContext.Variables.GetValueOrDefault("agent.builddirectory")?.Value; var tempDirectory = executionContext.Variables.GetValueOrDefault("agent.tempdirectory")?.Value; ArgUtil.NotNullOrEmpty(currentRepoPath, nameof(currentRepoPath)); ArgUtil.NotNullOrEmpty(buildDirectory, nameof(buildDirectory)); ArgUtil.NotNullOrEmpty(tempDirectory, nameof(tempDirectory)); // Determine the path that we should clone/move the repository into const string sourcesDirectory = "s"; //Constants.Build.Path.SourcesDirectory string expectRepoPath; var path = executionContext.GetInput("path"); if (!string.IsNullOrEmpty(path)) { // When the checkout task provides a path, always use that one expectRepoPath = IOUtil.ResolvePath(buildDirectory, path); if (!expectRepoPath.StartsWith(buildDirectory.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar)) { throw new ArgumentException($"Input path '{path}' should resolve to a directory under '{buildDirectory}', current resolved path '{expectRepoPath}'."); } } else if (HasMultipleCheckouts(executionContext)) { // When there are multiple checkout tasks (and this one didn't set the path), default to directory 1/s/<repoName> expectRepoPath = Path.Combine(buildDirectory, sourcesDirectory, RepositoryUtil.GetCloneDirectory(repo)); } else { // When there's a single checkout task that doesn't have path set, default to sources directory 1/s expectRepoPath = Path.Combine(buildDirectory, sourcesDirectory); } // Update the repository path in the worker process executionContext.UpdateRepositoryPath(repoAlias, expectRepoPath); executionContext.Debug($"Repository requires to be placed at '{expectRepoPath}', current location is '{currentRepoPath}'"); if (!string.Equals(currentRepoPath.Trim(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar), expectRepoPath.Trim(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar), IOUtil.FilePathStringComparison)) { executionContext.Output($"Repository is current at '{currentRepoPath}', move to '{expectRepoPath}'."); var count = 1; var staging = Path.Combine(tempDirectory, $"_{count}"); while (Directory.Exists(staging)) { count++; staging = Path.Combine(tempDirectory, $"_{count}"); } try { executionContext.Debug($"Move existing repository '{currentRepoPath}' to '{expectRepoPath}' via staging directory '{staging}'."); IOUtil.MoveDirectory(currentRepoPath, expectRepoPath, staging, CancellationToken.None); } catch (Exception ex) { executionContext.Debug("Catch exception during repository move."); executionContext.Debug(ex.ToString()); executionContext.Warning("Unable move and reuse existing repository to required location."); IOUtil.DeleteDirectory(expectRepoPath, CancellationToken.None); } executionContext.Output($"Repository will be located at '{expectRepoPath}'."); repo.Properties.Set <string>(Pipelines.RepositoryPropertyNames.Path, expectRepoPath); } ISourceProvider sourceProvider = SourceProviderFactory.GetSourceProvider(repo.Type); await sourceProvider.GetSourceAsync(executionContext, repo, token); }
public override async Task RunAsync(AgentTaskPluginExecutionContext executionContext, CancellationToken token) { var sourceSkipVar = StringUtil.ConvertToBoolean(executionContext.Variables.GetValueOrDefault("agent.source.skip")?.Value) || !StringUtil.ConvertToBoolean(executionContext.Variables.GetValueOrDefault("build.syncSources")?.Value ?? bool.TrueString); if (sourceSkipVar) { executionContext.Output($"Skip sync source for repository."); return; } var repoAlias = executionContext.GetInput(Pipelines.PipelineConstants.CheckoutTaskInputs.Repository, true); var repo = executionContext.Repositories.Single(x => string.Equals(x.Alias, repoAlias, StringComparison.OrdinalIgnoreCase)); MergeCheckoutOptions(executionContext, repo); var currentRepoPath = repo.Properties.Get <string>(Pipelines.RepositoryPropertyNames.Path); var buildDirectory = executionContext.Variables.GetValueOrDefault("agent.builddirectory")?.Value; var tempDirectory = executionContext.Variables.GetValueOrDefault("agent.tempdirectory")?.Value; ArgUtil.NotNullOrEmpty(currentRepoPath, nameof(currentRepoPath)); ArgUtil.NotNullOrEmpty(buildDirectory, nameof(buildDirectory)); ArgUtil.NotNullOrEmpty(tempDirectory, nameof(tempDirectory)); string expectRepoPath; var path = executionContext.GetInput("path"); if (!string.IsNullOrEmpty(path)) { expectRepoPath = IOUtil.ResolvePath(buildDirectory, path); if (!expectRepoPath.StartsWith(buildDirectory.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar)) { throw new ArgumentException($"Input path '{path}' should resolve to a directory under '{buildDirectory}', current resolved path '{expectRepoPath}'."); } } else { // When repository doesn't has path set, default to sources directory 1/s expectRepoPath = Path.Combine(buildDirectory, "s"); } executionContext.UpdateRepositoryPath(repoAlias, expectRepoPath); executionContext.Debug($"Repository requires to be placed at '{expectRepoPath}', current location is '{currentRepoPath}'"); if (!string.Equals(currentRepoPath.Trim(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar), expectRepoPath.Trim(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar), IOUtil.FilePathStringComparison)) { executionContext.Output($"Repository is current at '{currentRepoPath}', move to '{expectRepoPath}'."); var count = 1; var staging = Path.Combine(tempDirectory, $"_{count}"); while (Directory.Exists(staging)) { count++; staging = Path.Combine(tempDirectory, $"_{count}"); } try { executionContext.Debug($"Move existing repository '{currentRepoPath}' to '{expectRepoPath}' via staging directory '{staging}'."); IOUtil.MoveDirectory(currentRepoPath, expectRepoPath, staging, CancellationToken.None); } catch (Exception ex) { executionContext.Debug("Catch exception during repository move."); executionContext.Debug(ex.ToString()); executionContext.Warning("Unable move and reuse existing repository to required location."); IOUtil.DeleteDirectory(expectRepoPath, CancellationToken.None); } executionContext.Output($"Repository will be located at '{expectRepoPath}'."); repo.Properties.Set <string>(Pipelines.RepositoryPropertyNames.Path, expectRepoPath); } ISourceProvider sourceProvider = SourceProviderFactory.GetSourceProvider(repo.Type); await sourceProvider.GetSourceAsync(executionContext, repo, token); }