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

hudson.cli.CommandDuringBuild Maven / Gradle / Ivy

The newest version!
/*******************************************************************************
 *
 * Copyright (c) 2010, InfraDNA, Inc.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *
 *
 *
 *
 *******************************************************************************/ 

package hudson.cli;

import hudson.model.Hudson;
import hudson.model.Job;
import hudson.model.Run;
import hudson.remoting.Callable;
import org.kohsuke.args4j.CmdLineException;

import java.io.IOException;

/**
 * Base class for those commands that are valid only during a build.
 *
 * @author Kohsuke Kawaguchi
 */
public abstract class CommandDuringBuild extends CLICommand {

    /**
     * This method makes sense only when called from within the build kicked by
     * Hudson. We use the environment variables that Hudson sets to determine
     * the build that is being run.
     */
    protected Run getCurrentlyBuilding() throws CmdLineException {
        try {
            CLICommand c = CLICommand.getCurrent();
            if (c == null) {
                throw new IllegalStateException("Not executing a CLI command");
            }
            String[] envs = c.channel.call(new GetCharacteristicEnvironmentVariables());

            if (envs[0] == null || envs[1] == null) {
                throw new CmdLineException("This CLI command works only when invoked from inside a build");
            }

            Job j = Hudson.getInstance().getItemByFullName(envs[0], Job.class);
            if (j == null) {
                throw new CmdLineException("No such job: " + envs[0]);
            }

            try {
                Run r = j.getBuildByNumber(Integer.parseInt(envs[1]));
                if (r == null) {
                    throw new CmdLineException("No such build #" + envs[1] + " in " + envs[0]);
                }
                return r;
            } catch (NumberFormatException e) {
                throw new CmdLineException("Invalid build number: " + envs[1]);
            }
        } catch (IOException e) {
            throw new CmdLineException("Failed to identify the build being executed", e);
        } catch (InterruptedException e) {
            throw new CmdLineException("Failed to identify the build being executed", e);
        }
    }

    /**
     * Gets the environment variables that points to the build being executed.
     */
    private static final class GetCharacteristicEnvironmentVariables implements Callable {

        public String[] call() throws IOException {
            return new String[]{
                        System.getenv("JOB_NAME"),
                        System.getenv("BUILD_NUMBER")
                    };
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy