本文整理汇总了C#中IExecutionContext.Warning方法的典型用法代码示例。如果您正苦于以下问题:C# IExecutionContext.Warning方法的具体用法?C# IExecutionContext.Warning怎么用?C# IExecutionContext.Warning使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IExecutionContext
的用法示例。
在下文中一共展示了IExecutionContext.Warning方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: DownloadArtifactAsync
// This is only used by build artifact. This isn't a officially supported artifact type in RM
public async Task DownloadArtifactAsync(IExecutionContext executionContext, IHostContext hostContext, ArtifactDefinition artifactDefinition, string dropLocation, string localFolderPath)
{
ArgUtil.NotNull(artifactDefinition, nameof(artifactDefinition));
ArgUtil.NotNull(executionContext, nameof(executionContext));
ArgUtil.NotNullOrEmpty(localFolderPath, nameof(localFolderPath));
ArgUtil.NotNullOrEmpty(dropLocation, nameof(dropLocation));
var trimChars = new[] { '\\', '/' };
var relativePath = artifactDefinition.Details.RelativePath;
// If user has specified a relative folder in the drop, change the drop location itself.
dropLocation = Path.Combine(dropLocation.TrimEnd(trimChars), relativePath.Trim(trimChars));
var fileSystemManager = hostContext.CreateService<IReleaseFileSystemManager>();
List<string> filePaths =
new DirectoryInfo(dropLocation).EnumerateFiles("*", SearchOption.AllDirectories)
.Select(path => path.FullName)
.ToList();
if (filePaths.Any())
{
foreach (var filePath in filePaths)
{
var filePathRelativeToDrop = filePath.Replace(dropLocation, string.Empty).Trim(trimChars);
using (var fileReader = fileSystemManager.GetFileReader(filePath))
{
await fileSystemManager.WriteStreamToFile(fileReader.BaseStream, Path.Combine(localFolderPath, filePathRelativeToDrop));
}
}
}
else
{
executionContext.Warning(StringUtil.Loc("RMNoArtifactsFound", relativePath));
}
}
示例2: TryProcessCommand
public bool TryProcessCommand(IExecutionContext context, string input)
{
if (string.IsNullOrEmpty(input))
{
return false;
}
// TryParse input to Command
Command command;
if (!Command.TryParse(input, out command))
{
// if parse fail but input contains ##vso, print warning with DOC link
if (input.IndexOf("##vso") >= 0)
{
context.Warning($"'{input}' contains logging command keyword '##vso'. TODO: aka link to command DOC.");
}
return false;
}
context.Debug($"Try processing logging command: ##vso[{command.Area}.{command.Event}]");
IWorkerCommandExtension extension;
if (_commandExtensions.TryGetValue(command.Area, out extension))
{
// process logging command in serialize oreder.
lock (_commandSerializeLock)
{
try
{
extension.ProcessCommand(context, command);
context.Debug($"Processed logging command: {input}");
}
catch (Exception ex)
{
context.Error(ex);
context.Error($"Unable to process command {input} successfully.");
context.CommandResult = TaskResult.Failed;
}
}
}
else
{
context.Warning(StringUtil.Loc("CommandNotFound", command.Area));
}
return true;
}
示例3: DownloadAsync
public async Task DownloadAsync(IExecutionContext executionContext, ArtifactDefinition artifactDefinition, string localFolderPath)
{
ArgUtil.NotNull(artifactDefinition, nameof(artifactDefinition));
ArgUtil.NotNull(executionContext, nameof(executionContext));
ArgUtil.NotNullOrEmpty(localFolderPath, nameof(localFolderPath));
int buildId = Convert.ToInt32(artifactDefinition.Version, CultureInfo.InvariantCulture);
if (buildId <= 0)
{
throw new ArgumentException("artifactDefinition.Version");
}
var buildArtifactDetails = artifactDefinition.Details as BuildArtifactDetails;
if (buildArtifactDetails == null)
{
throw new ArgumentException("artifactDefinition.Details");
}
// Get the list of available artifacts from build.
executionContext.Output(StringUtil.Loc("RMPreparingToGetBuildArtifactList"));
var vssConnection = new VssConnection(buildArtifactDetails.TfsUrl, buildArtifactDetails.Credentials);
var buildClient = vssConnection.GetClient<BuildHttpClient>();
var xamlBuildClient = vssConnection.GetClient<XamlBuildHttpClient>();
List<ServerBuildArtifact> buildArtifacts = null;
DefinitionType buildDefinitionType = DefinitionType.Build;
try
{
buildArtifacts = await buildClient.GetArtifactsAsync(buildArtifactDetails.Project, buildId);
}
catch (BuildNotFoundException)
{
buildArtifacts = await xamlBuildClient.GetArtifactsAsync(buildArtifactDetails.Project, buildId);
buildDefinitionType = DefinitionType.Xaml;
}
// No artifacts found in the build => Fail it.
if (buildArtifacts == null || !buildArtifacts.Any())
{
throw new ArtifactDownloadException(StringUtil.Loc("RMNoBuildArtifactsFound", buildId));
}
// DownloadFromStream each of the artifact sequentially.
// TODO: Should we download them parallely?
foreach (ServerBuildArtifact buildArtifact in buildArtifacts)
{
if (Match(buildArtifact, artifactDefinition))
{
executionContext.Output(StringUtil.Loc("RMPreparingToDownload", buildArtifact.Name));
await this.DownloadArtifactAsync(executionContext, buildArtifact, artifactDefinition, localFolderPath, buildClient, xamlBuildClient, buildDefinitionType, buildId);
}
else
{
executionContext.Warning(StringUtil.Loc("RMArtifactMatchNotFound", buildArtifact.Name));
}
}
}
示例4: EnableCodeCoverage
public void EnableCodeCoverage(IExecutionContext context, CodeCoverageEnablerInputs ccInputs)
{
Trace.Entering();
_executionContext = context;
ccInputs.VerifyInputsForJacocoMaven();
context.Debug(StringUtil.Format(CodeCoverageConstants.EnablingEditingTemplate, "jacoco", "maven", ccInputs.BuildFile));
// see jacoco maven documentation for more details. http://www.eclemma.org/jacoco/trunk/doc/maven.html
XElement pomXml;
try
{
pomXml = XElement.Load(ccInputs.BuildFile);
}
catch (XmlException e)
{
_executionContext.Warning(StringUtil.Loc("InvalidBuildXml", ccInputs.BuildFile, e.Message));
throw;
}
XNamespace xNameSpace = pomXml.Attribute("xmlns").Value;
if (pomXml.Element(xNameSpace + "modules") != null)
{
// aa multi module project
_isMultiModule = true;
context.Debug(CodeCoverageConstants.MavenMultiModule);
}
// Add a build element if doesnot exist.
var build = pomXml.Element(xNameSpace + "build");
if (build == null)
{
pomXml.Add(new XElement("build"));
build = pomXml.Element("build");
}
// Set jacoco plugins to enable code coverage.
SetPlugins(build, ccInputs, xNameSpace);
foreach (var e in build.DescendantsAndSelf().Where(e => string.IsNullOrEmpty(e.Name.Namespace.NamespaceName)))
{
e.Name = xNameSpace + e.Name.LocalName;
}
using (FileStream stream = new FileStream(ccInputs.BuildFile, FileMode.Create))
{
pomXml.Save(stream);
}
if (_isMultiModule)
{
CreateReportPomForMultiModule(ccInputs.ReportBuildFile, xNameSpace, pomXml, ccInputs);
}
context.Output(StringUtil.Loc("CodeCoverageEnabled", "jacoco", "maven"));
}
示例5: ReadSummaryFile
public static XmlDocument ReadSummaryFile(IExecutionContext context, string summaryXmlLocation)
{
string xmlContents = "";
//read xml contents
if (!File.Exists(summaryXmlLocation))
{
throw new ArgumentException(StringUtil.Loc("FileDoesNotExist", summaryXmlLocation));
}
xmlContents = File.ReadAllText(summaryXmlLocation);
if (string.IsNullOrWhiteSpace(xmlContents))
{
return null;
}
XmlDocument doc = new XmlDocument();
try
{
var settings = new XmlReaderSettings
{
DtdProcessing = DtdProcessing.Ignore
};
using (XmlReader reader = XmlReader.Create(summaryXmlLocation, settings))
{
doc.Load(reader);
}
}
catch (XmlException ex)
{
context.Warning(StringUtil.Loc("FailedToReadFile", summaryXmlLocation, ex.Message));
return null;
}
return doc;
}
示例6: DownloadArtifactAsync
private async Task DownloadArtifactAsync(
IExecutionContext executionContext,
ServerBuildArtifact buildArtifact,
ArtifactDefinition artifactDefinition,
string localFolderPath,
BuildHttpClient buildClient,
XamlBuildHttpClient xamlBuildClient,
DefinitionType definitionType,
int buildId)
{
var downloadFolderPath = Path.Combine(localFolderPath, buildArtifact.Name);
var buildArtifactDetails = artifactDefinition.Details as BuildArtifactDetails;
if ((buildArtifact.Resource.Type == null && buildArtifact.Id == 0) // bug on build API Bug 378900
|| string.Equals(buildArtifact.Resource.Type, WellKnownArtifactResourceTypes.FilePath, StringComparison.OrdinalIgnoreCase))
{
executionContext.Output("Artifact Type: FileShare");
string fileShare;
if (buildArtifact.Id == 0)
{
fileShare = new Uri(buildArtifact.Resource.DownloadUrl).LocalPath;
}
else
{
fileShare = new Uri(Path.Combine(buildArtifact.Resource.DownloadUrl, buildArtifact.Name)).LocalPath;
if (!Directory.Exists(fileShare))
{
// download path does not exist, log and fall back
var parenthPath = new Uri(buildArtifact.Resource.DownloadUrl).LocalPath;
executionContext.Output(StringUtil.Loc("RMArtifactNameDirectoryNotFound", fileShare, parenthPath));
fileShare = parenthPath;
}
}
if (!Directory.Exists(fileShare))
{
// download path does not exist, raise exception
throw new ArtifactDownloadException(StringUtil.Loc("RMArtifactDirectoryNotFoundError", fileShare));
}
executionContext.Output(StringUtil.Loc("RMDownloadingArtifactFromFileShare", fileShare));
var fileShareArtifact = new FileShareArtifact();
await fileShareArtifact.DownloadArtifactAsync(executionContext, HostContext, artifactDefinition, fileShare, downloadFolderPath);
}
else if (string.Equals(buildArtifact.Resource.Type, WellKnownArtifactResourceTypes.Container, StringComparison.OrdinalIgnoreCase))
{
executionContext.Output("Artifact Type: ServerDrop");
// TODO:Get VssBinFetchclient and get away from zipstream downloader
Stream contentStream;
if (definitionType == DefinitionType.Xaml)
{
contentStream = await xamlBuildClient.GetArtifactContentZipAsync(buildArtifactDetails.Project, buildId, buildArtifact.Name);
}
else
{
contentStream = await buildClient.GetArtifactContentZipAsync(buildArtifactDetails.Project, buildId, buildArtifact.Name);
}
var zipStreamDownloader = HostContext.GetService<IZipStreamDownloader>();
string artifactRootFolder = StringUtil.Format("/{0}", buildArtifact.Name);
await zipStreamDownloader.DownloadFromStream(contentStream, artifactRootFolder, buildArtifactDetails.RelativePath, downloadFolderPath);
}
else
{
executionContext.Warning(StringUtil.Loc("RMArtifactTypeNotSupported", buildArtifact.Resource.Type));
}
}
示例7: LoadIfExists
public TrackingConfigBase LoadIfExists(IExecutionContext executionContext, string file)
{
Trace.Entering();
// The tracking config will not exist for a new definition.
if (!File.Exists(file))
{
return null;
}
// Load the content and distinguish between tracking config file
// version 1 and file version 2.
string content = File.ReadAllText(file);
string fileFormatVersionJsonProperty = StringUtil.Format(
@"""{0}""",
TrackingConfig.FileFormatVersionJsonProperty);
if (content.Contains(fileFormatVersionJsonProperty))
{
// The config is the new format.
Trace.Verbose("Parsing new tracking config format.");
return JsonConvert.DeserializeObject<TrackingConfig>(content);
}
// Attempt to parse the legacy format.
Trace.Verbose("Parsing legacy tracking config format.");
LegacyTrackingConfig config = LegacyTrackingConfig.TryParse(content);
if (config == null)
{
executionContext.Warning(StringUtil.Loc("UnableToParseBuildTrackingConfig0", content));
}
return config;
}
示例8: GetSourceAsync
public async Task GetSourceAsync(
IExecutionContext executionContext,
ServiceEndpoint endpoint,
CancellationToken cancellationToken)
{
// Validate args.
ArgUtil.NotNull(executionContext, nameof(executionContext));
ArgUtil.NotNull(endpoint, nameof(endpoint));
// Create the tf command manager.
var tf = HostContext.CreateService<ITfsVCCommandManager>();
tf.CancellationToken = cancellationToken;
tf.Endpoint = endpoint;
tf.ExecutionContext = executionContext;
// Check if the administrator accepted the license terms of the TEE EULA when configuring the agent.
AgentSettings settings = HostContext.GetService<IConfigurationStore>().GetSettings();
if (tf.Features.HasFlag(TfsVCFeatures.Eula) && settings.AcceptTeeEula)
{
// Check if the "tf eula -accept" command needs to be run for the current user.
bool skipEula = false;
try
{
skipEula = tf.TestEulaAccepted();
}
catch (Exception ex)
{
Trace.Error("Unexpected exception while testing whether the TEE EULA has been accepted for the current security user.");
Trace.Error(ex);
}
if (!skipEula)
{
// Run the command "tf eula -accept".
try
{
await tf.EulaAsync();
}
catch (Exception ex)
{
Trace.Error(ex);
executionContext.Warning(ex.Message);
}
}
}
// Get the workspaces.
ITfsVCWorkspace[] tfWorkspaces = await tf.WorkspacesAsync();
// Determine the workspace name.
string buildDirectory = executionContext.Variables.Agent_BuildDirectory;
ArgUtil.NotNullOrEmpty(buildDirectory, nameof(buildDirectory));
string workspaceName = $"ws_{Path.GetFileName(buildDirectory)}_{settings.AgentId}";
executionContext.Variables.Set(Constants.Variables.Build.RepoTfvcWorkspace, workspaceName);
// Get the definition mappings.
DefinitionWorkspaceMapping[] definitionMappings =
JsonConvert.DeserializeObject<DefinitionWorkspaceMappings>(endpoint.Data[WellKnownEndpointData.TfvcWorkspaceMapping])?.Mappings;
// Determine the sources directory.
string sourcesDirectory = executionContext.Variables.Build_SourcesDirectory;
ArgUtil.NotNullOrEmpty(sourcesDirectory, nameof(sourcesDirectory));
// Attempt to re-use an existing workspace if the command manager supports scorch
// or if clean is not specified.
ITfsVCWorkspace existingTFWorkspace = null;
bool clean = endpoint.Data.ContainsKey(WellKnownEndpointData.Clean) &&
StringUtil.ConvertToBoolean(endpoint.Data[WellKnownEndpointData.Clean], defaultValue: false);
if (tf.Features.HasFlag(TfsVCFeatures.Scorch) || !clean)
{
existingTFWorkspace = MatchExactWorkspace(
tfWorkspaces: tfWorkspaces,
name: workspaceName,
definitionMappings: definitionMappings,
sourcesDirectory: sourcesDirectory);
if (existingTFWorkspace != null)
{
if (tf.Features.HasFlag(TfsVCFeatures.GetFromUnmappedRoot))
{
// Undo pending changes.
ITfsVCStatus tfStatus = await tf.StatusAsync(localPath: sourcesDirectory);
if (tfStatus?.HasPendingChanges ?? false)
{
await tf.UndoAsync(localPath: sourcesDirectory);
// Cleanup remaining files/directories from pend adds.
tfStatus.AllAdds
.OrderByDescending(x => x.LocalItem) // Sort descending so nested items are deleted before their parent is deleted.
.ToList()
.ForEach(x =>
{
executionContext.Output(StringUtil.Loc("Deleting", x.LocalItem));
IOUtil.Delete(x.LocalItem, cancellationToken);
});
}
}
else
{
// Perform "undo" for each map.
foreach (DefinitionWorkspaceMapping definitionMapping in definitionMappings ?? new DefinitionWorkspaceMapping[0])
//.........这里部分代码省略.........
示例9: EnableCodeCoverage
public void EnableCodeCoverage(IExecutionContext context, CodeCoverageEnablerInputs ccInputs)
{
Trace.Entering();
_executionContext = context;
context.Debug(StringUtil.Format(CodeCoverageConstants.EnablingEditingTemplate, "cobertura", "maven", ccInputs.BuildFile));
XElement pomXml;
try
{
pomXml = XElement.Load(ccInputs.BuildFile);
}
catch (XmlException e)
{
_executionContext.Warning(StringUtil.Loc("InvalidBuildXml", ccInputs.BuildFile, e.Message));
throw;
}
XNamespace xNameSpace = pomXml.Attribute("xmlns").Value;
if (pomXml.Element(xNameSpace + "modules") != null)
{
// aa multi module project
_isMultiModule = true;
context.Debug("This is a multi module project. Generating code coverage reports using ant task.");
}
// Add a build element if doesnot exist.
var build = pomXml.Element(xNameSpace + "build");
if (build == null)
{
pomXml.Add(new XElement(xNameSpace + "build"));
build = pomXml.Element(xNameSpace + "build");
}
// Set cobertura plugins to enable code coverage.
SetPlugins(build, ccInputs, xNameSpace);
// Adding reporting enabler for cobertura
var report = pomXml.Element(xNameSpace + "reporting");
if (report == null)
{
pomXml.Add(new XElement(xNameSpace + "reporting"));
report = pomXml.Element(xNameSpace + "reporting");
}
var pluginsInReport = report.Element(xNameSpace + _pluginsTag);
if (pluginsInReport == null)
{
report.Add(new XElement(xNameSpace + _pluginsTag));
pluginsInReport = report.Element(xNameSpace + _pluginsTag);
}
IList<XElement> pluginListInReport = pluginsInReport.Elements(xNameSpace + _pluginTag).ToList();
foreach (var plugin in pluginListInReport.Where(plugin =>
{
var groupId = plugin.Element(xNameSpace + "groupId");
var artifactId = plugin.Element(xNameSpace + "artifactId");
return (artifactId != null && artifactId.Value == _coberturaArtifactId)
&& (groupId != null && groupId.Value == _coberturaGroupId);
}))
{
plugin.Parent.RemoveAll();
}
pluginsInReport.Add(GetDefaultReporting());
foreach (var e in build.DescendantsAndSelf().Where(e => string.IsNullOrEmpty(e.Name.Namespace.NamespaceName)))
{
e.Name = xNameSpace + e.Name.LocalName;
}
foreach (var e in report.DescendantsAndSelf().Where(e => string.IsNullOrEmpty(e.Name.Namespace.NamespaceName)))
{
e.Name = xNameSpace + e.Name.LocalName;
}
using (FileStream stream = new FileStream(ccInputs.BuildFile, FileMode.Create))
{
pomXml.Save(stream);
}
context.Output(StringUtil.Loc("CodeCoverageEnabled", "cobertura", "maven"));
}
示例10: ProcessArtifactUploadCommand
private void ProcessArtifactUploadCommand(IExecutionContext context, Dictionary<string, string> eventProperties, string data)
{
ArgUtil.NotNull(context, nameof(context));
ArgUtil.NotNull(context.Endpoints, nameof(context.Endpoints));
ServiceEndpoint systemConnection = context.Endpoints.FirstOrDefault(e => string.Equals(e.Name, ServiceEndpoints.SystemVssConnection, StringComparison.OrdinalIgnoreCase));
ArgUtil.NotNull(systemConnection, nameof(systemConnection));
ArgUtil.NotNull(systemConnection.Url, nameof(systemConnection.Url));
Uri projectUrl = systemConnection.Url;
VssCredentials projectCredential = ApiUtil.GetVssCredential(systemConnection);
Guid projectId = context.Variables.System_TeamProjectId ?? Guid.Empty;
ArgUtil.NotEmpty(projectId, nameof(projectId));
int? buildId = context.Variables.Build_BuildId;
ArgUtil.NotNull(buildId, nameof(buildId));
long? containerId = context.Variables.Build_ContainerId;
ArgUtil.NotNull(containerId, nameof(containerId));
string artifactName;
if (!eventProperties.TryGetValue(ArtifactAssociateEventProperties.ArtifactName, out artifactName) ||
string.IsNullOrEmpty(artifactName))
{
throw new Exception(StringUtil.Loc("ArtifactNameRequired"));
}
string containerFolder;
if (!eventProperties.TryGetValue(ArtifactUploadEventProperties.ContainerFolder, out containerFolder) ||
string.IsNullOrEmpty(containerFolder))
{
containerFolder = artifactName;
}
var propertyDictionary = ExtractArtifactProperties(eventProperties);
string localPath = data;
if (string.IsNullOrEmpty(localPath))
{
throw new Exception(StringUtil.Loc("ArtifactLocationRequired"));
}
string fullPath = Path.GetFullPath(localPath);
if (!File.Exists(fullPath) && !Directory.Exists(fullPath))
{
// if localPath is not a file or folder on disk
throw new FileNotFoundException(StringUtil.Loc("PathNotExist", localPath));
}
else if (Directory.Exists(fullPath) && Directory.EnumerateFiles(fullPath, "*", SearchOption.AllDirectories).FirstOrDefault() == null)
{
// if localPath is a folder but the folder contains nothing
context.Warning(StringUtil.Loc("DirectoryIsEmptyForArtifact", fullPath, artifactName));
return;
}
// queue async command task to associate artifact.
context.Debug($"Upload artifact: {fullPath} to server for build: {buildId.Value} at backend.");
var commandContext = HostContext.CreateService<IAsyncCommandContext>();
commandContext.InitializeCommandContext(context, StringUtil.Loc("UploadArtifact"));
commandContext.Task = UploadArtifactAsync(commandContext,
projectUrl,
projectCredential,
projectId,
containerId.Value,
containerFolder,
buildId.Value,
artifactName,
propertyDictionary,
fullPath,
context.CancellationToken);
context.AsyncCommands.Add(commandContext);
}
示例11: ReadResults
/// <summary>
/// Reads a JUnit results file from disk, converts it into a TestRunData object.
/// </summary>
/// <param name="filePath"></param>
/// <param name="runContext"></param>
/// <returns></returns>
public TestRunData ReadResults(IExecutionContext executionContext, string filePath, TestRunContext runContext = null)
{
// http://windyroad.com.au/dl/Open%20Source/JUnit.xsd
XmlDocument doc = new XmlDocument();
try
{
var settings = new XmlReaderSettings
{
DtdProcessing = DtdProcessing.Prohibit
};
using (XmlReader reader = XmlReader.Create(filePath, settings))
{
doc.Load(reader);
}
}
catch (XmlException ex)
{
executionContext.Warning(StringUtil.Loc("FailedToReadFile", filePath, ex.Message));
return null;
}
//init test run summary information - run name, host name, start time
TestSuiteSummary runSummary = new TestSuiteSummary(Name);
IdentityRef runUserIdRef = null;
string runUser = runContext != null ? runContext.Owner : string.Empty;
if (!string.IsNullOrEmpty(runUser))
{
runUserIdRef = new IdentityRef() { DisplayName = runUser };
}
//read data from testsuite nodes
XmlNode testSuitesNode = doc.SelectSingleNode("testsuites");
if (testSuitesNode != null)
{
//found testsuites node - some plugins generate it like karma junit plugin
XmlNodeList testSuiteNodeList = doc.SelectNodes("/testsuites/testsuite");
if (testSuiteNodeList != null)
{
foreach (XmlNode testSuiteNode in testSuiteNodeList)
{
TestSuiteSummary testSuiteSummary = ReadTestSuite(testSuiteNode, runUserIdRef);
runSummary.Duration = runSummary.Duration.Add(testSuiteSummary.Duration);
runSummary.Results.AddRange(testSuiteSummary.Results);
runSummary.Host = testSuiteSummary.Host;
runSummary.Name = testSuiteSummary.Name;
}
if (testSuiteNodeList.Count > 1)
{
runSummary.Name = Name + "_" + Path.GetFileName(filePath);
}
}
}
else
{
XmlNode testSuiteNode = doc.SelectSingleNode("testsuite");
if (testSuiteNode != null)
{
runSummary = ReadTestSuite(testSuiteNode, runUserIdRef);
}
}
if (runContext != null && !string.IsNullOrWhiteSpace(runContext.RunName))
{
runSummary.Name = runContext.RunName;
}
if (runSummary.Results.Count > 0)
{
//first testsuite starteddate is the starteddate of the run
runSummary.TimeStamp = DateTime.Parse(runSummary.Results[0].StartedDate);
}
//create test run data
var testRunData = new TestRunData(
name: runSummary.Name,
startedDate: runSummary.TimeStamp.ToString("o"),
completedDate: runSummary.TimeStamp.Add(runSummary.Duration).ToString("o"),
state: TestRunState.InProgress.ToString(),
isAutomated: true,
buildId: runContext != null ? runContext.BuildId : 0,
buildFlavor: runContext != null ? runContext.Configuration : string.Empty,
buildPlatform: runContext != null ? runContext.Platform : string.Empty,
releaseUri: runContext != null ? runContext.ReleaseUri : null,
releaseEnvironmentUri: runContext != null ? runContext.ReleaseEnvironmentUri : null
)
{
Results = runSummary.Results.ToArray(),
Attachments = AddResultsFileToRunLevelAttachments ? new string[] { filePath } : new string[0]
//.........这里部分代码省略.........
示例12: RemoveCachedCredential
private async Task RemoveCachedCredential(IExecutionContext context, string repositoryPath, Uri repositoryUrl, string remoteName)
{
//remove credential from fetch url
context.Debug("Remove injected credential from git remote fetch url.");
int exitCode_seturl = await _gitCommandManager.GitRemoteSetUrl(context, repositoryPath, remoteName, repositoryUrl.AbsoluteUri);
context.Debug("Remove injected credential from git remote push url.");
int exitCode_setpushurl = await _gitCommandManager.GitRemoteSetPushUrl(context, repositoryPath, remoteName, repositoryUrl.AbsoluteUri);
if (exitCode_seturl != 0 || exitCode_setpushurl != 0)
{
// if unable to use git.exe set fetch url back, modify git config file on disk. make sure we don't left credential.
context.Warning("Unable to use git.exe remove injected credential from git remote fetch url, modify git config file on disk to remove injected credential.");
string gitConfig = Path.Combine(repositoryPath, ".git/config");
if (File.Exists(gitConfig))
{
string gitConfigContent = File.ReadAllText(Path.Combine(repositoryPath, ".git", "config"));
Uri urlWithCred;
if (_credentialUrlCache.TryGetValue(repositoryUrl.AbsoluteUri, out urlWithCred))
{
gitConfigContent = gitConfigContent.Replace(urlWithCred.AbsoluteUri, repositoryUrl.AbsoluteUri);
File.WriteAllText(gitConfig, gitConfigContent);
}
}
}
}
示例13: GetSourceAsync
public virtual async Task GetSourceAsync(IExecutionContext executionContext, ServiceEndpoint endpoint, CancellationToken cancellationToken)
{
Trace.Entering();
ArgUtil.NotNull(endpoint, nameof(endpoint));
executionContext.Output($"Syncing repository: {endpoint.Name} (Git)");
_gitCommandManager = HostContext.GetService<IGitCommandManager>();
await _gitCommandManager.LoadGitExecutionInfo(executionContext);
string targetPath = executionContext.Variables.Get(Constants.Variables.Build.SourcesDirectory);
string sourceBranch = executionContext.Variables.Get(Constants.Variables.Build.SourceBranch);
string sourceVersion = executionContext.Variables.Get(Constants.Variables.Build.SourceVersion);
bool clean = false;
if (endpoint.Data.ContainsKey(WellKnownEndpointData.Clean))
{
clean = StringUtil.ConvertToBoolean(endpoint.Data[WellKnownEndpointData.Clean]);
}
bool checkoutSubmodules = false;
if (endpoint.Data.ContainsKey(WellKnownEndpointData.CheckoutSubmodules))
{
checkoutSubmodules = StringUtil.ConvertToBoolean(endpoint.Data[WellKnownEndpointData.CheckoutSubmodules]);
}
bool exposeCred = executionContext.Variables.GetBoolean(Constants.Variables.System.EnableAccessToken) ?? false;
Trace.Info($"Repository url={endpoint.Url}");
Trace.Info($"targetPath={targetPath}");
Trace.Info($"sourceBranch={sourceBranch}");
Trace.Info($"sourceVersion={sourceVersion}");
Trace.Info($"clean={clean}");
Trace.Info($"checkoutSubmodules={checkoutSubmodules}");
Trace.Info($"exposeCred={exposeCred}");
// retrieve credential from endpoint.
Uri repositoryUrl = endpoint.Url;
if (!repositoryUrl.IsAbsoluteUri)
{
throw new InvalidOperationException("Repository url need to be an absolute uri.");
}
string username = string.Empty;
string password = string.Empty;
if (endpoint.Authorization != null)
{
switch (endpoint.Authorization.Scheme)
{
case EndpointAuthorizationSchemes.OAuth:
username = EndpointAuthorizationSchemes.OAuth;
if (!endpoint.Authorization.Parameters.TryGetValue(EndpointAuthorizationParameters.AccessToken, out password))
{
password = string.Empty;
}
break;
case EndpointAuthorizationSchemes.UsernamePassword:
if (!endpoint.Authorization.Parameters.TryGetValue(EndpointAuthorizationParameters.Username, out username))
{
// leave the username as empty, the username might in the url, like: http://[email protected]
username = string.Empty;
}
if (!endpoint.Authorization.Parameters.TryGetValue(EndpointAuthorizationParameters.Password, out password))
{
// we have username, but no password
password = string.Empty;
}
break;
default:
executionContext.Warning($"Unsupport endpoint authorization schemes: {endpoint.Authorization.Scheme}");
break;
}
}
// Check the current contents of the root folder to see if there is already a repo
// If there is a repo, see if it matches the one we are expecting to be there based on the remote fetch url
// if the repo is not what we expect, remove the folder
if (!await IsRepositoryOriginUrlMatch(executionContext, targetPath, repositoryUrl))
{
// Delete source folder
IOUtil.DeleteDirectory(targetPath, cancellationToken);
}
else
{
// delete the index.lock file left by previous canceled build or any operation casue git.exe crash last time.
string lockFile = Path.Combine(targetPath, ".git\\index.lock");
if (File.Exists(lockFile))
{
try
{
File.Delete(lockFile);
}
catch (Exception ex)
{
executionContext.Debug($"Unable to delete the index.lock file: {lockFile}");
executionContext.Debug(ex.ToString());
}
}
// When repo.clean is selected for a git repo, execute git clean -fdx and git reset --hard HEAD on the current repo.
// This will help us save the time to reclone the entire repo.
//.........这里部分代码省略.........
示例14: GitGetFetchUrl
// git config --get remote.origin.url
public async Task<Uri> GitGetFetchUrl(IExecutionContext context, string repositoryPath)
{
context.Debug($"Inspect remote.origin.url for repository under {repositoryPath}");
Uri fetchUrl = null;
List<string> outputStrings = new List<string>();
int exitCode = await ExecuteGitCommandAsync(context, repositoryPath, "config", "--get remote.origin.url", outputStrings);
if (exitCode != 0)
{
context.Warning($"'git config --get remote.origin.url' failed with exit code: {exitCode}, output: '{string.Join(Environment.NewLine, outputStrings)}'");
}
else
{
// remove empty strings
outputStrings = outputStrings.Where(o => !string.IsNullOrEmpty(o)).ToList();
if (outputStrings.Count == 1 && !string.IsNullOrEmpty(outputStrings.First()))
{
string remoteFetchUrl = outputStrings.First();
if (Uri.IsWellFormedUriString(remoteFetchUrl, UriKind.Absolute))
{
context.Debug($"Get remote origin fetch url from git config: {remoteFetchUrl}");
fetchUrl = new Uri(remoteFetchUrl);
}
else
{
context.Debug($"The Origin fetch url from git config: {remoteFetchUrl} is not a absolute well formed url.");
}
}
else
{
context.Debug($"Unable capture git remote fetch uri from 'git config --get remote.origin.url' command's output, the command's output is not expected: {string.Join(Environment.NewLine, outputStrings)}.");
}
}
return fetchUrl;
}
示例15: PostJobCleanupAsync
public override async Task PostJobCleanupAsync(IExecutionContext executionContext, ServiceEndpoint endpoint)
{
Trace.Entering();
ArgUtil.NotNull(endpoint, nameof(endpoint));
executionContext.Output($"Cleaning extra http auth header from repository: {endpoint.Name} (TfsGit)");
Uri repositoryUrl = endpoint.Url;
string targetPath = executionContext.Variables.Get(Constants.Variables.Build.SourcesDirectory);
executionContext.Debug($"Repository url={endpoint.Url}");
executionContext.Debug($"targetPath={targetPath}");
executionContext.Debug("Remove any extraheader setting from git config.");
foreach (var header in _authHeaderCache)
{
int exitCode_configUnset = await _gitCommandManager.GitConfigUnset(executionContext, targetPath, header.Key);
if (exitCode_configUnset != 0)
{
// if unable to use git.exe unset http.extraheader, modify git config file on disk. make sure we don't left credential.
executionContext.Warning("Unable to use git.exe unset http.extraheader, modify git config file on disk to remove leaking credential.");
string gitConfig = Path.Combine(targetPath, ".git/config");
if (File.Exists(gitConfig))
{
string gitConfigContent = File.ReadAllText(Path.Combine(targetPath, ".git", "config"));
if (gitConfigContent.Contains(header.Key))
{
string setting = $"extraheader = {header.Key}";
gitConfigContent = Regex.Replace(gitConfigContent, setting, string.Empty, RegexOptions.IgnoreCase);
File.WriteAllText(gitConfig, gitConfigContent);
}
}
}
}
}