All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jfrog.hudson.gradle.GradleInitScriptWriter Maven / Gradle / Ivy

/*
 * Copyright (C) 2010 JFrog Ltd.
 *
 * 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 org.jfrog.hudson.gradle;

import com.google.common.base.Charsets;
import com.google.common.base.Predicate;
import com.google.common.collect.MapDifference;
import com.google.common.collect.Maps;
import hudson.EnvVars;
import hudson.FilePath;
import hudson.ProxyConfiguration;
import hudson.model.AbstractBuild;
import hudson.model.Cause;
import hudson.model.Hudson;
import hudson.remoting.Which;
import hudson.tasks.LogRotator;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.jfrog.build.ArtifactoryPluginUtils;
import org.jfrog.build.api.BuildInfoConfigProperties;
import org.jfrog.build.api.BuildInfoProperties;
import org.jfrog.build.client.ClientGradleProperties;
import org.jfrog.build.client.ClientIvyProperties;
import org.jfrog.build.client.ClientProperties;
import org.jfrog.hudson.ArtifactoryServer;
import org.jfrog.hudson.ServerDetails;
import org.jfrog.hudson.action.ActionableHelper;
import org.jfrog.hudson.util.CredentialResolver;
import org.jfrog.hudson.util.Credentials;
import org.jfrog.hudson.util.IncludesExcludes;
import org.jfrog.hudson.util.PluginDependencyHelper;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.util.Map;


/**
 * Class to generate a Gradle initialization script
 *
 * @author Tomer Cohen
 */
public class GradleInitScriptWriter {
    private EnvVars envVars;
    private AbstractBuild build;
    private ArtifactoryGradleConfigurator gradleConfigurator;

    /**
     * The gradle initialization script constructor.
     *
     * @param gradleConfigurator
     * @param build
     */
    public GradleInitScriptWriter(ArtifactoryGradleConfigurator gradleConfigurator, EnvVars envVars,
            AbstractBuild build) {
        this.gradleConfigurator = gradleConfigurator;
        this.envVars = envVars;
        this.build = build;
    }

