示例#1
0
文件: JenkinsAPI.cs 项目: Rusk85/CKAN
        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;
        }
示例#2
0
        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);
        }
示例#3
0
        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());
        }
示例#5
0
        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);
        }
示例#6
0
        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);
        }
示例#7
0
        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");
            }
        }
示例#8
0
        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);
        }
示例#9
0
        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);
    }
示例#11
0
        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);
        }
示例#12
0
        /// <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);
        }
示例#13
0
        /// <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)));
        }