Skip to content

Commit bddae31

Browse files
authored
chore(ci): add GH workflow for service check batch and e2e tests (#713)
1 parent ce00884 commit bddae31

File tree

7 files changed

+150
-56
lines changed

7 files changed

+150
-56
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#!/bin/bash
2+
3+
error_exit() {
4+
echo "$1" 1>&2
5+
exit 1
6+
}
7+
8+
PROJECT_NAME=$1
9+
# get the source version to be built (defaults to main branch if not specified)
10+
SOURCE_VERSION=${2:-main}
11+
12+
echo "Starting CodeBuild project ${PROJECT_NAME}"
13+
14+
# dump all GITHUB_* environment variables to file and pass to start job
15+
jq -n 'env | to_entries | [.[] | select(.key | startswith("GITHUB_"))] | [.[] | {name: .key, value:.value, type:"PLAINTEXT"}]' >/tmp/gh_env_vars.json
16+
17+
START_RESULT=$(
18+
aws codebuild start-build-batch \
19+
--project-name ${PROJECT_NAME} \
20+
--source-version $SOURCE_VERSION \
21+
--environment-variables-override file:///tmp/gh_env_vars.json
22+
)
23+
24+
if [ "$?" != "0" ]; then
25+
echo "Start result was: $START_RESULT"
26+
error_exit "Could not start project. Exiting."
27+
else
28+
echo "Build started successfully."
29+
fi
30+
31+
BUILD_ID=$(echo ${START_RESULT} | jq '.buildBatch.id' -r)
32+
echo "Build id $BUILD_ID"
33+
34+
BUILD_STATUS="IN_PROGRESS"
35+
while [ "$BUILD_STATUS" == "IN_PROGRESS" ]; do
36+
echo "Checking build status."
37+
BUILD=$(aws codebuild batch-get-build-batches --ids ${BUILD_ID})
38+
BUILD_STATUS=$(echo $BUILD | jq '.buildBatches[0].buildBatchStatus' -r)
39+
40+
JOBS=$(echo $BUILD | jq '.buildBatches[0].buildGroups | [.[] | {identifier: .identifier, status: .currentBuildSummary.buildStatus} | select(.identifier | startswith("JOB"))]')
41+
TOTAL_JOBS=$(echo $JOBS | jq 'length')
42+
43+
SUCCEEDED_CNT=$(echo $JOBS | jq '[.[] | select(.status == "SUCCEEDED")] | length')
44+
IN_PROGRESS_CNT=$(echo $JOBS | jq '[.[] | select(.status == "IN_PROGRESS")] | length')
45+
46+
FAILED_CNT=$(($TOTAL_JOBS - $SUCCEEDED_CNT - $IN_PROGRESS_CNT))
47+
48+
if [ "$BUILD_STATUS" == "IN_PROGRESS" ]; then
49+
echo "Build is still in progress (failed=$FAILED_CNT; in_progress=$IN_PROGRESS_CNT; succeeded=$SUCCEEDED_CNT; total=$TOTAL_JOBS), waiting..."
50+
51+
fi
52+
sleep 10
53+
done
54+
55+
if [ "$BUILD_STATUS" != "SUCCEEDED" ]; then
56+
BUILD=$(aws codebuild batch-get-build-batches --ids ${BUILD_ID})
57+
FAILED_BUILDS=$(echo $BUILD | jq '.buildBatches[0].buildGroups | [.[] | {identifier: .identifier, status: .currentBuildSummary.buildStatus} | select(.status == "FAILED")]')
58+
echo "Failed builds in batch"
59+
echo $FAILED_BUILDS
60+
error_exit "Build failed, please review job output"
61+
else
62+
echo "Build succeeded."
63+
fi

.github/workflows/codebuild-ci.yml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
name: AWS CodeBuild CI
2+
3+
on:
4+
pull_request:
5+
branches:
6+
- main
7+
workflow_dispatch:
8+
9+
permissions:
10+
id-token: write
11+
12+
jobs:
13+
e2e-tests:
14+
runs-on: ubuntu-latest
15+
steps:
16+
- name: Configure AWS Credentials
17+
uses: aws-actions/configure-aws-credentials@v1
18+
with:
19+
role-to-assume: ${{ secrets.CI_AWS_ROLE_ARN }}
20+
aws-region: us-west-2
21+
- name: Run E2E Tests
22+
uses: aws-actions/aws-codebuild-run-build@v1
23+
with:
24+
project-name: gh-aws-sdk-kotlin-e2e-tests
25+
26+
service-check-batch:
27+
runs-on: ubuntu-latest
28+
steps:
29+
- name: Checkout sources
30+
uses: actions/checkout@v2
31+
- name: Configure AWS Credentials
32+
uses: aws-actions/configure-aws-credentials@v1
33+
with:
34+
role-to-assume: ${{ secrets.CI_AWS_ROLE_ARN }}
35+
aws-region: us-west-2
36+
- name: Run Service Check Batch
37+
run: |
38+
.github/scripts/runCodeBuildBatchJob.sh gh-aws-sdk-kotlin-svc-check-batch ${{ github.event.pull_request.head.sha }}

services/s3/e2eTest/src/S3IntegrationTest.kt

Lines changed: 44 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,8 @@ import kotlin.time.ExperimentalTime
3535
@OptIn(ExperimentalTime::class, ExperimentalCoroutinesApi::class)
3636
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
3737
class S3BucketOpsIntegrationTest {
38-
companion object {
39-
const val DEFAULT_REGION = "us-east-2"
40-
}
41-
4238
private val client = S3Client {
43-
region = DEFAULT_REGION
39+
region = S3TestUtils.DEFAULT_REGION
4440
}
4541

4642
private lateinit var testBucket: String
@@ -216,58 +212,56 @@ class S3BucketOpsIntegrationTest {
216212

217213
@Test
218214
fun testSelectObjectEventStream(): Unit = runBlocking {
219-
S3Client.fromEnvironment().use { s3 ->
220-
// upload our content to select from
221-
val objKey = "developers.csv"
222-
223-
val content = """
224-
Name,PhoneNumber,City,Occupation
225-
Sam,(949) 555-6701,Irvine,Solutions Architect
226-
Vinod,(949) 555-6702,Los Angeles,Solutions Architect
227-
Jeff,(949) 555-6703,Seattle,AWS Evangelist
228-
Jane,(949) 555-6704,Chicago,Developer
229-
Sean,(949) 555-6705,Indianapolis,Developer
230-
Mary,(949) 555-6706,Detroit,Developer
231-
Kate,(949) 555-6707,Boston,Solutions Architect
232-
""".trimIndent()
215+
// upload our content to select from
216+
val objKey = "developers.csv"
217+
218+
val content = """
219+
Name,PhoneNumber,City,Occupation
220+
Sam,(949) 555-6701,Irvine,Solutions Architect
221+
Vinod,(949) 555-6702,Los Angeles,Solutions Architect
222+
Jeff,(949) 555-6703,Seattle,AWS Evangelist
223+
Jane,(949) 555-6704,Chicago,Developer
224+
Sean,(949) 555-6705,Indianapolis,Developer
225+
Mary,(949) 555-6706,Detroit,Developer
226+
Kate,(949) 555-6707,Boston,Solutions Architect
227+
""".trimIndent()
233228

234-
s3.putObject {
235-
bucket = testBucket
236-
key = objKey
237-
body = ByteStream.fromString(content)
238-
}
229+
client.putObject {
230+
bucket = testBucket
231+
key = objKey
232+
body = ByteStream.fromString(content)
233+
}
239234

240-
// select content as an event stream
241-
val req = SelectObjectContentRequest {
242-
bucket = testBucket
243-
key = objKey
244-
expressionType = ExpressionType.Sql
245-
expression = """SELECT * FROM s3object s where s."Name" = 'Jane'"""
246-
inputSerialization {
247-
csv {
248-
fileHeaderInfo = FileHeaderInfo.Use
249-
}
250-
compressionType = CompressionType.None
251-
}
252-
outputSerialization {
253-
csv { }
235+
// select content as an event stream
236+
val req = SelectObjectContentRequest {
237+
bucket = testBucket
238+
key = objKey
239+
expressionType = ExpressionType.Sql
240+
expression = """SELECT * FROM s3object s where s."Name" = 'Jane'"""
241+
inputSerialization {
242+
csv {
243+
fileHeaderInfo = FileHeaderInfo.Use
254244
}
245+
compressionType = CompressionType.None
255246
}
256-
257-
val events = s3.selectObjectContent(req) { resp ->
258-
// collect flow to list
259-
resp.payload!!.toList()
247+
outputSerialization {
248+
csv { }
260249
}
250+
}
261251

262-
assertEquals(3, events.size)
252+
val events = client.selectObjectContent(req) { resp ->
253+
// collect flow to list
254+
resp.payload!!.toList()
255+
}
263256

264-
val records = assertIs<SelectObjectContentEventStream.Records>(events[0])
265-
assertIs<SelectObjectContentEventStream.Stats>(events[1])
266-
assertIs<SelectObjectContentEventStream.End>(events[2])
257+
assertEquals(3, events.size)
267258

268-
val expectedRecord = "Jane,(949) 555-6704,Chicago,Developer\n"
269-
assertEquals(expectedRecord, records.value.payload?.decodeToString())
270-
}
259+
val records = assertIs<SelectObjectContentEventStream.Records>(events[0])
260+
assertIs<SelectObjectContentEventStream.Stats>(events[1])
261+
assertIs<SelectObjectContentEventStream.End>(events[2])
262+
263+
val expectedRecord = "Jane,(949) 555-6704,Chicago,Developer\n"
264+
assertEquals(expectedRecord, records.value.payload?.decodeToString())
271265
}
272266
}
273267

@@ -280,7 +274,7 @@ private fun File.chunk(partSize: Int): Sequence<LongRange> =
280274
internal suspend fun s3WithAllEngines(block: suspend (S3Client) -> Unit) {
281275
withAllEngines { engine ->
282276
S3Client {
283-
region = S3BucketOpsIntegrationTest.DEFAULT_REGION
277+
region = S3TestUtils.DEFAULT_REGION
284278
httpClientEngine = engine
285279
}.use {
286280
try {

services/s3/e2eTest/src/S3PresignerTest.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,9 @@ import kotlin.time.Duration.Companion.seconds
2121
@OptIn(ExperimentalCoroutinesApi::class)
2222
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
2323
class S3PresignerTest {
24-
companion object {
25-
const val DEFAULT_REGION = "us-east-2"
26-
}
2724

2825
private val client = S3Client {
29-
region = DEFAULT_REGION
26+
region = S3TestUtils.DEFAULT_REGION
3027
}
3128

3229
private lateinit var testBucket: String

services/s3/e2eTest/src/S3TestUtils.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import kotlin.time.Duration.Companion.seconds
2626

2727
object S3TestUtils {
2828

29+
const val DEFAULT_REGION = "us-west-2"
30+
2931
private const val TEST_BUCKET_PREFIX = "s3-test-bucket-"
3032

3133
suspend fun getTestBucket(client: S3Client): String = getBucketWithPrefix(client, TEST_BUCKET_PREFIX)

services/sts/e2eTest/src/STSPresignerTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class StsPresignerTest {
2121

2222
@Test
2323
fun testGetCallerIdentityPresigner() = runBlocking {
24-
val c = StsClient { region = "us-east-2" }
24+
val c = StsClient { region = "us-west-2" }
2525
val req = GetCallerIdentityRequest { }
2626
val presignedRequest = req.presign(c.config, 60.seconds)
2727

services/transcribestreaming/e2eTest/src/TranscribeStreamingIntegrationTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class TranscribeStreamingIntegrationTest {
2626
val url = this::class.java.classLoader.getResource("hello-kotlin-8000.wav") ?: error("failed to load test resource")
2727
val audioFile = Paths.get(url.toURI()).toFile()
2828

29-
TranscribeStreamingClient { region = "us-east-2" }.use { client ->
29+
TranscribeStreamingClient { region = "us-west-2" }.use { client ->
3030
val transcript = getTranscript(client, audioFile)
3131
assertTrue(transcript.startsWith("Hello from", true), "full transcript: $transcript")
3232
}

0 commit comments

Comments
 (0)