|
(Alphabetization Almost Complete)
|
(Alphabetization Complete!)
|
| Line 2308: | |||
| // set the property | // set the property | ||
| workflow.getRequest().setProperty("resolve.status", status); </pre> | workflow.getRequest().setProperty("resolve.status", status); </pre> | ||
| + | = Show Test Changes = | ||
| + | This is designed to be a "Evaluate a Script" step that creates a report that goes under the Build's report tab. | ||
| + | ==== AHPSCRIPTS-62 ==== | ||
| + | <pre>import com.urbancode.anthill3.domain.buildlife.BuildLife; | ||
| + | import com.urbancode.anthill3.domain.jobtrace.JobTrace; | ||
| + | import com.urbancode.anthill3.domain.test.TestCase; | ||
| + | import com.urbancode.anthill3.domain.test.TestReport; | ||
| + | import com.urbancode.anthill3.domain.test.TestReportFactory; | ||
| + | import com.urbancode.anthill3.domain.test.TestSuite; | ||
| + | import com.urbancode.anthill3.runtime.paths.PublishPathHelper; | ||
| + | import com.urbancode.anthill3.runtime.scripting.helpers.BuildLifeLookup; | ||
| + | import com.urbancode.anthill3.runtime.scripting.helpers.JobTraceLookup; | ||
| + | import com.urbancode.anthill3.services.template.TemplateHelper; | ||
| + | import com.urbancode.commons.fileutils.FileUtils; | ||
| + | import com.urbancode.devilfish.services.var.VarService; | ||
| + | import java.io.BufferedWriter; | ||
| + | import java.io.File; | ||
| + | import java.io.FileWriter; | ||
| + | import java.util.HashMap; | ||
| + | import java.util.Iterator; | ||
| + | import java.util.Map; | ||
| + | try { | ||
| + | // helper class for the tests | ||
| + | class TestInstance { | ||
| + | String key = null; | ||
| + | String suite = null; | ||
| + | String test = null; | ||
| + | boolean success = false; | ||
| + | int duration = 0; | ||
| + | } | ||
| + | // two maps to hold test information about this and previous build lives | ||
| + | Map oldTestMap = new HashMap(); | ||
| + | Map newTestMap = new HashMap(); | ||
| + | TemplateHelper templateHelper = TemplateHelper.getInstance(null); | ||
| + | // populate the sets | ||
| + | BuildLife currentBuildLife = BuildLifeLookup.getCurrent(); | ||
| + | TestReport[] testReportArray = TestReportFactory.getInstance() | ||
| + | .restoreAllForBuildLife(currentBuildLife); | ||
| + | for (int i = 0; i < testReportArray.length; i++) { | ||
| + | TestSuite[] testSuiteArray = testReportArray[i].getTestSuites(); | ||
| + | for (int j = 0; j < testSuiteArray.length; j++) { | ||
| + | TestCase[] testCaseArray = testSuiteArray[j].getTestCases(); | ||
| + | for (int k = 0; k < testCaseArray.length; k++) { | ||
| + | TestInstance testInstance = new TestInstance(); | ||
| + | testInstance.suite = testSuiteArray[j].getName(); | ||
| + | testInstance.test = testCaseArray[k].getName(); | ||
| + | testInstance.key = | ||
| + | testInstance.test + testInstance.suite; | ||
| + | testInstance.success = "success" | ||
| + | .equalsIgnoreCase(testCaseArray[k].getResult()); | ||
| + | testInstance.duration = testCaseArray[k].getTime(); | ||
| + | newTestMap.put(testInstance.key, testInstance); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | BuildLife lastSuccessBuildLife = BuildLifeLookup.mostRecentSuccess(); | ||
| + | testReportArray = TestReportFactory.getInstance() | ||
| + | .restoreAllForBuildLife(lastSuccessBuildLife); | ||
| + | for (int i = 0; i < testReportArray.length; i++) { | ||
| + | TestSuite[] testSuiteArray = testReportArray[i].getTestSuites(); | ||
| + | for (int j = 0; j < testSuiteArray.length; j++) { | ||
| + | TestCase[] testCaseArray = testSuiteArray[j].getTestCases(); | ||
| + | for (int k = 0; k < testCaseArray.length; k++) { | ||
| + | TestInstance testInstance = new TestInstance(); | ||
| + | testInstance.suite = testSuiteArray[j].getName(); | ||
| + | testInstance.test = testCaseArray[k].getName(); | ||
| + | testInstance.key = | ||
| + | testInstance.test + testInstance.suite; | ||
| + | testInstance.success = "success" | ||
| + | .equalsIgnoreCase(testCaseArray[k].getResult()); | ||
| + | testInstance.duration = testCaseArray[k].getTime(); | ||
| + | oldTestMap.put(testInstance.key, testInstance); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | // get the path to the reports directory | ||
| + | JobTrace jobTrace = JobTraceLookup.getCurrent(); | ||
| + | if (jobTrace != null) { | ||
| + | String publishPath = VarService.getInstance() | ||
| + | .resolve(PublishPathHelper.getInstance() | ||
| + | .getPublishPath(jobTrace, "Test Changes")); | ||
| + | FileUtils.assertDirectory(publishPath); | ||
| + | // create the report | ||
| + | File reportFile = | ||
| + | new File(publishPath, "Test Differences.html"); | ||
| + | BufferedWriter writer = | ||
| + | new BufferedWriter(new FileWriter(reportFile)); | ||
| + | writer.write("<HTML>\n" + "<HEAD>\n" + | ||
| + | "<TITLE>Anthill3 - Test Diff Report</TITLE>\n" + | ||
| + | "<link rel=\"StyleSheet\" href=\"/css/anthill3.css\" type=\"text/css\">" + | ||
| + | "</head>\n" + "<BODY>\n" + "<TABLE class=\"data-table\" WIDTH=\"100%\">\n" + | ||
| + | "\n" + "<TR><TD>\n" + "<H1>Test Diff Report</H1>\n" + | ||
| + | "</TD></TR>\n"); | ||
| + | // output all tests that are new | ||
| + | writer.write("<TR><TD>\n" + | ||
| + | "<H2>New Tests:</H2>\n" + | ||
| + | "<table cellpadding=\"4\" cellspacing=\"1\" width=\"100%\">\n" + | ||
| + | "<TH>Suite</TH>\n" + "<TH>Test</TH>\n"); | ||
| + | itr = newTestMap.keySet().iterator(); | ||
| + | while (itr.hasNext()) { | ||
| + | String key = (String) itr.next(); | ||
| + | TestInstance newTest = (TestInstance) newTestMap.get(key); | ||
| + | TestInstance oldTest = (TestInstance) oldTestMap.get(key); | ||
| + | if (newTest != null && oldTest == null) { | ||
| + | writer.write("<TR>"); | ||
| + | writer.write("<TD VALIGN=\"top\">" + newTest.suite + | ||
| + | "</TD>"); | ||
| + | writer.write( | ||
| + | "<TD VALIGN=\"top\">" + newTest.test + "</TD>"); | ||
| + | writer.write("</TR>"); | ||
| + | } | ||
| + | } | ||
| + | writer.write("</TABLE>\n" + "<BR/>\n" + "<BR/>\n" + "</TD></TR>"); | ||
| + | // output all tests failed this time but succeeded before | ||
| + | writer.write("<TR><TD>\n" + | ||
| + | "<H2>New Failing Tests:</H2>\n" + | ||
| + | "<table cellpadding=\"4\" cellspacing=\"1\" width=\"100%\">\n" + | ||
| + | "<TH>Suite</TH>\n" + "<TH>Test</TH>\n"); | ||
| + | itr = newTestMap.keySet().iterator(); | ||
| + | while (itr.hasNext()) { | ||
| + | String key = (String) itr.next(); | ||
| + | TestInstance newTest = (TestInstance) newTestMap.get(key); | ||
| + | TestInstance oldTest = (TestInstance) oldTestMap.get(key); | ||
| + | if (newTest != null && !newTest.success && (oldTest == null || oldTest.success)) { | ||
| + | writer.write("<TR>"); | ||
| + | writer.write("<TD VALIGN=\"top\">" + newTest.suite + | ||
| + | "</TD>"); | ||
| + | writer.write( | ||
| + | "<TD VALIGN=\"top\">" + newTest.test + "</TD>"); | ||
| + | writer.write("</TR>"); | ||
| + | } | ||
| + | } | ||
| + | writer.write("</TABLE>\n" + "<BR/>\n" + "<BR/>\n" + "</TD></TR>"); | ||
| + | // output all tests that took more time | ||
| + | writer.write("<TR><TD>\n" + | ||
| + | "<H2>Tests that ran slower:</H2>\n" + | ||
| + | "<table cellpadding=\"4\" cellspacing=\"1\" width=\"100%\">\n" + | ||
| + | "<TH>Suite</TH>\n" + "<TH>Test</TH>\n" + | ||
| + | "<TH>Last Run Duration</TH>\n" + | ||
| + | "<TH>Current Run Duration</TH>\n"); | ||
| + | Iterator itr = newTestMap.keySet().iterator(); | ||
| + | while (itr.hasNext()) { | ||
| + | String key = (String) itr.next(); | ||
| + | TestInstance newTest = (TestInstance) newTestMap.get(key); | ||
| + | TestInstance oldTest = (TestInstance) oldTestMap.get(key); | ||
| + | if (newTest != null && oldTest != null && | ||
| + | newTest.duration > oldTest.duration*1.1) { | ||
| + | writer.write("<TR>"); | ||
| + | writer.write("<TD VALIGN=\"top\">" + newTest.suite + | ||
| + | "</TD>"); | ||
| + | writer.write( | ||
| + | "<TD VALIGN=\"top\">" + newTest.test + "</TD>"); | ||
| + | writer.write("<TD VALIGN=\"top\" ALIGN=\"center\" >" + | ||
| + | templateHelper.formatNumber( | ||
| + | templateHelper.duration( | ||
| + | oldTest.duration), "##0.0000") + | ||
| + | " secs</TD>"); | ||
| + | writer.write("<TD VALIGN=\"top\" ALIGN=\"center\" >" + | ||
| + | templateHelper.formatNumber( | ||
| + | templateHelper.duration( | ||
| + | newTest.duration), "##0.0000") + | ||
| + | " secs</TD>"); | ||
| + | writer.write("</TR>"); | ||
| + | } | ||
| + | } | ||
| + | writer.write("</TABLE>\n" + "<BR/>\n" + "<BR/>\n" + "</TD></TR>"); | ||
| + | // output all tests that were fixed or are new and succeede | ||
| + | writer.write("<TR><TD>\n" + | ||
| + | "<H2>New or Newly Fixed Tests:</H2>\n" + | ||
| + | "<table cellpadding=\"4\" cellspacing=\"1\" width=\"100%\">\n" + | ||
| + | "<TH>Suite</TH>\n" + "<TH>Test</TH>\n"); | ||
| + | itr = newTestMap.keySet().iterator(); | ||
| + | while (itr.hasNext()) { | ||
| + | String key = (String) itr.next(); | ||
| + | TestInstance newTest = (TestInstance) newTestMap.get(key); | ||
| + | TestInstance oldTest = (TestInstance) oldTestMap.get(key); | ||
| + | if (newTest != null && newTest.success && (oldTest == null || !oldTest.success)) { | ||
| + | writer.write("<TR>"); | ||
| + | writer.write("<TD VALIGN=\"top\">" + newTest.suite + | ||
| + | "</TD>"); | ||
| + | writer.write( | ||
| + | "<TD VALIGN=\"top\">" + newTest.test + "</TD>"); | ||
| + | writer.write("</TR>"); | ||
| + | } | ||
| + | } | ||
| + | writer.write("</TABLE>\n" + "<BR/>\n" + "<BR/>\n" + "</TD></TR>"); | ||
| + | writer.write("</TABLE>\n" + "</BODY>\n" + "</HTML>"); | ||
| + | writer.flush(); | ||
| + | writer.close(); | ||
| + | } | ||
| + | } | ||
| + | catch (Exception e) { | ||
| + | e.printStackTrace(commandOutput); | ||
| + | } | ||
| + | </pre> | ||
| + | = Template for adding users to realms = | ||
| + | Script Notes: | ||
| + | * Treat this mostly as a snippet for doing something more interesting with. | ||
| + | ==== AHPSCRIPTS-1 ==== | ||
| + | <pre>import com.urbancode.anthill3.domain.project.*; | ||
| + | import com.urbancode.anthill3.domain.authentication.*; | ||
| + | import com.urbancode.anthill3.domain.security.*; | ||
| + | import com.urbancode.anthill3.domain.singleton.security.*; | ||
| + | // Lookup Your roles | ||
| + | buildRole = RoleFactory.getInstance().restoreForName("Build Master"); | ||
| + | userRole = RoleFactory.getInstance().restoreForName("User"); | ||
| + | // Look-up the LDAP realm here | ||
| + | // This is a lookup by name, so insert the name of your LDAP realm. | ||
| + | realm = AuthenticationRealmFactory.getInstance().restore("LDAP"); | ||
| + | // Do this for each user: | ||
| + | User user1 = new User(true, realm); | ||
| + | user1.setName("JaneDoe"); | ||
| + | user1.setPassword("Bogus"); | ||
| + | user1.addRole(userRole); | ||
| + | user1.addRole(buildRole); | ||
| + | user1.store();</pre> | ||
| + | = Update Environment Properties for All Projects = | ||
| + | Here's a modification that runs form within AnthillPro. The environment is selected to be the current running environment and the other values are read out of properties (the environment could come from a property as well). | ||
| + | ==== AHPSCRIPTS-14 ==== | ||
| + | <pre>import com.urbancode.anthill3.main.client.AnthillClient; | ||
| + | import com.urbancode.anthill3.persistence.UnitOfWork; | ||
| + | import com.urbancode.anthill3.domain.project.*; | ||
| + | import com.urbancode.anthill3.domain.project.envprops.*; | ||
| + | import com.urbancode.anthill3.domain.servergroup.*; | ||
| + | import java.util.*; | ||
| + | variableName = PropertyLookup.get("variableName"); | ||
| + | newVariableValue = PropertyLookup.get("variableValue"); | ||
| + | boolean isSecure = Boolean.parseBoolean(PropertyLookup.get("isSecure")); | ||
| + | environment = EnvironmentLookup.getCurrent(); | ||
| + | // Project | ||
| + | Project[] projects = ProjectFactory.getInstance().restoreAll(); | ||
| + | // Loop through projects. If it has environment props for this, find the | ||
| + | // right one and change it as appropriate. | ||
| + | for (int i = 0; i < projects.length; i++) { | ||
| + | |||
| + | ProjectEnvironmentProperty[] envPropArray = environment.getEnvironmentPropertiesForProject(projects[i]); | ||
| + | boolean foundVariable = false; | ||
| + | for (int j = 0; j < envPropArray.length; j++) { | ||
| + | if (envPropArray[j].getName().equals(variableName)) { | ||
| + | foundVariable = true; | ||
| + | envPropArray[j].setValue(newVariableValue); | ||
| + | envPropArray[j].store(); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | if (!foundVariable) { | ||
| + | ProjectEnvironmentProperty newProp = new ProjectEnvironmentProperty(true); | ||
| + | |||
| + | newProp.setProject(projects[i]); | ||
| + | newProp.setServerGroup(environment); | ||
| + | newProp.setName(variableName); | ||
| + | newProp.setValue(newVariableValue); | ||
| + | newProp.setSetAsEnvProp(false); | ||
| + | newProp.setSecureValue(isSecure); | ||
| + | |||
| + | newProp.store(); | ||
| + | } | ||
| + | |||
| + | } | ||
| + | </pre> | ||