package org.jenkinsci.plugins.p4; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream; import org.apache.commons.exec.CommandLine; import org.apache.commons.exec.DefaultExecuteResultHandler; import org.apache.commons.exec.DefaultExecutor; import org.apache.commons.exec.PumpStreamHandler; import org.apache.commons.io.FileUtils; import org.apache.commons.io.output.ByteArrayOutputStream; import org.jenkinsci.plugins.p4.client.ConnectionHelper; import org.jenkinsci.plugins.p4.credentials.P4PasswordImpl; import com.cloudbees.plugins.credentials.CredentialsScope; import java.util.logging.Level; public class P4Server { private static Logger logger = Logger.getLogger(P4Server.class.getName()); private ConnectionHelper p4; private final String p4d; private final String p4port; private final File p4root; public P4Server(String p4bin, String root, String p4port) { String p4d = p4bin; String os = System.getProperty("os.name").toLowerCase(); if (os.contains("win")) { p4d += "bin.ntx64/p4d.exe"; } if (os.contains("mac")) { p4d += "bin.darwin90x86_64/p4d"; } if (os.contains("nix") || os.contains("nux")) { p4d += "bin.linux26x86_64/p4d"; } this.p4d = p4d; this.p4root = new File(root); this.p4port = p4port; } public void start() throws Exception { CommandLine cmdLine = new CommandLine(p4d); // cmdLine.addArgument("-vserver=5"); cmdLine.addArgument("-C1"); cmdLine.addArgument("-r"); cmdLine.addArgument(formatPath(p4root.getAbsolutePath())); cmdLine.addArgument("-p"); cmdLine.addArgument(p4port); cmdLine.addArgument("-Llog"); DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler(); DefaultExecutor executor = new DefaultExecutor(); executor.execute(cmdLine, resultHandler); logger.info("start signal sent..."); P4PasswordImpl auth = new P4PasswordImpl(CredentialsScope.SYSTEM, "id", "desc", p4port, null, "admin", "0", "0", "Password"); int retry = 0; while (retry < 20) { try { p4 = new ConnectionHelper(auth); break; } catch (Exception e) { Thread.sleep(100); } } } public void stop() throws Exception { P4PasswordImpl auth = new P4PasswordImpl(CredentialsScope.SYSTEM, "id", "desc", p4port, null, "admin", "0", "0", "Password"); p4 = new ConnectionHelper(auth); p4.login(); p4.stop(); logger.info("stop signal sent..."); int retry = 0; while (retry < 20) { try { if (!p4.login()) { break; } else { Thread.sleep(100); } } catch (Exception e) { break; } retry++; } } public void upgrade() throws Exception { exec(new String[] { "-xu" }); } public void restore(File ckp) throws Exception { exec(new String[] { "-jr", "-z", formatPath(ckp.getAbsolutePath()) }); } public void extract(File archive) throws Exception { TarArchiveInputStream tarIn = null; tarIn = new TarArchiveInputStream( new GzipCompressorInputStream(new BufferedInputStream(new FileInputStream(archive)))); TarArchiveEntry tarEntry = tarIn.getNextTarEntry(); while (tarEntry != null) { File node = new File(p4root, tarEntry.getName()); logger.info("extracting: " + node.getCanonicalPath()); if (tarEntry.isDirectory()) { node.mkdirs(); } else { node.createNewFile(); byte[] buf = new byte[1024]; BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(node)); int len = 0; while ((len = tarIn.read(buf)) != -1) { bout.write(buf, 0, len); } bout.close(); buf = null; } tarEntry = tarIn.getNextTarEntry(); } tarIn.close(); } public void clean() throws IOException, InterruptedException { if (p4root.exists()) { logger.log(Level.INFO, "Attempting to clean directory: {0}", p4root); int retry = 0; while (true) { retry++; try { FileUtils.cleanDirectory(p4root); break; } catch (IOException e) { if (retry < 5) { logger.log(Level.WARNING, "Failed to clean directory, sleeping and retrying: {0}", e.getMessage()); Thread.sleep(1000); } else { logger.log(Level.SEVERE, "Failed to clean directory: {0}", e.getMessage()); throw e; } } } } else { p4root.mkdir(); } } public int getVersion() throws Exception { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); CommandLine cmdLine = new CommandLine(p4d); cmdLine.addArgument("-V"); DefaultExecutor executor = new DefaultExecutor(); PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream); executor.setStreamHandler(streamHandler); executor.execute(cmdLine); int version = 0; for (String line : outputStream.toString().split("\\n")) { if (line.startsWith("Rev. P4D")) { Pattern p = Pattern.compile("\\d{4}\\.\\d{1}"); Matcher m = p.matcher(line); while (m.find()) { String found = m.group(); found = found.replace(".", ""); // strip "." version = Integer.parseInt(found); } } } logger.info("P4D Version: " + version); return version; } private int exec(String[] args) throws Exception { CommandLine cmdLine = new CommandLine(p4d); cmdLine.addArgument("-C1"); cmdLine.addArgument("-r"); cmdLine.addArgument(formatPath(p4root.getAbsolutePath())); for (String arg : args) { cmdLine.addArgument(arg); } logger.info("EXEC: " + cmdLine.toString()); DefaultExecutor executor = new DefaultExecutor(); return executor.execute(cmdLine); } private String formatPath(String path) { final String Q = "\""; path = Q + path + Q; String os = System.getProperty("os.name").toLowerCase(); if (os.contains("win")) { path = path.replace('\\', '/'); } return path; } }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#2 | 20153 | stuartr |
[JENKINS-26764] adding retries (5) to P4Server.clean #review-20124 @paul_allen |
||
#1 | 20120 | stuartr |
Branching //guest/perforce_software/p4jenkins/main/... to //guest/stuartr/p4jenkins/main/... |
||
//guest/perforce_software/p4jenkins/main/src/test/java/org/jenkinsci/plugins/p4/P4Server.java | |||||
#5 | 17264 | Paul Allen | Missing retry increment for tests. | ||
#4 | 16502 | Paul Allen |
Advanced Credentials option for RPC_SOCKET_SO_TIMEOUT_NICK JENKINS-31196 |
||
#3 | 15293 | Paul Allen |
Add retry attempts to Perforce Tasks. If a task fails due to an exception then the task will retry based on the value specified in the connection Credential. |
||
#2 | 10844 | Paul Allen |
New P4D start/stop wrapper. Removes old time delays. |
||
#1 | 9690 | Paul Allen |
[Branching using p4-jenkins] Release 1.0.1 |
||
//guest/paul_allen/dev/p4-jenkins/p4-client/src/test/java/org/jenkinsci/plugins/p4/P4Server.java | |||||
#3 | 9684 | Paul Allen | Fix to P4D version query. | ||
#2 | 9683 | Paul Allen | Added P4D for win/mac/linux, so tests are ready to run. | ||
#1 | 9672 | Paul Allen | Refactor name from 'p4_client' to 'p4'. | ||
//guest/paul_allen/dev/p4-jenkins/p4-client/src/test/java/org/jenkinsci/plugins/p4_client/P4Server.java | |||||
#2 | 8816 | Paul Allen | Functional tests for build @HEAD and @change; includes build console log check. | ||
#1 | 8815 | Paul Allen | P4D test harness. |