Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Avoiding crash when setting Maven2 jobs to unstable in 1.609 #61 JENK…
…INS-28880

* Avoiding crash when setting Maven2 build to UNSTABLE. By simply catching the IllegalStateException. This is not the final solution. The build will still not be marked as unstable, instead of crashing (FAIL) it will succeed (SUCCESS). Instead of showing no violation results, it will show them.
* Making the example projects compile
 * Testing example projects in web tests
* Stepping up Jenkins version to 1.580.3
* Adding Java 8 to Travis config
 * Using Firefox and Xvfb in Travis CI, HTMLUnit is a bit unpredictable
  • Loading branch information
tomasbjerre committed Jun 17, 2015
1 parent 464c6d1 commit 1c99152
Show file tree
Hide file tree
Showing 28 changed files with 598 additions and 690 deletions.
4 changes: 4 additions & 0 deletions .travis.yml
Expand Up @@ -3,6 +3,10 @@ jdk:
- openjdk6
- openjdk7
- oraclejdk7
- oraclejdk8
before_script:
- "export DISPLAY=:99.0"
- "sh -e /etc/init.d/xvfb start"
script:
- ./build.sh
notifications:
Expand Down
19 changes: 9 additions & 10 deletions build.sh
Expand Up @@ -7,6 +7,11 @@ function build_clean {
done
}

function on_exit {
build_clean
}
trap on_exit EXIT

##
## Setup
##
Expand All @@ -18,8 +23,7 @@ cp sandbox/settings.xml ~/.m2/settings.xml
##
## Build plugin
##
echo Building plugin
mvn -q package || exit 1
mvn -q clean package || exit 1

##
## Start Jenkins on localhost
Expand All @@ -31,19 +35,14 @@ JENKINS_PREFIX=/jenkins
mvn -q hpi:run -Djetty.port=$JENKINS_PORT -Dhpi.prefix=$JENKINS_PREFIX || exit 1 &
JENKINS_URL=http://localhost:$JENKINS_PORT$JENKINS_PREFIX
until $(curl --output /dev/null --silent --head --fail $JENKINS_URL); do
printf '.'
sleep 5
printf '.'
sleep 5
done
echo Jenkins started at $JENKINS_URL

##
## Test plugin
##
cd plugin-test
mvn -q test -Djenkins=$JENKINS_URL -Dheadless=true || exit 1
mvn -q test -Djenkins=$JENKINS_URL $1 || exit 1
cd ..

##
## Exit
##
build_clean
7 changes: 3 additions & 4 deletions plugin-test/pom.xml
Expand Up @@ -70,10 +70,9 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-htmlunit-driver</artifactId>
<version>2.45.0</version>
<scope>test</scope>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
</project>
@@ -1,31 +1,27 @@
package hudson.plugins.violations;

import static com.gargoylesoftware.htmlunit.BrowserVersion.FIREFOX_24;
import static com.google.common.base.MoreObjects.firstNonNull;
import static java.lang.System.getProperty;
import static java.lang.Thread.sleep;
import static java.util.logging.Level.OFF;
import static org.junit.Assert.assertTrue;
import static org.openqa.selenium.By.id;
import static org.openqa.selenium.By.xpath;
import static org.junit.Assert.assertEquals;

import java.util.logging.Logger;

import org.apache.commons.logging.LogFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;

import com.jayway.jsonpath.JsonPath;

