/* * Copyright 2000-2009 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrains.buildServer.server.autoincrementer; import com.intellij.openapi.diagnostic.Logger; import jetbrains.buildServer.agent.ServerProvidedProperties; import jetbrains.buildServer.parameters.ProcessingResult; import jetbrains.buildServer.parameters.ReferencesResolverUtil; import jetbrains.buildServer.parameters.impl.CompositeParametersProviderImpl; import jetbrains.buildServer.parameters.impl.MapParametersProviderImpl; import jetbrains.buildServer.parameters.impl.ParametersResolverUtil; import jetbrains.buildServer.parameters.impl.ReferenceResolver; import jetbrains.buildServer.serverSide.*; import jetbrains.buildServer.serverSide.impl.LogUtil; import jetbrains.buildServer.serverSide.parameters.AbstractBuildParametersProvider; import org.jetbrains.annotations.NotNull; import java.util.Collection; import java.util.HashSet; import java.util.Map; import java.util.Set; public class AutoincrementPropertiesProvider extends AbstractBuildParametersProvider implements BuildStartContextProcessor { private final static Logger LOG = Logger.getInstance(AutoincrementPropertiesProvider.class.getName()); private final AutoincrementValues myValues; public AutoincrementPropertiesProvider(@NotNull final AutoincrementValues values) { myValues = values; } @NotNull @Override public Collection getParametersAvailableOnAgent(@NotNull final SBuild build) { return findAutoincrementParams(build); } private Set findAutoincrementParams(final SBuild build) { Set allValues = new HashSet<>(build.getBuildPromotion().getParameters().values()); SBuildType buildType = build.getBuildType(); if (buildType != null) { allValues.add(buildType.getBuildNumberPattern()); } return extractAutoincrementParams(allValues); } private Set extractAutoincrementParams(final Collection allValues) { Set autoIncParams = new HashSet<>(); for (String value : allValues) { Collection allRefs = ReferencesResolverUtil.getReferences(value); for (String ref : allRefs) { if (ref.startsWith("autoinc.")) { autoIncParams.add(ref); } } } return autoIncParams; } public void updateParameters(@NotNull BuildStartContext context) { final SRunningBuild build = context.getBuild(); LOG.debug("Processing build " + LogUtil.describe(build) + " for autoincrement parameters."); SBuildType bt = build.getBuildType(); if (bt == null) return; // we search for autoinc. properties inside own build parameters only (extensions parameters are ignored) Map paramsWithoutExtensions = build.getBuildOwnParameters(); Set allValues = new HashSet<>(paramsWithoutExtensions.values()); for (SRunnerContext rct: context.getRunnerContexts()) { allValues.addAll(rct.getParameters().values()); } Set autoIncParams = extractAutoincrementParams(allValues); if (autoIncParams.isEmpty()){ LOG.debug("No autoincrement parameters found in " + allValues); return; } for (String param : autoIncParams) { int value = myValues.getAndIncrement(param); context.addSharedParameter(param, String.valueOf(value)); LOG.debug("Processed parameter '" + param + "', set value '" + value + "'"); } updateBuildNumber(build, context); } private void updateBuildNumber(@NotNull SRunningBuild build, @NotNull BuildStartContext context) { CompositeParametersProviderImpl paramProvider = new CompositeParametersProviderImpl(); for (SRunnerContext ctx: context.getRunnerContexts()) { paramProvider.appendParametersProvider(new MapParametersProviderImpl(ctx.getParameters())); } paramProvider.appendParametersProvider(new MapParametersProviderImpl(context.getSharedParameters())); ReferenceResolver resolver = new ReferenceResolver(); String origBuildNumber = build.getRawBuildNumber(); ProcessingResult res = ParametersResolverUtil.resolveSingleValue(origBuildNumber, paramProvider, resolver); if (res.isModified()) { final String newBuildNumber = res.getResult(); build.setBuildNumber(newBuildNumber); // update build number properties because they are not resolved on the agent context.addSharedParameter(ServerProvidedProperties.SYSTEM_BUILD_NUMBER, newBuildNumber); context.addSharedParameter(ServerProvidedProperties.ENV_BUILD_NUMBER, newBuildNumber); LOG.debug("Updated build number of build " + LogUtil.describe(build) + " to " + newBuildNumber); } else{ LOG.debug("Build number of build " + LogUtil.describe(build) + " is not modified: value not modified on resolution."); } } }