protected async Task CreateBuildEngineBuildAsync(Product product)
        {
            await ResetPreviousBuildAsync(product);

            BuildResponse buildResponse = null;

            if (SetBuildEngineEndpoint(product.Project.Organization))
            {
                buildResponse = BuildEngineApi.CreateBuild(product.WorkflowJobId);
            }
            if ((buildResponse != null) && (buildResponse.Id != 0))
            {
                product.WorkflowBuildId = buildResponse.Id;
                var productBuild = new ProductBuild
                {
                    ProductId = product.Id,
                    BuildId   = product.WorkflowBuildId
                };
                await ProductBuildRepository.CreateAsync(productBuild);

                await ProductRepository.UpdateAsync(product);

                var monitorJob = Job.FromExpression <BuildEngineBuildService>(service => service.CheckBuild(product.Id));
                RecurringJobManager.AddOrUpdate(GetHangfireToken(product.Id), monitorJob, "* * * * *");
            }
            else
            {
                // TODO: Send Notification
                // Throw Exception to force retry
                throw new Exception("Create build failed");
            }
        }
Exemplo n.º 2
0
        private async Task GooglePlay_UpdatPublishLinkAsync(ProcessInstance processInstance, WorkflowRuntime runtime, string actionParameter, CancellationToken token)
        {
            using (var scope = ServiceProvider.CreateScope())
            {
                var     productRepository = scope.ServiceProvider.GetRequiredService <IJobRepository <Product, Guid> >();
                Product product           = await GetProductForProcess(processInstance, productRepository);

                var          productBuildRepository = scope.ServiceProvider.GetRequiredService <IJobRepository <ProductBuild> >();
                ProductBuild productBuild           = await productBuildRepository.Get()
                                                      .Where(pb => pb.ProductId == product.Id)
                                                      .Include(pb => pb.ProductArtifacts)
                                                      .FirstOrDefaultAsync();

                if (productBuild != null)
                {
                    var packageNameFile = productBuild.ProductArtifacts.Where(pa => pa.ArtifactType == "package_name").FirstOrDefault();
                    if (packageNameFile != null)
                    {
                        var webClient   = scope.ServiceProvider.GetRequiredService <IWebClient>();
                        var packageName = webClient.DownloadString(packageNameFile.Url).TrimEnd();
                        if (packageName != null)
                        {
                            product.PublishLink = "https://play.google.com/store/apps/details?id=" + packageName;
                            await productRepository.UpdateAsync(product);
                        }
                    }
                }

                var owner = product?.Project.Owner;

                //TODO: Send Notification to user
                Log.Information($"SendNotification: auth0Id={owner.ExternalId}, name={owner.Name}");
            }
        }
        protected string BuildLinks(Dictionary <string, object> paramsDictionary, ProductBuild build)
        {
            var links = "";
            var artifactNamesListJ = paramsDictionary["types"] as JArray;
            var artifactNamesList  = artifactNamesListJ.ToObject <List <string> >();

            foreach (var artifactName in artifactNamesList)
            {
                var artifact = build.ProductArtifacts.Find(a => a.ArtifactType == artifactName);
                if (artifact != null)
                {
                    links = links + "<p><a href = " + artifact.Url + ">" + artifactName + "</a></p>";
                }
            }
            return(links);
        }
        protected async Task CreateBuildEngineBuildAsync(Product product, Dictionary <string, object> parmsDictionary, PerformContext context)
        {
            await ResetPreviousBuildAsync(product);

            BuildResponse buildResponse = null;

            if (SetBuildEngineEndpoint(product.Project.Organization))
            {
                var targets     = GetTargets(parmsDictionary, "apk play-listing");
                var environment = GetEnvironment(parmsDictionary);
                environment["PRODUCT_ID"] = product.Id.ToString();
                environment["PROJECT_ID"] = product.ProjectId.ToString();
                var build = new Build
                {
                    Targets     = targets,
                    Environment = environment
                };
                buildResponse = BuildEngineApi.CreateBuild(product.WorkflowJobId, build);
            }
            if ((buildResponse != null) && (buildResponse.Id != 0))
            {
                product.WorkflowBuildId = buildResponse.Id;
                var productBuild = new ProductBuild
                {
                    ProductId = product.Id,
                    BuildId   = product.WorkflowBuildId
                };
                await ProductBuildRepository.CreateAsync(productBuild);

                await ProductRepository.UpdateAsync(product);

                var monitorJob = Job.FromExpression <BuildEngineBuildService>(service => service.CheckBuild(product.Id));
                RecurringJobManager.AddOrUpdate(GetHangfireToken(product.Id), monitorJob, "* * * * *");
            }
            else
            {
                var messageParms = new Dictionary <string, object>()
                {
                    { "projectName", product.Project.Name },
                    { "productName", product.ProductDefinition.Name }
                };
                await SendNotificationOnFinalRetryAsync(context, product.Project.Organization, product.Project.Owner, "buildFailedUnableToCreate", messageParms);

                // Throw Exception to force retry
                throw new Exception("Create build failed");
            }
        }
Exemplo n.º 5
0
        /// <summary>
        ///   Performs the signing.
        /// </summary>
        /// <param name = "identity">The identity.</param>
        protected override void PerformSigning(String identity)
        {
            String productDefinition = null;

            if (this.ProductDefinition != null && File.Exists(this.ProductDefinition.ToString()))
            {
                productDefinition = this.ProductDefinition.ToString();
            }

            using (StringWriter outputWriter = new StringWriter()) {
                using (StringWriter errorWriter = new StringWriter()) {
                    ProductBuild.ArchiveApplication(this.Bundle.ToString(), identity, productDefinition, outputWriter, errorWriter);
                    String outputLog = outputWriter.ToString();
                    String errorLog  = errorWriter.ToString();
                    this.Log(Level.Info, outputLog);
                    this.Log(Level.Info, errorLog);
                }
            }
        }
Exemplo n.º 6
0
        /// <summary>
        ///   Performs the signing.
        /// </summary>
        /// <param name = "identity">The identity.</param>
        protected override bool PerformSigning(String identity)
        {
            String productDefinition = null;

            if (this.ProductDefinition != null && File.Exists(this.ProductDefinition.GetMetadata("FullPath")))
            {
                productDefinition = this.ProductDefinition.GetMetadata("FullPath");
            }

            using (StringWriter outputWriter = new StringWriter()) {
                using (StringWriter errorWriter = new StringWriter()) {
                    ProductBuild.ArchiveApplication(this.Bundle.GetMetadata("FullPath"), identity, productDefinition, outputWriter, errorWriter);
                    String outputLog = outputWriter.ToString();
                    String errorLog  = errorWriter.ToString();
                    this.Log.LogMessage(outputLog);
                    this.Log.LogMessage(errorLog);
                }
            }

            return(true);
        }
        protected async Task SendEmailToReviewersAsync(Product product, string links, string comment, ProductBuild productBuild)
        {
            var apkUrl      = "";
            var apkArtifact = productBuild.ProductArtifacts.Find(a => a.ArtifactType == "apk");

            if (apkArtifact != null)
            {
                apkUrl = apkArtifact.Url;
            }
            var messageId = "reviewProduct";

            if (!String.IsNullOrEmpty(comment))
            {
                messageId = "reviewProductWithComment";
            }
            var playListingUrl      = "";
            var playListingArtifact = productBuild.ProductArtifacts.Find(a => a.ArtifactType == "play-listing");

            if (playListingArtifact != null)
            {
                playListingUrl = playListingArtifact.Url;
            }
            var subsDictionary = new Dictionary <string, object>
            {
                { "productName", product.ProductDefinition.Name },
                { "projectName", product.Project.Name },
                { "links", links },
                { "ownerName", product.Project.Owner.Name },
                { "ownerEmail", product.Project.Owner.Email },
                { "apkUrl", apkUrl },
                { "playListingUrl", playListingUrl },
                { "comment", comment }
            };

            var reviewers = product.Project.Reviewers;

            if (reviewers != null)
            {
                foreach (var reviewer in reviewers)
                {
                    subsDictionary["reviewerName"] = reviewer.Name;
                    dynamic contentModel = new System.Dynamic.ExpandoObject();
                    contentModel.Links = links;
                    await SendEmailAsync(reviewer.Email,
                                         reviewer.LocaleOrDefault(),
                                         messageId,
                                         subsDictionary,
                                         contentModel,
                                         "ReviewProduct.txt");
                }
            }
        }
        protected async Task <DateTime?> AddProductArtifactAsync(string key, string value, Product product, ProductBuild productBuild, bool successful)
        {
            var productArtifact = new ProductArtifact
            {
                ProductId      = product.Id,
                ProductBuildId = productBuild.Id,
                ArtifactType   = key,
                Url            = value
            };
            var updatedArtifact  = WebRequestWrapper.GetFileInfo(productArtifact);
            var existingArtifact = await ProductArtifactRepository
                                   .Get().Where(a => a.ProductId == product.Id && a.ProductBuildId == productBuild.Id && a.ArtifactType == key && a.Url == value)
                                   .FirstOrDefaultAsync();

            if (existingArtifact != null)
            {
                // Not sure why we are getting multiple of these, but we don't want multiple entries.
                // Should we ignore it or update?  Ignore for now. Updating threw exceptions
                Log.Information($"Updating Artifact: Id={existingArtifact.Id}");
                updatedArtifact.Id = existingArtifact.Id;
                // await ProductArtifactRepository.UpdateAsync(updatedArtifact);
            }
            else
            {
                var newArtifact = await ProductArtifactRepository.CreateAsync(updatedArtifact);

                Log.Information($"Created Artifact: Id={newArtifact.Id}");
            }

            // On version.json, update the ProductBuild.Version
            if (key == "version" && updatedArtifact.ContentType == "application/json")
            {
                try
                {
                    var contents = WebClient.DownloadString(value);
                    var version  = JsonConvert.DeserializeObject <Dictionary <string, object> >(contents);
                    if (version.ContainsKey("version"))
                    {
                        productBuild.Version = version["version"] as String;
                        await ProductBuildRepository.UpdateAsync(productBuild);

                        if (successful)
                        {
                            product.VersionBuilt = version["version"] as String;
                            await ProductRepository.UpdateAsync(product);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Log.Error(ex, $"Parsing {key}: {value}");
                }
            }

            // On play-listing-manifest.json, update the Project.DefaultLanguage
            if (key == "play-listing-manifest" && updatedArtifact.ContentType == "application/json")
            {
                try
                {
                    var contents = WebClient.DownloadString(value);
                    var manifest = JsonConvert.DeserializeObject <Dictionary <string, object> >(contents);
                    if (manifest.ContainsKey("default-language"))
                    {
                        var           languageName  = manifest["default-language"] as String;
                        StoreLanguage storeLanguage = await LanguageRepository.Get().Where(lang => lang.Name == languageName).FirstOrDefaultAsync();

                        if (storeLanguage != null)
                        {
                            product.StoreLanguageId = storeLanguage.Id;
                            await ProductRepository.UpdateAsync(product);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Log.Error(ex, $"Parsing {key}: {value}");
                }
            }

            return(updatedArtifact.LastModified);
        }
        protected async Task <DateTime?> AddProductArtifactAsync(string key, string value, Guid productId, ProductBuild productBuild)
        {
            var productArtifact = new ProductArtifact
            {
                ProductId      = productId,
                ProductBuildId = productBuild.Id,
                ArtifactType   = key,
                Url            = value
            };
            var updatedArtifact = WebRequestWrapper.GetFileInfo(productArtifact);
            await ProductArtifactRepository.CreateAsync(updatedArtifact);

#pragma warning disable RECS0061 // Warns when a culture-aware 'EndsWith' call is used by default.
            if (key == "version" && updatedArtifact.ContentType == "application/json")
#pragma warning restore RECS0061 // Warns when a culture-aware 'EndsWith' call is used by default.
            {
                var contents = WebClient.DownloadString(value);
                var version  = JsonConvert.DeserializeObject <Dictionary <string, string> >(contents);
                if (version.ContainsKey("version"))
                {
                    productBuild.Version = version["version"];
                    await ProductBuildRepository.UpdateAsync(productBuild);
                }
            }

            return(updatedArtifact.LastModified);
        }