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"); } }
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"); } }
/// <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); } } }
/// <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); }