public class ConfigurationWebTest {
private static final String PROP_JENKINS_URL = "jenkins";
private static final String PROP_HEADLESS = "headless";
private static final Logger logger = Logger.getLogger(ConfigurationWebTest.class.getName());
private static final String TEST_JOB_NAME = "testJob";
private WebDriver webDriver;
private static WebDriver webDriver;

static {
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log",
Expand All @@ -34,118 +30,85 @@ public class ConfigurationWebTest {
java.util.logging.Logger.getLogger("org.apache.commons.httpclient").setLevel(OFF);
}

private String getJenkinsBaseUrl() {
return firstNonNull(getProperty(PROP_JENKINS_URL), "http://localhost:8080");
}

private boolean isHeadless() {
return !firstNonNull(getProperty(PROP_HEADLESS), "false").equals("false");
private static String getJenkinsBaseUrl() {
return firstNonNull(getProperty(PROP_JENKINS_URL), "http://localhost:8080/jenkins");
}

@Before
public void before() throws InterruptedException {
if (isHeadless()) {
HtmlUnitDriver webDriverHtmlUnit = new HtmlUnitDriver(FIREFOX_24);
webDriverHtmlUnit.setJavascriptEnabled(true);
this.webDriver = webDriverHtmlUnit;
} else {
webDriver = new FirefoxDriver();
}
@BeforeClass
public static void before() throws Exception {
webDriver = new FirefoxDriver();
waitForJenkinsToStart();
}

@After
public void after() {
deleteJob();
@AfterClass
public static void after() throws Exception {
webDriver.quit();
}

@Test
public void testPluginConfiguration() throws InterruptedException {
/**
* Create new job and enable plugin on it.
*/
createJob();
enablePlugin();

/**
* Enter valid details, start job and validate config output.
*/
webDriver.findElement(xpath("//input[@name='config.limit']")).sendKeys("50");
webDriver.findElement(xpath("//input[@name='checkstyle.pattern']")).sendKeys("**/css-checkstyle.xml");
removeOnBeforeUnload();
saveJob();
startJob();
waitForJob(1);
String consoleText = consoleText(1);
assertTrue(consoleText, consoleText.contains("SUCCESS"));
public void testThatExampleProjectM2FreedstyleBuildCanBeBuilt() throws Exception {
String jobName = "m2-freestyle-build";
startJob(jobName);
waitForJob(jobName);
assertResult(jobName, "unstable");
}

private void waitForJob(int index) throws InterruptedException {
while (!consoleText(index).contains("Finished: SUCCESS")) {
logger.info("Waiting for jenkins job to finnish");
sleep(500);
}
@Test
public void testThatExampleProjectM2FreedstyleSiteCanBeBuilt() throws Exception {
String jobName = "m2-freestyle-site";
startJob(jobName);
waitForJob(jobName);
assertResult(jobName, "unstable");
}

private String consoleText(int index) {
try {
webDriver.get(getJenkinsBaseUrl() + "/job/" + TEST_JOB_NAME + "/" + index + "/consoleText");
return webDriver.getPageSource();
} catch (Exception e) {
return "";
}
// Requires Maven2 installation to be present
@Ignore
@Test
public void testThatExampleProjectM2M2BuildCanBeBuilt() throws Exception {
String jobName = "m2-m2-build";
startJob(jobName);
waitForJob(jobName);
assertResult(jobName, "unstable");
}

private void startJob() {
webDriver.get(getJenkinsBaseUrl() + "/job/" + TEST_JOB_NAME + "/build?delay=0sec");
// Requires Maven2 installation to be present
@Ignore
@Test
public void testThatExampleProjectM2M2SiteCanBeBuilt() throws Exception {
String jobName = "m2-m2-site";
startJob(jobName);
waitForJob(jobName);
assertResult(jobName, "unstable");
}

private void saveJob() {
webDriver.findElement(xpath("//button[@id='yui-gen12-button']")).click();
private void assertResult(String jobName, String expectedResult) {
webDriver.get(getJenkinsBaseUrl() + "/job/" + jobName + "/lastBuild/api/json?pretty=true");
String json = webDriver.getPageSource().replaceAll("<.+?>", "");
String result = JsonPath.read(json, "$.['result']");
assertEquals("Not unstable!\n" + json, expectedResult.toUpperCase(), result.toUpperCase());
}

private void createJob() {
webDriver.get(getJenkinsBaseUrl() + "/view/All/newJob");
webDriver.findElement(id("name")).sendKeys(TEST_JOB_NAME);
webDriver.findElement(xpath("//input[@value='hudson.model.FreeStyleProject']")).click();
webDriver.findElement(id("ok-button")).click();
private void waitForJob(String jobName) throws InterruptedException {
while (!consoleText(jobName).contains("Finished: ")) {
logger.info("Waiting for jenkins job to finnish");
sleep(500);
}
}

private void enablePlugin() throws InterruptedException {
scrollDown();
try {
webDriver.findElement(xpath("//button[@suffix='publisher']")).click();
webDriver.findElement(xpath("//a[text()='Report Violations']")).click();
} catch (Exception e) {
logger.info("Did not find publisher button");
}
private String consoleText(String jobName) {
try {
webDriver.findElement(xpath("//input[@name='hudson-plugins-violations-ViolationsPublisher']")).click();
webDriver.get(getJenkinsBaseUrl() + "/job/" + jobName + "/lastBuild/consoleText");
return webDriver.getPageSource();
} catch (Exception e) {
logger.info("Did not find publisher checkbox");
return "";
}
scrollDown();
}

private void deleteJob() {
webDriver.get(getJenkinsBaseUrl() + "/job/" + TEST_JOB_NAME + "/delete");
webDriver.findElement(xpath("//button[@id='yui-gen1-button']")).click();
}

private void removeOnBeforeUnload() {
((JavascriptExecutor) webDriver).executeScript("window.onbeforeunload=null;", "");
}

private void scrollDown() throws InterruptedException {
for (int i = 0; i < 10; i++) {
((JavascriptExecutor) webDriver).executeScript("window.scrollBy(0,1000)", "");
sleep(50);
}
private void startJob(String jobName) {
webDriver.get(getJenkinsBaseUrl() + "/job/" + jobName + "/build?delay=0sec");
}

private void waitForJenkinsToStart() throws InterruptedException {
webDriver.get(getJenkinsBaseUrl());
private static void waitForJenkinsToStart() throws Exception {
while (webDriver.getPageSource().contains("getting ready")) {
logger.info("Jenkins not ready...");
sleep(500);
Expand Down
3 changes: 2 additions & 1 deletion pom.xml
Expand Up @@ -5,7 +5,7 @@
<parent>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>plugin</artifactId>
<version>1.451</version>
<version>1.580.3</version>
<relativePath />
</parent>

Expand Down Expand Up @@ -133,6 +133,7 @@
<dependency>
<groupId>org.jenkins-ci.main</groupId>
<artifactId>maven-plugin</artifactId>
<version>2.9</version>
</dependency>
<dependency>
<groupId>xpp3</groupId>
Expand Down
13 changes: 2 additions & 11 deletions reset.sh
@@ -1,12 +1,3 @@
#!/bin/bash
rm -Rf work/jobs/*/builds
rm -Rf work/jobs/*/nextBuildNumber
rm -Rf work/jobs/*/modules
rm -Rf work/jobs/*/workspace/target
rm -Rf work/jobs/*/workspace/*/target
rm -Rf work/jobs/*/workspace/dist
rm -Rf work/jobs/*/workspace/build
rm -Rf work/fingerprints
rm -Rf work/queue.txt
rm -Rf work/secret.key
rm -Rf work/update-center.json
rm -rf work
git checkout work

0 comments on commit 1c99152

Please sign in to comment.