Skip to content

Commit fa00d75

Browse files
authored
Use Gradle retry plugin to reduce pipeline flake (#2472)
- Since we have 16 builds in the pipeline even with pretty stable tests, it's pretty easy to have a failure. We also observe this in PR builds, so: - Use the Gradle retry plugin to retry twice on test failure - Our test flake monitoring still works since it still outputs to the log that the test fails
1 parent f53e0ae commit fa00d75

File tree

8 files changed

+40
-15
lines changed

8 files changed

+40
-15
lines changed

build.gradle.kts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ val publishChannel: String by project
5252
plugins {
5353
java
5454
id("de.undercouch.download") apply false
55+
id("org.gradle.test-retry") version "1.2.0"
5556
}
5657

5758
group = "software.aws.toolkits"
@@ -71,6 +72,7 @@ allprojects {
7172
apply(plugin = "com.adarshr.test-logger")
7273
apply(plugin = "java")
7374
apply(plugin = "jacoco")
75+
apply(plugin = "org.gradle.test-retry")
7476

7577
java.sourceCompatibility = JavaVersion.VERSION_1_8
7678
java.targetCompatibility = JavaVersion.VERSION_1_8
@@ -180,6 +182,13 @@ subprojects {
180182
junitXml.isEnabled = true
181183
html.isEnabled = true
182184
}
185+
186+
retry {
187+
failOnPassedAfterRetry.set(false)
188+
// If there are 5 failures, don't even attempt a retry
189+
maxFailures.set(5)
190+
maxRetries.set(2)
191+
}
183192
}
184193

185194
plugins.withType<IdeaPlugin> {

jetbrains-core/src/software/aws/toolkits/jetbrains/core/explorer/DeleteResourceDialog.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ class DeleteResourceDialog(
1919
private val resourceType: String,
2020
private val resourceName: String
2121
) : DialogWrapper(project) {
22-
private val deleteResourceConfirmation = JBTextField().apply { emptyText.text = message("delete_resource.confirmation_text") }
22+
private val deleteResourceConfirmation = JBTextField().apply {
23+
emptyText.text = message("delete_resource.confirmation_text")
24+
accessibleContext.accessibleName = message("general.delete_accessible_name")
25+
}
2326
private val warningIcon = JBLabel(Messages.getWarningIcon())
2427
private val component by lazy {
2528
panel {

resources/resources/software/aws/toolkits/resources/MessagesBundle.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,7 @@ general.configure_button=Configure
426426
general.create_button=Create
427427
general.create_in_progress=Creating...
428428
general.delete=Delete
429+
general.delete_accessible_name=Delete confirmation box
429430
general.execution.canceled=canceled
430431
general.execution.cli_error=Command did not exist successfully, exit code: {0}\n
431432
general.execution.failed=failed

ui-tests/build.gradle.kts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,12 @@ tasks.register<Test>("uiTestCore") {
5656
useJUnitPlatform {
5757
includeTags("core")
5858
}
59+
60+
// uiTestCore needs its own version of this since it's not part of normal test tasks
61+
retry {
62+
failOnPassedAfterRetry.set(false)
63+
// If there are 5 failures, don't even attempt a retry
64+
maxFailures.set(5)
65+
maxRetries.set(2)
66+
}
5967
}

ui-tests/tst/software/aws/toolkits/jetbrains/uitests/fixtures/FixtureExtensions.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ fun ContainerFixture.fillSingleTextField(text: String) = step("Fill single text
2828
find<JTextFieldFixture>(byXpath("//div[@class='JTextField']"), Duration.ofSeconds(5)).text = text
2929
}
3030

31+
fun ContainerFixture.fillDeletionAndConfirm() = step("Fill in delete me and delete") {
32+
find<JTextFieldFixture>(byXpath("//div[@accessiblename='Delete confirmation box']"), Duration.ofSeconds(5)).text = "delete me"
33+
pressOk()
34+
}
35+
3136
// There is no function to write text to this directly :(
3237
fun ContainerFixture.fillSingleJBTextArea(text: String) = step("Fill single JBTextArea with $text") {
3338
find<JTextAreaFixture>(byXpath("//div[@class='JBTextArea']")).click()

ui-tests/tst/software/aws/toolkits/jetbrains/uitests/tests/CloudFormationBrowserTest.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,9 @@ import software.aws.toolkits.jetbrains.uitests.CoreTest
1717
import software.aws.toolkits.jetbrains.uitests.extensions.uiTest
1818
import software.aws.toolkits.jetbrains.uitests.fixtures.IdeaFrame
1919
import software.aws.toolkits.jetbrains.uitests.fixtures.awsExplorer
20-
import software.aws.toolkits.jetbrains.uitests.fixtures.fillAllJBTextFields
20+
import software.aws.toolkits.jetbrains.uitests.fixtures.fillDeletionAndConfirm
2121
import software.aws.toolkits.jetbrains.uitests.fixtures.findAndClick
2222
import software.aws.toolkits.jetbrains.uitests.fixtures.idea
23-
import software.aws.toolkits.jetbrains.uitests.fixtures.pressOk
2423
import software.aws.toolkits.jetbrains.uitests.fixtures.welcomeFrame
2524
import java.nio.file.Path
2625
import java.nio.file.Paths
@@ -91,8 +90,7 @@ class CloudFormationBrowserTest {
9190
openExplorerActionMenu(cloudFormation, stack)
9291
}
9392
findAndClick("//div[@text='$deleteStackText']")
94-
fillAllJBTextFields("delete me")
95-
pressOk()
93+
fillDeletionAndConfirm()
9694
}
9795

9896
waitForStackDeletion()
@@ -107,7 +105,7 @@ class CloudFormationBrowserTest {
107105

108106
@AfterAll
109107
fun cleanup() {
110-
// Make sure that we delete the stack even if it fails in the UIs
108+
log.info("Running final cleanup")
111109
try {
112110
cloudFormationClient.deleteStack { it.stackName(stack) }
113111
waitForStackDeletion()
@@ -124,7 +122,9 @@ class CloudFormationBrowserTest {
124122

125123
private fun waitForStackDeletion() {
126124
log.info("Waiting for the deletion of stack $stack")
127-
cloudFormationClient.waiter().waitUntilStackDeleteComplete { it.stackName(stack) }
125+
if (cloudFormationClient.describeStacks { it.stackName(stack) }.hasStacks()) {
126+
cloudFormationClient.waiter().waitUntilStackDeleteComplete { it.stackName(stack) }
127+
}
128128
log.info("Finished deleting stack $stack")
129129
}
130130
}

ui-tests/tst/software/aws/toolkits/jetbrains/uitests/tests/S3BrowserTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import software.aws.toolkits.jetbrains.uitests.fixtures.actionButton
2828
import software.aws.toolkits.jetbrains.uitests.fixtures.actionMenuItem
2929
import software.aws.toolkits.jetbrains.uitests.fixtures.awsExplorer
3030
import software.aws.toolkits.jetbrains.uitests.fixtures.fileBrowser
31-
import software.aws.toolkits.jetbrains.uitests.fixtures.fillAllJBTextFields
31+
import software.aws.toolkits.jetbrains.uitests.fixtures.fillDeletionAndConfirm
3232
import software.aws.toolkits.jetbrains.uitests.fixtures.fillSingleTextField
3333
import software.aws.toolkits.jetbrains.uitests.fixtures.findAndClick
3434
import software.aws.toolkits.jetbrains.uitests.fixtures.idea
@@ -193,15 +193,15 @@ class S3BrowserTest {
193193
openExplorerActionMenu(S3, bucket)
194194
}
195195
findAndClick("//div[@text='$deleteBucketText']")
196-
fillAllJBTextFields("delete me")
197-
pressOk()
196+
fillDeletionAndConfirm()
198197
waitForS3BucketDeletion()
199198
}
200199
}
201200
}
202201

203202
@AfterAll
204203
fun cleanup() {
204+
log.info("Running final cleanup")
205205
try {
206206
s3Client.deleteBucketAndContents(bucket)
207207
waitForS3BucketDeletion()

ui-tests/tst/software/aws/toolkits/jetbrains/uitests/tests/SQSTest.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,13 @@ import software.aws.toolkits.jetbrains.uitests.fixtures.actionMenuItem
2828
import software.aws.toolkits.jetbrains.uitests.fixtures.awsExplorer
2929
import software.aws.toolkits.jetbrains.uitests.fixtures.dialog
3030
import software.aws.toolkits.jetbrains.uitests.fixtures.fillAllJBTextFields
31+
import software.aws.toolkits.jetbrains.uitests.fixtures.fillDeletionAndConfirm
3132
import software.aws.toolkits.jetbrains.uitests.fixtures.fillSingleJBTextArea
3233
import software.aws.toolkits.jetbrains.uitests.fixtures.fillSingleTextField
3334
import software.aws.toolkits.jetbrains.uitests.fixtures.findAndClick
3435
import software.aws.toolkits.jetbrains.uitests.fixtures.findByXpath
3536
import software.aws.toolkits.jetbrains.uitests.fixtures.idea
3637
import software.aws.toolkits.jetbrains.uitests.fixtures.pressCreate
37-
import software.aws.toolkits.jetbrains.uitests.fixtures.pressOk
3838
import software.aws.toolkits.jetbrains.uitests.fixtures.pressSave
3939
import software.aws.toolkits.jetbrains.uitests.fixtures.pressYes
4040
import software.aws.toolkits.jetbrains.uitests.fixtures.rightClick
@@ -220,17 +220,15 @@ class SQSTest {
220220
openExplorerActionMenu(sqsNodeLabel, queueName)
221221
}
222222
actionMenuItem(deleteQueueText).click()
223-
fillAllJBTextFields("delete me")
224-
pressOk()
223+
fillDeletionAndConfirm()
225224
client.waitForDeletion(queueName)
226225
}
227226
step("Delete queue $fifoQueueName") {
228227
awsExplorer {
229228
openExplorerActionMenu(sqsNodeLabel, fifoQueueName)
230229
}
231230
actionMenuItem(deleteQueueText).click()
232-
fillAllJBTextFields("delete me")
233-
pressOk()
231+
fillDeletionAndConfirm()
234232
client.waitForDeletion(fifoQueueName)
235233
}
236234
}
@@ -240,6 +238,7 @@ class SQSTest {
240238
@AfterAll
241239
// Make sure the two queues and sns topic are deleted, and if not, delete them
242240
fun cleanup() {
241+
log.info("Running final cleanup")
243242
try {
244243
SqsClient.create().use { client ->
245244
client.verifyDeleted(queueName)

0 commit comments

Comments
 (0)