Возвращаемое значение из плагина Jenkins - PullRequest
0 голосов
/ 29 марта 2020

Я разрабатываю плагин Jenkins, и на одном из этапов сборки мне нужно вернуть значение. На этом этапе сборки я отправляю вызов API для генерации регистрационного токена и хочу вернуть этот токен в качестве результата этого этапа сборки. Идея состоит в том, чтобы использовать этот сгенерированный токен позже в pipe / free-style.

Мой вопрос: как мне это сделать? Вот мой класс сборки:

package **.********.plugins;

import hudson.EnvVars;
import hudson.Extension;
import hudson.FilePath;
import hudson.Launcher;
import hudson.model.*;
import hudson.tasks.BuildStep;
import hudson.tasks.BuildStepDescriptor;
import hudson.tasks.BuildStepMonitor;
import hudson.tasks.Builder;
import hudson.util.ListBoxModel;
import **.********.constants.Constants;
import **.********.helpers.ApiHelper;
import **.********.helpers.ApiResponse;
import **.********.helpers.LogHelper;
import **.********.model.AgentDockerConfigData;
import **.********.model.AgentDockerConfigGenerationRequestData;
import **.********.model.JobData;
import **.********.model.ProjectData;
import jenkins.tasks.SimpleBuildStep;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.jenkinsci.Symbol;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;

import javax.annotation.Nonnull;
import java.io.IOException;
import java.util.HashMap;

public class GenerateAgentConfigToken extends Builder implements SimpleBuildStep {

    //region Private members
    private ApiHelper apiHelper;
    private String alias;
    private String projectId;
    private String jobId;
    private String browsers;
    private AgentDockerConfigData config;
    //endregion

    //region Constructors
    public GenerateAgentConfigToken() { }

    @DataBoundConstructor
    public GenerateAgentConfigToken(String alias, String projectId, String jobId, String browsers) {
        this.alias = alias;
        this.projectId = projectId;
        this.jobId = jobId;
        this.browsers = browsers;
    }
    //endregion

    //region Setters & Getters
    public String getAlias() {
        return alias;
    }

    @DataBoundSetter
    public void setAlias(String alias) {
        this.alias = alias;
    }

    public String getProjectId() {
        return projectId;
    }

    @DataBoundSetter
    public void setProjectId(String projectId) {
        this.projectId = projectId;
    }

    public String getJobId() {
        return jobId;
    }

    @DataBoundSetter
    public void setJobId(String jobId) {
        this.jobId = jobId;
    }

    public String getBrowsers() {
        return browsers;
    }

    @DataBoundSetter
    public void setBrowsers(String browsers) {
        this.browsers = browsers;
    }
    //endregion

    private void init() {
        LogHelper.Debug("Initializing API helper...");
        this.apiHelper = new ApiHelper(PluginConfiguration.DESCRIPTOR.getApiKey());
    }

    @Override
    public BuildStepMonitor getRequiredMonitorService() {
        return BuildStepMonitor.NONE;
    }

    @Override
    public void perform(@Nonnull Run<?, ?> run, @Nonnull FilePath filePath, @Nonnull Launcher launcher, @Nonnull TaskListener taskListener) throws InterruptedException, IOException {
        try {
            EnvVars envVars = new EnvVars();
            envVars = run.getEnvironment(taskListener);
            envVars.put("jobId", jobId);

            init();
            LogHelper.SetLogger(taskListener.getLogger(), PluginConfiguration.DESCRIPTOR.isVerbose());
            generateAgentConfigToken();
        } catch (Exception e) {
            LogHelper.Error(e);
            run.setResult(Result.FAILURE);
        }
    }

    private void generateAgentConfigToken() throws IOException {
        LogHelper.Info("Sending a request to generate agent configuration token...");

        //TODO: Change the URL to the production URL
        ApiResponse<AgentDockerConfigData> response = apiHelper.Post(
                Constants.TP_GENERATE_AGENT_CONFIG_TOKEN_URL,
                null,
                null,
                generateRequestBody(),
                AgentDockerConfigData.class);

        if (response.isSuccessful()) {
            if (response.getData() != null) {
                config = response.getData();
            }
        } else {
            int statusCode = response.getStatusCode();
            String responseMessage = response.getMessage();
            String message = "Unable to generate agent configuration token" + (statusCode > 0 ? " - " + statusCode : "") + (responseMessage != null ? " - " + responseMessage : "");

            throw new hudson.AbortException(message);
        }
    }

    private AgentDockerConfigGenerationRequestData generateRequestBody() {
        // if the user did not provide an alias and jobId, send the body as null
        if (StringUtils.isEmpty(alias) && StringUtils.isEmpty(jobId))
            return null;

        AgentDockerConfigGenerationRequestData body = new AgentDockerConfigGenerationRequestData();

        if (!StringUtils.isEmpty(alias))
            body.setAlias(alias);

        if (!StringUtils.isEmpty(jobId)) {
            body.setJobId(jobId);

            if (!StringUtils.isEmpty(browsers))
                body.setBrowsers(browsers.split(","));
        }
        return body;
    }

    @Override
    public DescriptorImpl getDescriptor() { return (DescriptorImpl) super.getDescriptor(); }

    @Extension
    @Symbol(Constants.TP_GENERATE_AGENT_CONFIG_TOKEN_SYMBOL)
    public static class DescriptorImpl extends BuildStepDescriptor<Builder> {

        public DescriptorImpl() {
            load();
        }

        @Override
        public boolean configure(StaplerRequest req, JSONObject formData) throws FormException {
            req.bindJSON(this, formData);
            save();

            return super.configure(req, formData);
        }

        @Override
        public boolean isApplicable(@SuppressWarnings("rawtypes") Class<? extends AbstractProject> jobType) {
            return true;
        }

        @Nonnull
        @Override
        public String getDisplayName() {
            return Constants.TP_GENERATE_AGENT_CONFIG_TOKEN;
        }

        public ListBoxModel doFillProjectIdItems() {
            HashMap<String, Object> headers = new HashMap<>();
            headers.put(Constants.ACCEPT, Constants.APPLICATION_JSON);

            ApiResponse<ProjectData[]> response = null;
            try {
                ApiHelper apiHelper = new ApiHelper(PluginConfiguration.DESCRIPTOR.getApiKey());
                response = apiHelper.Get(Constants.TP_RETURN_ACCOUNT_PROJECTS, headers, ProjectData[].class);

                if (!response.isSuccessful()) {
                    int statusCode = response.getStatusCode();
                    String responseMessage = response.getMessage();
                    String message = "Unable to fetch the projects list" + (statusCode > 0 ? " - " + statusCode : "") + (responseMessage != null ? " - " + responseMessage : "");

                    throw new hudson.AbortException(message);
                }

                ListBoxModel model = new ListBoxModel();
                model.add("Select a project", "");
                for (ProjectData project : response.getData()) {
                    model.add(
                            project.getName() + " [" + project.getId() + "]",
                            project.getId());
                }

                return model;
            } catch (IOException | NullPointerException e) {
                LogHelper.Error(e);
            }

            return null;
        }

        public ListBoxModel doFillJobIdItems(@QueryParameter String projectId) {
            if (projectId.isEmpty()) {
                return new ListBoxModel();
            }

            HashMap<String, Object> headers = new HashMap<>();
            headers.put(Constants.ACCEPT, Constants.APPLICATION_JSON);

            ApiResponse<JobData[]> response = null;
            try {
                ApiHelper apiHelper = new ApiHelper(PluginConfiguration.DESCRIPTOR.getApiKey());
                response = apiHelper.Get(String.format(Constants.TP_RETURN_PROJECT_JOBS, projectId), headers, JobData[].class);

                if (!response.isSuccessful()) {
                    int statusCode = response.getStatusCode();
                    String responseMessage = response.getMessage();
                    String message = "Unable to fetch the project's jobs list" + (statusCode > 0 ? " - " + statusCode : "") + (responseMessage != null ? " - " + responseMessage : "");

                    throw new hudson.AbortException(message);
                }

                ListBoxModel model = new ListBoxModel();
                model.add("Select a job to execute from the selected project (You must select a project first)", "");
                for (JobData job : response.getData()) {
                    model.add(
                            job.getName() + " [" + job.getId() + "]",
                            job.getId());
                }

                return model;
            } catch (IOException | NullPointerException e) {
                LogHelper.Error(e);
            }

            return null;
        }
    }
}

Есть ли способ вернуть что-нибудь из perform вместо void или boolean?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...