From 2212bd0805e2651ee4823f0be3e33a20bced9d60 Mon Sep 17 00:00:00 2001 From: Doug Morato Date: Sat, 22 Aug 2015 13:39:42 -0400 Subject: [PATCH 1/4] Initial push of testing work --- webgoat-container/pom.xml | 106 +++++++++++++++++- .../org/owasp/webgoat/plugins/WebGoatIT.java | 53 +++++++++ 2 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 webgoat-container/src/test/java/org/owasp/webgoat/plugins/WebGoatIT.java diff --git a/webgoat-container/pom.xml b/webgoat-container/pom.xml index ef27e7f5c..63aadc516 100644 --- a/webgoat-container/pom.xml +++ b/webgoat-container/pom.xml @@ -96,10 +96,10 @@ org.apache.tomcat.maven tomcat7-maven-plugin - 2.1 + 2.2 local_tomcat - http://localhost:8080/manager/text + http://localhost:8080/manager /WebGoat exec true @@ -135,6 +135,98 @@ + + start-tomcat + pre-integration-test + + run-war-only + + + 8080 + true + + + org.owasp.webgoat + webgoat-classloader + ${project.version} + + + + + + + stop-tomcat + post-integration-test + + shutdown + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.18 + + + **/*IT.java + + + + + org.apache.maven.plugins + maven-failsafe-plugin + 2.18.1 + + + + integration-test + verify + + @@ -388,6 +480,16 @@ 1.7.7 jar + + com.github.klieber + phantomjs-maven-plugin + 0.6 + + + org.seleniumhq.selenium + selenium-java + 2.47.1 + diff --git a/webgoat-container/src/test/java/org/owasp/webgoat/plugins/WebGoatIT.java b/webgoat-container/src/test/java/org/owasp/webgoat/plugins/WebGoatIT.java new file mode 100644 index 000000000..ff65e4a7b --- /dev/null +++ b/webgoat-container/src/test/java/org/owasp/webgoat/plugins/WebGoatIT.java @@ -0,0 +1,53 @@ +package org.owasp.webgoat.plugins; +import org.junit.Test; + +import static org.junit.Assert.assertNotNull; + +import org.junit.experimental.categories.Category; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.firefox.FirefoxDriver; + + +/** + * Created by dm on 8/21/15. + */ + +public class WebGoatIT { + /*@Test + public void shouldHavePhantomJsBinary() { + String binary = System.getProperty("phantomjs.binary"); + assertNotNull(binary); + assertTrue(new File(binary).exists()); + }*/ + + @Test + public void testTomcatDeployment() { + WebDriver driver = new FirefoxDriver(); + driver.get("http://localhost:8080/WebGoat"); + + WebElement usernameElement = driver.findElement(By.name("username")); + WebElement passwordElement = driver.findElement(By.name("password")); + assertNotNull(usernameElement); + assertNotNull(passwordElement); + } + + @Test + public void testLogin() { + WebDriver driver = new FirefoxDriver(); + driver.get("http://localhost:8080/WebGoat"); + + WebElement usernameElement = driver.findElement(By.name("username")); + WebElement passwordElement = driver.findElement(By.name("password")); + assertNotNull(usernameElement); + assertNotNull(passwordElement); + + usernameElement.sendKeys("webgoat"); + passwordElement.sendKeys("webgoat"); + passwordElement.submit(); + + WebElement cookieParameters = driver.findElement(By.id("cookies-and-params")); + assertNotNull(cookieParameters); + } +} From 62db0bfdefc4fc6831cc4b40744c2f461293fa3a Mon Sep 17 00:00:00 2001 From: Doug Morato Date: Mon, 24 Aug 2015 19:23:38 -0400 Subject: [PATCH 2/4] Adding basic Integration Tests with Sauce Labs integration --- .travis.yml | 17 +- webgoat-container/pom.xml | 206 +++++++------ .../org/owasp/webgoat/plugins/WebGoatIT.java | 288 ++++++++++++++++-- 3 files changed, 379 insertions(+), 132 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1ffb8da76..b3cf7ff5d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,17 +1,14 @@ language: java - jdk: - oraclejdk7 - oraclejdk8 install: "/bin/true" - script: - mvn clean compile install - git clone https://github.com/WebGoat/WebGoat-Lessons.git - mvn -file ./WebGoat-Lessons/pom.xml package - cp -fa ./WebGoat-Lessons/target/plugins/*.jar ./webgoat-container/src/main/webapp/plugin_lessons/ - - mvn package - + - mvn -Prun-integration-tests package before_deploy: - export WEBGOAT_ARTIFACT_VERSION=$(grep "" $HOME/build/$TRAVIS_REPO_SLUG/pom.xml | cut -d ">" -f 2 | cut -d "<" -f 1) - export WEBGOAT_JAR_FILE=$HOME/build/$TRAVIS_REPO_SLUG/webgoat-container/target/webgoat-container-$WEBGOAT_ARTIFACT_VERSION.jar @@ -24,12 +21,11 @@ before_deploy: - mv $WEBGOAT_WAR_FILE $WEBGOAT_ARTIFACTS_FOLDER - echo "Contents of artifcts folder:" - ls $WEBGOAT_ARTIFACTS_FOLDER - deploy: provider: s3 access_key_id: AKIAJQLKPGHXRH2AH5QA secret_access_key: - secure: "45+SwWlPFujD9FOOFLA9Lz0CaePVrn/SEsAhAn0Ve9sYpI0VsijZNymh6D29t93jBXgZoGhu/v0QJkcAA/71fQM+nGMBJjB5wmVFJ1c2A4k7tfWCVbBRI0aHGpJu12j+7BLuSfPCmCAFQGoVo7dWzfqeODe5j9Qpe9fsiQVnrKI=" + secure: 45+SwWlPFujD9FOOFLA9Lz0CaePVrn/SEsAhAn0Ve9sYpI0VsijZNymh6D29t93jBXgZoGhu/v0QJkcAA/71fQM+nGMBJjB5wmVFJ1c2A4k7tfWCVbBRI0aHGpJu12j+7BLuSfPCmCAFQGoVo7dWzfqeODe5j9Qpe9fsiQVnrKI= bucket: webgoat-war skip_cleanup: true acl: public_read @@ -38,8 +34,13 @@ deploy: repo: WebGoat/WebGoat branch: master jdk: oraclejdk8 - notifications: slack: rooms: - secure: "neH9u/VMnwh214CvS2QAsbohqQpcoi7dDM0djTqHe0gpBjtOhEeqBJV3mQYLTvgOBvHuKXVLSVufSb/sqh8KzmpblGpcXp6XSvGqBuXgIIZ3MhkGCIU8QtDfzOuYKS80cmB4EHh1EfvlqJQeLD+FCIql5IZfKmZysEekBuuXqBA=" + secure: "RS/QCVjDAt8y7c816d8UIJUl2OLaRRU6gjh//7Kb4f9TyKRACtP0Qa9NVNhSXuvb2kzUTOFb76Lz8utnt2a3iZ+elZMvnQu8+HioKr9wWJPKml8TLC+tCclQnSAz7orsQ0ubgUlsVycs7bsaQ79aKw1C9YdH+QNDgMKDxvfrEKk=" +addons: + sauce_connect: true +env: + global: + - secure: 4PRDc1Dvpz8S9HanULlAR1UOSATKDEzAq3q/zfAOXdrNyBi88mZwyDiX5MXBh6zX4f7FV+fIkg3fLIHpoWOe+DtOpDYi8C70fRhfJy5YQO0h0aGzgnNyn5nvPPeLwbeXvg9DqbPVe8R3spz27n1IHMEJYtCAYvdUil3CdtFEJJc= + - secure: ZzCLAgv9p/KD0iD9jc8bmiYcmoiKuErEFxnComxnNTGKmvNBE7FlfsS+LLznfimGJFh3q7wlDrYGmYVggn8y9yPxXOIT86J7VpduVcGq+55fZkvP9anXVuW7R+2gkuKUD0NCj7KF6jKn0EAkGqjYhJ+ioawzya/muy6xwVwXc6I= diff --git a/webgoat-container/pom.xml b/webgoat-container/pom.xml index 63aadc516..558715588 100644 --- a/webgoat-container/pom.xml +++ b/webgoat-container/pom.xml @@ -18,6 +18,99 @@ 2.2.2 + + + run-integration-tests + + false + + run-integration + true + + + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.2 + + local_tomcat + http://localhost:8080/manager + /WebGoat + exec + true + true + ${project.basedir}/src/main/webapp/WEB-INF/context.xml + + + + org.owasp.webgoat + webgoat-classloader + ${project.version} + + + org.owasp.webgoat + webgoat-container + ${project.version} + + + + + tomcat-run + + exec-war-only + + package + + + + org.owasp.webgoat + webgoat-classloader + ${project.version} + + + + + + start-tomcat + pre-integration-test + + run-war-only + + + 8888 + true + + + + + stop-tomcat + post-integration-test + + shutdown + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + 2.18.1 + + + + integration-test + verify + + + + + + + + + @@ -135,100 +228,18 @@ - - start-tomcat - pre-integration-test - - run-war-only - - - 8080 - true - - - org.owasp.webgoat - webgoat-classloader - ${project.version} - - - - - - - stop-tomcat - post-integration-test - - shutdown - - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.18 + 2.18.1 **/*IT.java - - org.apache.maven.plugins - maven-failsafe-plugin - 2.18.1 - - - - integration-test - verify - - - - @@ -352,7 +363,7 @@ org.apache.tomcat tomcat-catalina - 7.0.27 + 7.0.63 provided @@ -456,12 +467,6 @@ - - junit - junit - 4.8.1 - jar - org.apache.tiles tiles-core @@ -480,19 +485,26 @@ 1.7.7 jar + + - com.github.klieber - phantomjs-maven-plugin - 0.6 + junit + junit + 4.12 + jar org.seleniumhq.selenium selenium-java 2.47.1 + + com.saucelabs + sauce_junit + 2.1.18 + test + + + - - - - diff --git a/webgoat-container/src/test/java/org/owasp/webgoat/plugins/WebGoatIT.java b/webgoat-container/src/test/java/org/owasp/webgoat/plugins/WebGoatIT.java index ff65e4a7b..bf97171f3 100644 --- a/webgoat-container/src/test/java/org/owasp/webgoat/plugins/WebGoatIT.java +++ b/webgoat-container/src/test/java/org/owasp/webgoat/plugins/WebGoatIT.java @@ -1,31 +1,217 @@ package org.owasp.webgoat.plugins; + +import com.saucelabs.common.SauceOnDemandAuthentication; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; import org.junit.Test; - -import static org.junit.Assert.assertNotNull; - -import org.junit.experimental.categories.Category; +import org.junit.rules.TestName; +import org.junit.runner.RunWith; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; -import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.remote.CapabilityType; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.remote.RemoteWebDriver; + +import com.saucelabs.junit.ConcurrentParameterized; +import com.saucelabs.junit.SauceOnDemandTestWatcher; + +import java.net.URL; +import java.util.LinkedList; + +import static org.junit.Assert.*; + +import com.saucelabs.common.SauceOnDemandSessionIdProvider; + +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; /** - * Created by dm on 8/21/15. + * Created by Doug Morato on 8/21/15. + * */ +@RunWith(ConcurrentParameterized.class) +public class WebGoatIT implements SauceOnDemandSessionIdProvider { -public class WebGoatIT { - /*@Test - public void shouldHavePhantomJsBinary() { - String binary = System.getProperty("phantomjs.binary"); - assertNotNull(binary); - assertTrue(new File(binary).exists()); - }*/ + // Since most Tomcat deployments run on port 8080, let's set the automated integration tests to + // spawn tomcat on port 8888 so that we don't interfere with local Tomcat's + private String baseWebGoatUrl = "http://localhost:8888/WebGoat"; + private String loginUser = "webgoat"; + private String loginPassword = "webgoat"; + // Sauce Labs settings + public String username = System.getenv("SAUCE_USER_NAME") != null ? System.getenv("SAUCE_USER_NAME") : System.getenv("SAUCE_USERNAME"); + public String accesskey = System.getenv("SAUCE_API_KEY") != null ? System.getenv("SAUCE_API_KEY") : System.getenv("SAUCE_ACCESS_KEY"); + + /** + * Constructs a {@link SauceOnDemandAuthentication} instance using the supplied user name/access key. To use the authentication + * supplied by environment variables or from an external file, use the no-arg {@link SauceOnDemandAuthentication} constructor. + */ + public SauceOnDemandAuthentication authentication = new SauceOnDemandAuthentication(username, accesskey); + + /** + * JUnit Rule which will mark the Sauce Job as passed/failed when the test succeeds or fails. + */ + @Rule + public SauceOnDemandTestWatcher resultReportingTestWatcher = new SauceOnDemandTestWatcher(this, authentication); + + @Rule public TestName name = new TestName() { + public String getMethodName() { + return String.format("%s : (%s %s %s)", super.getMethodName(), os, browser, version); + }; + }; + + /** + * Represents the browser to be used as part of the test run. + */ + private String browser; + /** + * Represents the operating system to be used as part of the test run. + */ + private String os; + /** + * Represents the version of the browser to be used as part of the test run. + */ + private String version; + /** + * Represents the deviceName of mobile device + */ + private String deviceName; + /** + * Represents the device-orientation of mobile device + */ + private String deviceOrientation; + /** + * Instance variable which contains the Sauce Job Id. + */ + private String sessionId; + + /** + * The {@link WebDriver} instance which is used to perform browser interactions with. + */ + private WebDriver driver; + + + /** + * Constructs a new instance of the test. The constructor requires three string parameters, which represent the operating + * system, version and browser to be used when launching a Sauce VM. The order of the parameters should be the same + * as that of the elements within the {@link #browsersStrings()} method. + * @param os + * @param version + * @param browser + * @param deviceName + * @param deviceOrientation + */ + + public WebGoatIT(String os, String version, String browser, String deviceName, String deviceOrientation) { + super(); + this.os = os; + this.version = version; + this.browser = browser; + this.deviceName = deviceName; + this.deviceOrientation = deviceOrientation; + } + + /** + * @return a LinkedList containing String arrays representing the browser combinations the test should be run against. The values + * in the String array are used as part of the invocation of the test constructor + */ + @ConcurrentParameterized.Parameters + public static LinkedList browsersStrings() { + LinkedList browsers = new LinkedList(); + + // windows 7, Chrome 41 + browsers.add(new String[]{"Windows 7", "41", "chrome", null, null}); + + // windows 7, IE 9 + //browsers.add(new String[]{"Windows 7", "9", "internet explorer", null, null}); + + // windows 8, IE 10 + //browsers.add(new String[]{"Windows 8", "10", "internet explorer", null, null}); + + // windows 8.1, IE 11 + //browsers.add(new String[]{"Windows 8.1", "11", "internet explorer", null, null}); + + // OS X 10.9, Safari 7 + //browsers.add(new String[]{"OSX 10.9", "7", "safari", null, null}); + + // OS X 10.10, Safari 7 + //browsers.add(new String[]{"OSX 10.10", "8", "safari", null, null}); + + // Linux, Firefox 37 + //browsers.add(new String[]{"Linux", "37", "firefox", null, null}); + + return browsers; + } + + /** + * Constructs a new {@link RemoteWebDriver} instance which is configured to use the capabilities defined by the {@link #browser}, + * {@link #version} and {@link #os} instance variables, and which is configured to run against ondemand.saucelabs.com, using + * the username and access key populated by the {@link #authentication} instance. + * + * @throws Exception if an error occurs during the creation of the {@link RemoteWebDriver} instance. + */ + @Before + public void setUp() throws Exception { + DesiredCapabilities capabilities = new DesiredCapabilities(); + + if (browser != null) capabilities.setCapability(CapabilityType.BROWSER_NAME, browser); + if (version != null) capabilities.setCapability(CapabilityType.VERSION, version); + if (deviceName != null) capabilities.setCapability("deviceName", deviceName); + if (deviceOrientation != null) capabilities.setCapability("device-orientation", deviceOrientation); + + if ( System.getenv("CI") != null && System.getenv("TRAVIS").equals("true")) { + capabilities.setCapability("tunnelIdentifier", System.getenv("TRAVIS_JOB_NUMBER")); + capabilities.setCapability("tags", System.getenv("TRAVIS_PULL_REQUEST")); + capabilities.setCapability("build", System.getenv("TRAVIS_BUILD_NUMBER")); + } + + capabilities.setCapability(CapabilityType.PLATFORM, os); + + String methodName = name.getMethodName(); + capabilities.setCapability("name", methodName); + + this.driver = new RemoteWebDriver( + new URL("http://" + authentication.getUsername() + ":" + authentication.getAccessKey() + + "@ondemand.saucelabs.com:80/wd/hub"), + capabilities); + this.sessionId = (((RemoteWebDriver) driver).getSessionId()).toString(); + + String message = String.format("SauceOnDemandSessionID=%1$s job-name=%2$s", this.sessionId, methodName); + System.out.println(message); + } + + public void doLoginWebgoatUser() { + + driver.get(baseWebGoatUrl + "/login.mvc"); + + WebDriverWait wait = new WebDriverWait(driver, 10); // wait for a maximum of 5 seconds + wait.until(ExpectedConditions.presenceOfElementLocated(By.id("exampleInputEmail1"))); + wait.until(ExpectedConditions.presenceOfElementLocated(By.id("exampleInputPassword1"))); + + + WebElement usernameElement = driver.findElement(By.name("username")); + WebElement passwordElement = driver.findElement(By.name("password")); + usernameElement.sendKeys(loginUser); + passwordElement.sendKeys(loginPassword); + passwordElement.submit(); + } + + /** + * Runs a simple test verifying the UI and title of the WebGoat home page. + * @throws Exception + */ @Test - public void testTomcatDeployment() { - WebDriver driver = new FirefoxDriver(); - driver.get("http://localhost:8080/WebGoat"); + public void verifyWebGoatLoginPage() throws Exception { + driver.get(baseWebGoatUrl + "/login.mvc"); + WebDriverWait wait = new WebDriverWait(driver, 10); // wait for a maximum of 5 seconds + wait.until(ExpectedConditions.presenceOfElementLocated(By.id("exampleInputEmail1"))); + wait.until(ExpectedConditions.presenceOfElementLocated(By.id("exampleInputPassword1"))); + + assertTrue(driver.getTitle().equals("Login Page")); WebElement usernameElement = driver.findElement(By.name("username")); WebElement passwordElement = driver.findElement(By.name("password")); @@ -33,21 +219,69 @@ public class WebGoatIT { assertNotNull(passwordElement); } + @Test - public void testLogin() { - WebDriver driver = new FirefoxDriver(); - driver.get("http://localhost:8080/WebGoat"); + public void testStartMvc() { - WebElement usernameElement = driver.findElement(By.name("username")); - WebElement passwordElement = driver.findElement(By.name("password")); - assertNotNull(usernameElement); - assertNotNull(passwordElement); + driver.get(baseWebGoatUrl + "/start.mvc"); - usernameElement.sendKeys("webgoat"); - passwordElement.sendKeys("webgoat"); - passwordElement.submit(); + WebDriverWait wait = new WebDriverWait(driver, 10); // wait for a maximum of 5 seconds + wait.until(ExpectedConditions.presenceOfElementLocated(By.name("username"))); + wait.until(ExpectedConditions.presenceOfElementLocated(By.name("password"))); + } + @Test + public void testWebGoatUserLogin() { + + doLoginWebgoatUser(); + + assertTrue("user: webgoat is not in the page source", driver.getPageSource().contains("User: webgoat")); WebElement cookieParameters = driver.findElement(By.id("cookies-and-params")); - assertNotNull(cookieParameters); + assertNotNull("element id=cookieParameters should be displayed to user upon successful login", cookieParameters); + } + + @Test + public void testServiceLessonMenuMVC() { + + doLoginWebgoatUser(); + + driver.get(baseWebGoatUrl + "/service/lessonmenu.mvc"); + + String pageSource = driver.getPageSource(); + + assertTrue("Page source should contain lessons: Test 1", pageSource.contains("Bypass a Path Based Access Control Scheme")); + assertTrue("Page source should contain lessons: Test 2", pageSource.contains("Access Control Flaws")); + assertTrue("Page source should contain lessons: Test 3", pageSource.contains("Improper Error Handling")); + assertTrue("Page source should contain lessons: Test 34", pageSource.contains("Fail Open Authentication Scheme")); + } + + @Test + public void testLogoutMvc() { + + doLoginWebgoatUser(); + + driver.get(baseWebGoatUrl + "/logout.mvc"); + + assertTrue("Page title should be Logout Page", driver.getTitle().contains("Logout Page")); + assertTrue("Logout message should be displayed to user when successful logout", driver.getPageSource().contains("You have logged out successfully")); + } + + /** + * Closes the {@link WebDriver} session. + * + * @throws Exception + */ + @After + public void tearDown() throws Exception { + driver.quit(); + } + + /** + * + * @return the value of the Sauce Job id. + */ + @Override + public String getSessionId() { + return sessionId; } } From 8ed67ef62ef1a318cce9fe7c1a55d98486bd2e5a Mon Sep 17 00:00:00 2001 From: Doug Morato Date: Mon, 24 Aug 2015 19:38:37 -0400 Subject: [PATCH 3/4] Replace sauce labs config by Environment Properties --- .travis.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index b3cf7ff5d..bd8d3a161 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,8 +39,4 @@ notifications: rooms: secure: "RS/QCVjDAt8y7c816d8UIJUl2OLaRRU6gjh//7Kb4f9TyKRACtP0Qa9NVNhSXuvb2kzUTOFb76Lz8utnt2a3iZ+elZMvnQu8+HioKr9wWJPKml8TLC+tCclQnSAz7orsQ0ubgUlsVycs7bsaQ79aKw1C9YdH+QNDgMKDxvfrEKk=" addons: - sauce_connect: true -env: - global: - - secure: 4PRDc1Dvpz8S9HanULlAR1UOSATKDEzAq3q/zfAOXdrNyBi88mZwyDiX5MXBh6zX4f7FV+fIkg3fLIHpoWOe+DtOpDYi8C70fRhfJy5YQO0h0aGzgnNyn5nvPPeLwbeXvg9DqbPVe8R3spz27n1IHMEJYtCAYvdUil3CdtFEJJc= - - secure: ZzCLAgv9p/KD0iD9jc8bmiYcmoiKuErEFxnComxnNTGKmvNBE7FlfsS+LLznfimGJFh3q7wlDrYGmYVggn8y9yPxXOIT86J7VpduVcGq+55fZkvP9anXVuW7R+2gkuKUD0NCj7KF6jKn0EAkGqjYhJ+ioawzya/muy6xwVwXc6I= + sauce_connect: true From 2223bf8eb23844da7c5842ce0cb48856987beca1 Mon Sep 17 00:00:00 2001 From: Doug Morato Date: Mon, 24 Aug 2015 19:44:12 -0400 Subject: [PATCH 4/4] Integration tests only run on verify/install/deploy --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index bd8d3a161..2eca17b98 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ script: - git clone https://github.com/WebGoat/WebGoat-Lessons.git - mvn -file ./WebGoat-Lessons/pom.xml package - cp -fa ./WebGoat-Lessons/target/plugins/*.jar ./webgoat-container/src/main/webapp/plugin_lessons/ - - mvn -Prun-integration-tests package + - mvn -Prun-integration-tests package verify install before_deploy: - export WEBGOAT_ARTIFACT_VERSION=$(grep "" $HOME/build/$TRAVIS_REPO_SLUG/pom.xml | cut -d ">" -f 2 | cut -d "<" -f 1) - export WEBGOAT_JAR_FILE=$HOME/build/$TRAVIS_REPO_SLUG/webgoat-container/target/webgoat-container-$WEBGOAT_ARTIFACT_VERSION.jar