    private String addProperties() {
        StringBuilder stringBuilder = new StringBuilder();
        String key = ClientProperties.PROP_CONTEXT_URL;
        ArtifactoryServer artifactoryServer = getArtifactoryServer();
        String value = artifactoryServer.getUrl();
        ArtifactoryPluginUtils.addProperty(stringBuilder, key, value);
        ArtifactoryPluginUtils.addProperty(stringBuilder, ClientProperties.PROP_RESOLVE_REPOKEY,
                getServerDetails().downloadRepositoryKey);
        ArtifactoryPluginUtils.addProperty(stringBuilder, ClientProperties.PROP_PUBLISH_REPOKEY,
                getServerDetails().repositoryKey);

        Credentials preferredDeployer = CredentialResolver.getPreferredDeployer(gradleConfigurator, artifactoryServer);
        ArtifactoryPluginUtils.addProperty(stringBuilder, ClientProperties.PROP_PUBLISH_USERNAME,
                preferredDeployer.getUsername());
        ArtifactoryPluginUtils.addProperty(stringBuilder, ClientProperties.PROP_PUBLISH_PASSWORD,
                preferredDeployer.getPassword());
        ArtifactoryPluginUtils.addProperty(stringBuilder, ClientIvyProperties.PROP_PUBLISH_IVY,
                Boolean.toString(gradleConfigurator.deployIvy));
        ArtifactoryPluginUtils.addProperty(stringBuilder, ClientGradleProperties.PROP_PUBLISH_MAVEN,
                Boolean.toString(gradleConfigurator.deployMaven));
        ArtifactoryPluginUtils.addProperty(stringBuilder, ClientProperties.PROP_PUBLISH_ARTIFACT,
                Boolean.toString(gradleConfigurator.isDeployArtifacts()));
        ArtifactoryPluginUtils.addProperty(stringBuilder, ClientProperties.PROP_PUBLISH_BUILD_INFO,
                Boolean.toString(gradleConfigurator.deployBuildInfo));
        ArtifactoryPluginUtils
                .addProperty(stringBuilder, BuildInfoProperties.PROP_BUILD_NAME, build.getProject().getName());
        ArtifactoryPluginUtils
                .addProperty(stringBuilder, BuildInfoProperties.PROP_BUILD_NUMBER, build.getNumber() + "");
        if (StringUtils.isNotBlank(gradleConfigurator.getArtifactPattern())) {
            ArtifactoryPluginUtils.addProperty(stringBuilder, ClientIvyProperties.PROP_IVY_ARTIFACT_PATTERN,
                    gradleConfigurator.getArtifactPattern());
        }
        ArtifactoryPluginUtils.addProperty(stringBuilder, ClientIvyProperties.PROP_M2_COMPATIBLE,
                String.valueOf(gradleConfigurator.isM2Compatible()));
        if (StringUtils.isNotBlank(gradleConfigurator.getIvyPattern())) {
            ArtifactoryPluginUtils.addProperty(stringBuilder, ClientIvyProperties.PROP_IVY_IVY_PATTERN,
                    gradleConfigurator.getIvyPattern());
        }
        ArtifactoryPluginUtils.addProperty(stringBuilder, BuildInfoProperties.PROP_LICENSE_CONTROL_RUN_CHECKS,
                String.valueOf(gradleConfigurator.isRunChecks()));
        if (StringUtils.isNotBlank(gradleConfigurator.getViolationRecipients())) {
            ArtifactoryPluginUtils
                    .addProperty(stringBuilder, BuildInfoProperties.PROP_LICENSE_CONTROL_VIOLATION_RECIPIENTS,
                            gradleConfigurator.getViolationRecipients());
        }
        if (StringUtils.isNotBlank(gradleConfigurator.getScopes())) {
            ArtifactoryPluginUtils.addProperty(stringBuilder, BuildInfoProperties.PROP_LICENSE_CONTROL_SCOPES,
                    gradleConfigurator.getScopes());
        }
        ArtifactoryPluginUtils
                .addProperty(stringBuilder, BuildInfoProperties.PROP_LICENSE_CONTROL_INCLUDE_PUBLISHED_ARTIFACTS,
                        String.valueOf(gradleConfigurator.isIncludePublishArtifacts()));
        ArtifactoryPluginUtils.addProperty(stringBuilder, BuildInfoProperties.PROP_LICENSE_CONTROL_AUTO_DISCOVER,
                String.valueOf(gradleConfigurator.isLicenseAutoDiscovery()));

        ProxyConfiguration proxy = Hudson.getInstance().proxy;
        if (!getArtifactoryServer().isBypassProxy() && proxy != null) {
            ArtifactoryPluginUtils.addProperty(stringBuilder, ClientProperties.PROP_PROXY_HOST, proxy.name);
            ArtifactoryPluginUtils.addProperty(stringBuilder, ClientProperties.PROP_PROXY_HOST,
                    String.valueOf(proxy.port));
            ArtifactoryPluginUtils
                    .addProperty(stringBuilder, ClientProperties.PROP_PROXY_USERNAME, proxy.getUserName());
            ArtifactoryPluginUtils
                    .addProperty(stringBuilder, ClientProperties.PROP_PROXY_PASSWORD, proxy.getPassword());
        }
        IncludesExcludes deploymentPatterns = gradleConfigurator.getArtifactDeploymentPatterns();
        if (deploymentPatterns != null) {
            String includePatterns = deploymentPatterns.getIncludePatterns();
            if (StringUtils.isNotBlank(includePatterns)) {
                ArtifactoryPluginUtils.addProperty(stringBuilder,
                        ClientProperties.PROP_PUBLISH_ARTIFACT_INCLUDE_PATTERNS,
                        includePatterns);
            }
            String excludePatterns = deploymentPatterns.getExcludePatterns();
            if (StringUtils.isNotBlank(excludePatterns)) {
                ArtifactoryPluginUtils
                        .addProperty(stringBuilder, ClientProperties.PROP_PUBLISH_ARTIFACT_EXCLUDE_PATTERNS,
                                excludePatterns);
            }
        }
        if (gradleConfigurator.isDiscardOldBuilds()) {
            LogRotator rotator = build.getProject().getLogRotator();
            if (rotator != null) {
                if (rotator.getNumToKeep() > -1) {
                    ArtifactoryPluginUtils.addProperty(stringBuilder, BuildInfoProperties.PROP_BUILD_RETENTION_DAYS,
                            String.valueOf(String.valueOf(rotator.getNumToKeep())));
                }
                if (rotator.getDaysToKeep() > -1) {
                    ArtifactoryPluginUtils
                            .addProperty(stringBuilder, BuildInfoProperties.PROP_BUILD_RETENTION_MINIMUM_DATE,
                                    String.valueOf(String.valueOf(rotator.getDaysToKeep())));
                }
            }
        }

        String principal = ActionableHelper.getHudsonPrincipal(build);
        ArtifactoryPluginUtils.addProperty(stringBuilder, BuildInfoProperties.PROP_PRINCIPAL, principal);
        String buildUrl = ActionableHelper.getBuildUrl(build);
        if (StringUtils.isNotBlank(buildUrl)) {
            ArtifactoryPluginUtils.addProperty(stringBuilder, BuildInfoProperties.PROP_BUILD_URL, buildUrl);
        }
        String svnRevision = envVars.get("SVN_REVISION");
        if (StringUtils.isNotBlank(svnRevision)) {
            ArtifactoryPluginUtils.addProperty(stringBuilder, BuildInfoProperties.PROP_VCS_REVISION, svnRevision);
        }
        ArtifactoryPluginUtils.addProperty(stringBuilder, BuildInfoProperties.PROP_AGENT_NAME, "Hudson");
        ArtifactoryPluginUtils
                .addProperty(stringBuilder, BuildInfoProperties.PROP_AGENT_VERSION, build.getHudsonVersion());
        Cause.UpstreamCause parent = ActionableHelper.getUpstreamCause(build);
        if (parent != null) {
            ArtifactoryPluginUtils.addProperty(stringBuilder, BuildInfoProperties.PROP_PARENT_BUILD_NAME,
                    parent.getUpstreamProject());
            ArtifactoryPluginUtils.addProperty(stringBuilder, BuildInfoProperties.PROP_PARENT_BUILD_NUMBER,
                    parent.getUpstreamBuild() + "");
        }

        // Write all the deploy (matrix params) properties.
        Map filteredMatrixParams = Maps.filterKeys(envVars, new Predicate() {
            public boolean apply(String input) {
                return input.startsWith(ClientProperties.PROP_DEPLOY_PARAM_PROP_PREFIX);
            }
        });
        for (Map.Entry entry : filteredMatrixParams.entrySet()) {
            ArtifactoryPluginUtils.addProperty(stringBuilder, entry.getKey(), entry.getValue());
        }

        // add EnvVars

        //Add only the hudson specific environment variables
        MapDifference difference = Maps.difference(envVars, System.getenv());
        Map filteredEnvVars = difference.entriesOnlyOnLeft();
        for (Map.Entry entry : filteredEnvVars.entrySet()) {
            ArtifactoryPluginUtils
                    .addProperty(stringBuilder, BuildInfoProperties.BUILD_INFO_ENVIRONMENT_PREFIX + entry.getKey(),
                            entry.getValue());
        }
        ArtifactoryPluginUtils.addProperty(stringBuilder, BuildInfoConfigProperties.PROP_INCLUDE_ENV_VARS,
                String.valueOf(gradleConfigurator.includeEnvVars));
        // add build variables
        Map buildVariables = build.getBuildVariables();
        for (Map.Entry entry : buildVariables.entrySet()) {
            ArtifactoryPluginUtils
                    .addProperty(stringBuilder, BuildInfoProperties.BUILD_INFO_ENVIRONMENT_PREFIX + entry.getKey(),
                            entry.getValue());
        }
        return stringBuilder.toString();
    }

    /**
     * Generate the init script from the Artifactory URL.
     *
     * @return The generated script.
     */
    public String generateInitScript() throws URISyntaxException, IOException, InterruptedException {
        StringBuilder initScript = new StringBuilder();
        InputStream templateStream = getClass().getResourceAsStream("/initscripttemplate.gradle");
        String templateAsString = IOUtils.toString(templateStream, Charsets.UTF_8.name());
        String str = templateAsString.replace("${allBuildInfoProperties}", addProperties());

        File localGradleExtractorJar = Which.jarFile(getClass().getResource("/initscripttemplate.gradle"));
        FilePath dependencyDir = PluginDependencyHelper.getActualDependencyDirectory(build, localGradleExtractorJar);

        String absoluteDependencyDirPath = dependencyDir.getRemote();
        absoluteDependencyDirPath = absoluteDependencyDirPath.replace("\\", "/");
        str = str.replace("${pluginLibDir}", absoluteDependencyDirPath);
        initScript.append(str);
        return initScript.toString();
    }

    private ServerDetails getServerDetails() {
        return gradleConfigurator.getDetails();
    }

    private ArtifactoryServer getArtifactoryServer() {
        return gradleConfigurator.getArtifactoryServer();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy