protected WebHookHistoryItem(WebHookConfig whc, WebHookExecutionStats webHookExecutionStats, SBuild sBuild, WebHookErrorStatus errorStatus) { this.projectId = sBuild.getProjectId(); this.buildTypeId = sBuild.getBuildTypeId(); this.buildId = sBuild.getBuildId(); this.webHookConfig = whc; this.webHookExecutionStats = webHookExecutionStats; this.timestamp = findTimeStamp(webHookExecutionStats); this.webhookErrorStatus = checkAndSetHttpStatusInfo(errorStatus); }
public WebHookTemplateContent findTemplateForState( SBuild sRunningBuild, BuildStateEnum state, String payloadtemplateName, WebHookPayload payloadFormat) { WebHookTemplateContent templateForThisBuild; if (sRunningBuild.getBranch() != null){ // We have a branch aware sBuild. Get the branch template. templateForThisBuild = webHookTemplateResolver.findWebHookBranchTemplate(state, sRunningBuild.getBuildType(), payloadFormat.getFormatShortName(), payloadtemplateName); } else { // Branch is null. TeamCity is not aware of branch support for this sBuild, so get the non-branch template. templateForThisBuild = webHookTemplateResolver.findWebHookTemplate(state, sRunningBuild.getBuildType(), payloadFormat.getFormatShortName(), payloadtemplateName); } return templateForThisBuild; }
private String getRiskReportUrl(final HttpServletRequest request, final SBuildServer server) { final SBuild build = BuildDataExtensionUtil.retrieveBuild(request, server); if (build.getArtifactsDirectory() == null) { return null; } String externalId = build.getBuildTypeExternalId(); // based on information found in the TeamCity blog: // https://blog.jetbrains.com/teamcity/2012/06/teamcity-ivy-gradle-maven/ final String prefix = "/repository/download/"; final String indexHtml = HubConstantValues.HUB_RISK_REPORT_DIRECTORY_NAME + "/riskreport.html"; final String reportUrl = prefix + externalId + "/" + build.getBuildId() + ":id/" + indexHtml; return reportUrl; } }
setBuildStartTime(format.format(sRunningBuild.getStartDate())); if (sRunningBuild instanceof SRunningBuild && (SRunningBuild) sRunningBuild.getFinishDate() != null) { setBuildFinishTime(format.format(((SRunningBuild) sRunningBuild).getFinishDate())); setBuildStatus(sRunningBuild.getStatusDescriptor().getText()); setBuildResult(sRunningBuild, previousBuild, buildState); setNotifyType(buildState.getShortName()); setBuildRunners(sRunningBuild.getBuildType().getBuildRunners()); setBuildFullName(sRunningBuild.getBuildType().getFullName()); setBuildName(sRunningBuild.getBuildType().getName()); setBuildId(Long.toString(sRunningBuild.getBuildId())); setBuildTypeId(TeamCityIdResolver.getBuildTypeId(sRunningBuild.getBuildType())); setBuildInternalTypeId(TeamCityIdResolver.getInternalBuildId(sRunningBuild.getBuildType())); setBuildExternalTypeId(TeamCityIdResolver.getExternalBuildId(sRunningBuild.getBuildType())); setProjectName(sRunningBuild.getBuildType().getProjectName()); setProjectId(TeamCityIdResolver.getProjectId(sRunningBuild.getBuildType().getProject())); setProjectInternalId(TeamCityIdResolver.getInternalProjectId(sRunningBuild.getBuildType().getProject())); setProjectExternalId(TeamCityIdResolver.getExternalProjectId(sRunningBuild.getBuildType().getProject())); setBuildNumber(sRunningBuild.getBuildNumber()); setAgentName(sRunningBuild.getAgentName()); setAgentOs(sRunningBuild.getAgent().getOperatingSystemName()); setAgentHostname(sRunningBuild.getAgent().getHostName()); setTriggeredBy(sRunningBuild.getTriggeredBy().getAsString()); setComment(WebHooksComment.build(sRunningBuild.getBuildComment())); setTags(sRunningBuild.getTags()); setChanges(sRunningBuild.getContainingChanges()); try { if (sRunningBuild.getBranch() != null){
SBuildType buildType = build.getBuildType(); if (buildType == null) { return null; Map<String, String> buildInfoUrls = new HashMap<String, String>(); for (SBuildRunnerDescriptor buildRunnerDescriptor : buildType.getBuildRunners()) { String buildUrl = customDataStorage.getValue(build.getBuildTypeExternalId() + "#" + Long.toString(build.getBuildId()) + "#" + buildRunnerDescriptor.getId()); if (StringUtils.isNotBlank(buildUrl)) { buildInfoUrls.put(buildUrl, buildRunnerDescriptor.getName()); String legacyBuildUrl = customDataStorage.getValue(Long.toString(build.getBuildId()) + "#" + buildRunnerDescriptor.getId()); if (StringUtils.isNotBlank(legacyBuildUrl)) { buildInfoUrls.put(legacyBuildUrl + build.getBuildTypeExternalId() + "/" + build.getBuildNumber(), buildRunnerDescriptor.getName()); return buildInfoUrls;
@Test public void testGetPreviousNonPreviousNonPersonalBuild_WhenPreviousIsNonPersonal() { WebHookContentBuilder builder = new WebHookContentBuilder(null, null, resolverManager); WebHook wh = factory.getWebHook(); SBuild runningBuild = mock(SBuild.class); SFinishedBuild nonPersonalPreviousBuild = mock(SFinishedBuild.class); when(runningBuild.getPreviousFinished()).thenReturn(nonPersonalPreviousBuild); when(runningBuild.getBuildId()).thenReturn(100L); when(nonPersonalPreviousBuild.getBuildId()).thenReturn(98L); SBuild previousBuild = builder.getPreviousNonPersonalBuild(wh, runningBuild); assertEquals(nonPersonalPreviousBuild, previousBuild); assertEquals(nonPersonalPreviousBuild, wh.getPreviousNonPersonalBuild()); assertEquals(98L, previousBuild.getBuildId()); }
private void populateMessageAndText(SBuild sRunningBuild, BuildStateEnum state, Map<String,String> templates) { // Message is a long form message, for on webpages or in email. setMessage("Build " + sRunningBuild.getBuildType().getFullName() + " has " + state.getDescriptionSuffix() + ". This is build number " + sRunningBuild.getBuildNumber() + ", has a status of \"" + this.buildResult + "\" and was triggered by " + sRunningBuild.getTriggeredBy().getAsString()); // Text is designed to be shorter, for use in Text messages and the like. setText(sRunningBuild.getBuildType().getFullName().toString() + " has " + state.getDescriptionSuffix() + ". Status: " + this.buildResult); }
@Override public void fillModel(@NotNull Map<String, Object> model, @NotNull HttpServletRequest request) { SBuild build = getBuild(request); model.put("artBuildId", build.getBuildId()); }
private String getBranch(SBuild build) { Branch branch = build.getBranch(); if (branch != null && branch.getName() != "<default>") { return branch.getDisplayName(); } else { return ""; } }
webHookTemplateExecutionRequest.getProjectExternalId(), myServer.getProjectManager().findProjectByExternalId(webHookTemplateExecutionRequest.getProjectExternalId()).getName(), sbuild.getBuildTypeId(), sbuild.getBuildTypeName(), sbuild.getBuildTypeExternalId(), webHookTemplateExecutionRequest.getBuildId(), webHookConfig,
public TestingSQueuedBuild(SBuild sBuild) { this.buildType = sBuild.getBuildType(); }
@Override public boolean isAvailable(@NotNull HttpServletRequest request) { SBuild build = getBuild(request); if (build == null || !build.isFinished()) { return false; } Status buildStatus = build.getBuildStatus(); return buildStatus.isSuccessful() && !buildStatus.isFailed() && !getBuildInfoUrls(build).isEmpty(); }
wh.setEnabledForBuildState(BuildStateEnum.BUILD_STARTED, isOverrideEnabled || (whc.isEnabledForBuildType(sBuild.getBuildType()) && wh.getBuildStates().enabled(BuildStateEnum.BUILD_STARTED))); if (wh.isEnabled()){ templateForThisBuild = findTemplateForState(sBuild, state, whc.getPayloadTemplate(), payloadFormat); wh.setEnabledForBuildState(BuildStateEnum.CHANGES_LOADED, isOverrideEnabled || (whc.isEnabledForBuildType(sBuild.getBuildType()) && wh.getBuildStates().enabled(BuildStateEnum.CHANGES_LOADED))); if (wh.isEnabled()){ templateForThisBuild = findTemplateForState(sBuild, state, whc.getPayloadTemplate(), payloadFormat); wh.setEnabledForBuildState(BuildStateEnum.BUILD_INTERRUPTED, isOverrideEnabled || (whc.isEnabledForBuildType(sBuild.getBuildType()) && wh.getBuildStates().enabled(BuildStateEnum.BUILD_INTERRUPTED))); if (wh.isEnabled()){ templateForThisBuild = findTemplateForState(sBuild, state, whc.getPayloadTemplate(), payloadFormat); wh.setEnabledForBuildState(BuildStateEnum.BEFORE_BUILD_FINISHED, isOverrideEnabled || (whc.isEnabledForBuildType(sBuild.getBuildType()) && wh.getBuildStates().enabled(BuildStateEnum.BEFORE_BUILD_FINISHED))); if (wh.isEnabled()){ templateForThisBuild = findTemplateForState(sBuild, state, whc.getPayloadTemplate(), payloadFormat); wh.setEnabledForBuildState(BuildStateEnum.BUILD_FINISHED, isOverrideEnabled || (whc.isEnabledForBuildType(sBuild.getBuildType()) && wh.getBuildStates().enabled( BuildStateEnum.BUILD_FINISHED, sBuild.getStatusDescriptor().isSuccessful(), hasBuildChangedHistoricalState(sBuild, getPreviousNonPersonalBuild(wh, sBuild))))); templateForThisBuild = findTemplateForState(sBuild, BuildState.getEffectiveState(state, sBuild.getStatusDescriptor().isSuccessful(), this.hasBuildChangedHistoricalState(sBuild,getPreviousNonPersonalBuild(wh, sBuild))), whc.getPayloadTemplate(), payloadFormat); wh.setPayload(payloadFormat.buildFinished(sBuild, getPreviousNonPersonalBuild(wh, sBuild), mergeParameters(whc.getParams(),sBuild, getPreferredDateFormat(templateForThisBuild)), whc.getEnabledTemplates(), templateForThisBuild)); wh.setUrl(resolveTemplatedUrl(variableResolverFactory, wh, whc.getUrl(), BuildState.getEffectiveState(state, sBuild.getStatusDescriptor().isSuccessful(), this.hasBuildChangedHistoricalState(sBuild, getPreviousNonPersonalBuild(wh, sBuild))), sBuild, payloadFormat, mergeParameters(whc.getParams(),sBuild, getPreferredDateFormat(templateForThisBuild)), whc.getEnabledTemplates())); wh.checkFilters(getVariableResolver(variableResolverFactory, wh, state, sBuild, payloadFormat, mergeParameters(whc.getParams(),sBuild, getPreferredDateFormat(templateForThisBuild)), whc.getEnabledTemplates())); wh.resolveHeaders(getVariableResolver(variableResolverFactory, wh, state, sBuild, payloadFormat, mergeParameters(whc.getParams(),sBuild, getPreferredDateFormat(templateForThisBuild)), whc.getEnabledTemplates()));
@Nullable private SFinishedBuild getRecursivePreviousNonPersonalBuild(SBuild paramSBuild) { SFinishedBuild localSFinishedBuild = paramSBuild.getPreviousFinished(); if (localSFinishedBuild == null) { // There was not a previous build. return localSFinishedBuild; } else if (localSFinishedBuild.isPersonal()){ localSFinishedBuild = getRecursivePreviousNonPersonalBuild(localSFinishedBuild); } return localSFinishedBuild; }
private boolean hasBuildChangedHistoricalState(SBuild sRunningBuild, SFinishedBuild previous){ if (previous != null){ if (sRunningBuild.getBuildStatus().isSuccessful()){ return previous.getBuildStatus().isFailed(); } else if (sRunningBuild.getBuildStatus().isFailed()) { return previous.getBuildStatus().isSuccessful(); } } return true; }
private boolean sendPromotionRequest(@NotNull Element xmlResponse, ActionErrors errors, SBuild build, Map<String, String> parameters, ArtifactoryBuildInfoClient client, PromotionBuilder promotionBuilder, boolean isDryRun) throws IOException { if (isDryRun) { Loggers.SERVER.info("Performing dry run promotion (no changes are made during dry run)..."); } HttpResponse wetResponse = client.stageBuild( ServerUtils.getArtifactoryBuildName(build, parameters), build.getBuildNumber(), promotionBuilder.dryRun(isDryRun).build()); Set<String> promotionErrors = checkSuccess(wetResponse, isDryRun); if (promotionErrors.size() > 0) { StringBuilder sb = new StringBuilder("Failed to execute the "); if (isDryRun) { sb.append("dry run "); } sb.append("promotion operation: </br>"); for (String promotionError : promotionErrors) { sb.append(promotionError.replace("\n", "</br>")).append("</br>"); } addError(errors, "errorPromotion", sb.toString(), xmlResponse); return false; } if (isDryRun) { Loggers.SERVER.info("Dry run promotion completed successfully.\nPerforming promotion..."); return true; } Loggers.SERVER.info("Promotion completed successfully!"); return true; }
Loggers.SERVER.debug(ABOUT_TO_PROCESS_WEB_HOOKS_FOR + sBuild.getProjectId() + " at buildState " + state.getShortName()); for (WebHookConfig whc : getListOfEnabledWebHooks(sBuild.getProjectId())){ WebHook wh = webHookFactory.getWebHook(whc, myMainSettings.getProxyConfigForUrl(whc.getUrl())); try {
@Test public void testGetPreviousNonPreviousNonPersonalBuild_WhenNonPersonalPreviousReturnsNull() { WebHookContentBuilder builder = new WebHookContentBuilder(null, null, resolverManager); WebHook wh = factory.getWebHook(); SBuild runningBuild = mock(SBuild.class); when(runningBuild.getPreviousFinished()).thenReturn(null); when(runningBuild.getBuildId()).thenReturn(100L); SBuild previousBuild = builder.getPreviousNonPersonalBuild(wh, runningBuild); assertNull(previousBuild); assertNull(wh.getPreviousNonPersonalBuild()); }
@NotNull private String getPatternsForBuild(@NotNull final BuildCleanupContext cleanupContext, @NotNull final SBuild build) { if (cleanupContext.getCleanupLevel().isCleanHistoryEntry()) return StringUtil.EMPTY; final CleanupPolicy policy = cleanupContext.getCleanupPolicyForBuild(build.getBuildId()); return StringUtil.emptyIfNull(policy.getParameters().get(HistoryRetentionPolicy.ARTIFACT_PATTERNS_PARAM)); }
private String getBranch(SBuild build) { Branch branch = build.getBranch(); if (branch != null && branch.getName() != "<default>") { return branch.getDisplayName(); } else { return ""; } }