public static JenkinsBuild GetLatestBuild(string baseUri, string versionBase, bool stable = true) { JenkinsBuild result = null; if (!(baseUri.EndsWith ("/"))) { baseUri = baseUri + "/"; } // http://jenkins.mumech.com/job/MechJeb2/lastStableBuild/api/json string json = Call (baseUri + "lastStableBuild/api/json"); JObject build = JObject.Parse (json); if (build != null) { string buildNumber = (string) build ["number"]; JArray artifacts = (JArray) build ["artifacts"]; log.DebugFormat(" Parsing artifacts from {0}", artifacts); foreach (JObject artifact in artifacts.Children()) { log.DebugFormat(" Parsing artifact from {0}", artifact); string fileName = (string) artifact ["fileName"]; // TODO - filtering of artifacts, for now hardcoded for zip files. if (fileName.EndsWith (".zip")) { result = new JenkinsBuild (artifact, versionBase, buildNumber, baseUri, stable); } } } return result; }
private Status CreateStatus(JenkinsBuild latestBuild) { var newStatus = new JenkinsStatus(GetState(latestBuild)) { Name = $"{latestBuild.DisplayName} ({TimeSpan.FromMilliseconds(latestBuild.Duration):g})", Time = DateTimeOffset.FromUnixTimeMilliseconds(latestBuild.Timestamp).UtcDateTime, Details = latestBuild.Description, }; newStatus.BuildNumber = latestBuild.Number; newStatus.DisplayName = latestBuild.DisplayName; newStatus.Building = latestBuild.Building; newStatus.Duration = new TimeSpan(latestBuild.Duration * TicksInMillisecond); newStatus.EstimatedDuration = new TimeSpan(latestBuild.EstimatedDuration * TicksInMillisecond); newStatus.Culprits = latestBuild.Culprits; newStatus.Url = JenkinsApi.UrlHelper.BuildUrl(this, newStatus.BuildNumber); newStatus.CommittedToThisBuild = latestBuild.ChangeSets?.SelectMany(p => p.ChangeSetItems) .Select(p => p.Author) .GroupBy(p => p.FullName) .Select(p => p.FirstOrDefault()) .ToList(); return(newStatus); }
private static OperationProgress ComputeProgress(JenkinsBuild build) { if (build == null || build.Duration == null || build.EstimatedDuration == null) { return(new OperationProgress((int?)null)); } int progress = ((int)build.Duration * 100) / (int)build.EstimatedDuration; return(new OperationProgress(Math.Min(progress, 99))); }
/// <summary> /// Return a list of the runs for the build. /// </summary> /// <param name="lastBuild"></param> /// <returns></returns> public async Task <TDTJobRun[]> GetRunsForBuild(JenkinsBuild build) { var allasTasks = build.Runs .Where(r => r.Number == build.Number) .Select(async r => await _client.GetBuildAsync(r.RestUrl)) .Select(async binfo => new TDTJobRun(await binfo)) .ToArray(); await Task.WhenAll(allasTasks); return(allasTasks.Select(t => t.Result).ToArray()); }
private static ObservationState GetState(JenkinsBuild build) { if (string.IsNullOrWhiteSpace(build.Result)) { return(build.Building ? ObservationState.Running : ObservationState.Unknown); } if (Enum.TryParse <ObservationState>(build.Result, true, out var state)) { return(state); } return(ObservationState.Unknown); }
public void GetLatestBuild_ModuleManager_Works() { // Arrange IJenkinsApi sut = new JenkinsApi(new CachingHttpService(_cache)); // Act JenkinsBuild build = sut.GetLatestBuild( new JenkinsRef("#/ckan/jenkins/https://ksp.sarbian.com/jenkins/job/ModuleManager/"), new JenkinsOptions() ); // Assert Assert.IsNotNull(build.Url); Assert.IsNotNull(build.Artifacts); }
private Metadata TransformOne(Metadata metadata, JObject json, JenkinsBuild build, JenkinsOptions options) { JenkinsArtifact[] artifacts = build.Artifacts .Where(a => options.AssetMatchPattern.IsMatch(a.FileName)) .ToArray(); switch (artifacts.Length) { case 1: JenkinsArtifact artifact = artifacts.Single(); string download = Uri.EscapeUriString( $"{build.Url}artifact/{artifact.RelativePath}" ); Log.DebugFormat("Using download URL: {0}", download); json.SafeAdd("download", download); if (options.UseFilenameVersion) { Log.DebugFormat("Using filename as version: {0}", artifact.FileName); json.SafeAdd("version", artifact.FileName); } // Make sure resources exist. if (json["resources"] == null) { json["resources"] = new JObject(); } var resourcesJson = (JObject)json["resources"]; resourcesJson.SafeAdd("ci", Uri.EscapeUriString(metadata.Kref.Id)); Log.DebugFormat("Transformed metadata:{0}{1}", Environment.NewLine, json); return(new Metadata(json)); break; case 0: throw new Exception("Could not find any matching artifacts"); default: throw new Exception("Found too many matching artifacts"); } }
public async Task <JenkinsBuild> GetBuildAsync(string url, bool depthLoad) { if (url == null) { throw new ArgumentNullException("url"); } JenkinsBuild build = await this.restManager.LoadAsync <JenkinsBuild>(url); if (depthLoad && build != null) { build.TestReport = await GetTestReportAsync(build.TestRestUrl); // There is actually nothing lazy loaded nested in REST build structure. } return(build); }
public TDTJobRun(JenkinsBuild jenkinsBuild) { this._build = jenkinsBuild; var m = _urlParser.Match(jenkinsBuild.Url); if (!m.Success) { throw new ArgumentException("Unknown url format: {0}", jenkinsBuild.Url); } var queryParams = m.Groups["p0"].Value.Split('/').Where(s => s.Contains(",")).Last().Split(','); Parameters = new Dictionary <string, string>(); foreach (var pair in queryParams) { var keyValue = pair.Split('='); Parameters[keyValue[0]] = keyValue[1]; } }
/// <summary> /// Constructs a MobileProvision from an xml blob extracted from the real ASN.1 file /// </summary> public MobileProvision(string EmbeddedPListText) { Data = new PListHelper(EmbeddedPListText); // Now extract things // Key: ApplicationIdentifierPrefix, Array<String> List <string> PrefixList = Data.GetArray("ApplicationIdentifierPrefix", "string"); if (PrefixList.Count > 1) { UnityEngine.Debug.LogWarning("Found more than one entry for ApplicationIdentifierPrefix in the .mobileprovision, using the first one found"); } if (PrefixList.Count > 0) { ApplicationIdentifierPrefix = PrefixList[0]; } // Key: DeveloperCertificates, Array<Data> (uuencoded) string CertificatePassword = ""; List <string> CertificateList = Data.GetArray("DeveloperCertificates", "data"); foreach (string EncodedCert in CertificateList) { byte[] RawCert = Convert.FromBase64String(EncodedCert); DeveloperCertificates.Add(new X509Certificate2(RawCert, CertificatePassword)); } // Key: Name, String if (!Data.GetString("Name", out ProvisionName)) { ProvisionName = "(unknown)"; } if (!Data.GetString("UUID", out ProvisionUUID)) { ProvisionUUID = "(unknown)"; } PListHelper XCentPList = null; Data.ProcessValueForKey("Entitlements", "dict", delegate(XmlNode ValueNode) { XCentPList = PListHelper.CloneDictionaryRootedAt(ValueNode); }); XCentPList.GetString("application-identifier", out ApplicationIdentifier); ApplicationIdentifier = ApplicationIdentifier.Replace(ApplicationIdentifierPrefix + ".", ""); XCentPList.GetString("aps-environment", out ApsEnvironment); if (string.IsNullOrEmpty(ApsEnvironment)) { UnityEngine.Debug.LogError(">>>>>>>>>>aps-environment is null"); } // Key: ProvisionedDevices, Array<String> ProvisionedDeviceIDs = Data.GetArray("ProvisionedDevices", "string"); string certificates = DeveloperCertificates[0].SubjectName.Decode(X500DistinguishedNameFlags.UseUTF8Encoding); ProvisionDeveloper = JenkinsBuild.GetParam(certificates.Split(','), "CN=", ""); string log = string.Empty; log += string.Format("ProvisionName={0}\n", ProvisionName); log += string.Format("from={0}, to={1}\n", DeveloperCertificates[0].NotBefore, DeveloperCertificates[0].NotAfter); log += string.Format("ProvisionUUID={0}\n", ProvisionUUID); log += string.Format("ProvisionDeveloper={0}\n", ProvisionDeveloper); log += string.Format("aps-environment={0}\n", ApsEnvironment); log += string.Format("certificates={0}\n", certificates); UnityEngine.Debug.Log(log); }
public Metadata Transform(Metadata metadata) { if (metadata.Kref != null && metadata.Kref.Source == "jenkins") { var json = metadata.Json(); Log.InfoFormat("Executing Jenkins transformation with {0}", metadata.Kref); Log.DebugFormat("Input metadata:{0}{1}", Environment.NewLine, json); JenkinsOptions options = json["x_netkan_jenkins"]?.ToObject <JenkinsOptions>() ?? new JenkinsOptions(); JenkinsBuild build = _api.GetLatestBuild( new JenkinsRef(metadata.Kref), options ); JenkinsArtifact[] artifacts = build.Artifacts .Where(a => options.AssetMatchPattern.IsMatch(a.FileName)) .ToArray(); switch (artifacts.Length) { case 1: JenkinsArtifact artifact = artifacts.Single(); string download = Uri.EscapeUriString( $"{build.Url}artifact/{artifact.RelativePath}" ); Log.DebugFormat("Using download URL: {0}", download); json.SafeAdd("download", download); if (options.UseFilenameVersion) { Log.DebugFormat("Using filename as version: {0}", artifact.FileName); json.SafeAdd("version", artifact.FileName); } // Make sure resources exist. if (json["resources"] == null) { json["resources"] = new JObject(); } var resourcesJson = (JObject)json["resources"]; resourcesJson.SafeAdd("ci", Uri.EscapeUriString(metadata.Kref.Id)); Log.DebugFormat("Transformed metadata:{0}{1}", Environment.NewLine, json); return(new Metadata(json)); break; case 0: throw new Exception("Could not find any matching artifacts"); default: throw new Exception("Found too many matching artifacts"); } } return(metadata); }
/// <summary> /// Save to a file. /// </summary> /// <param name="?"></param> /// <param name="destination"></param> /// <returns></returns> public static async Task <FileInfo> SaveToFile(this JenkinsArtifact artifact, JenkinsBuild bld, FileInfo destination) { var url = string.Format("{0}artifact/{1}", bld.Url, artifact.RelativePath); var fileData = await TDTJobAccess.GetAsBytes(url).FirstAsync(); using (var wr = destination.Create()) { wr.Write(fileData, 0, fileData.Length); } return(destination); }
/// <summary> /// Download a file to a temp location. /// </summary> /// <param name="artifact"></param> /// <param name="extension">The extension the file shoudl have, without the dot.</param> /// <returns></returns> public static Task <FileInfo> SaveToTempFile(this JenkinsArtifact artifact, JenkinsBuild bld, string extension) { var fname = string.Format("{0}{1}.{2}", Path.GetTempPath(), Guid.NewGuid(), extension); return(artifact.SaveToFile(bld, new FileInfo(fname))); }