Skip to content

Commit 6c296ab

Browse files
authored
Run e2e tests on each PR. (#584)
1 parent 2163fb4 commit 6c296ab

File tree

2 files changed

+76
-6
lines changed

2 files changed

+76
-6
lines changed

ci/input_files/build.yaml.tpl

Lines changed: 68 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
{{- $e2e_region := "us-west-2" -}}
2+
13
stages:
24
- build
35
- test
46
- sign
57
- publish
8+
- e2e
69

710
.python-before-script: &python-before-script
811
- pip install virtualenv
@@ -56,11 +59,11 @@ check-layer-size ({{ $runtime.name }}-{{ $runtime.arch }}):
5659
stage: test
5760
tags: ["arch:amd64"]
5861
image: registry.ddbuild.io/images/docker:20.10
59-
needs:
62+
needs:
6063
- build-layer ({{ $runtime.name }}-{{ $runtime.arch }})
6164
dependencies:
6265
- build-layer ({{ $runtime.name }}-{{ $runtime.arch }})
63-
script:
66+
script:
6467
- PYTHON_VERSION={{ $runtime.python_version }} ARCH={{ $runtime.arch }} ./scripts/check_layer_size.sh
6568

6669
lint python:
@@ -69,7 +72,7 @@ lint python:
6972
image: registry.ddbuild.io/images/mirror/python:{{ $runtime.image }}
7073
cache: &{{ $runtime.name }}-{{ $runtime.arch }}-cache
7174
before_script: *python-before-script
72-
script:
75+
script:
7376
- source venv/bin/activate
7477
- ./scripts/check_format.sh
7578

@@ -79,15 +82,15 @@ unit-test ({{ $runtime.name }}-{{ $runtime.arch }}):
7982
image: registry.ddbuild.io/images/mirror/python:{{ $runtime.image }}
8083
cache: &{{ $runtime.name }}-{{ $runtime.arch }}-cache
8184
before_script: *python-before-script
82-
script:
85+
script:
8386
- source venv/bin/activate
8487
- pytest -vv
8588

8689
integration-test ({{ $runtime.name }}-{{ $runtime.arch }}):
8790
stage: test
8891
tags: ["arch:amd64"]
8992
image: registry.ddbuild.io/images/docker:20.10-py3
90-
needs:
93+
needs:
9194
- build-layer ({{ $runtime.name }}-{{ $runtime.arch }})
9295
dependencies:
9396
- build-layer ({{ $runtime.name }}-{{ $runtime.arch }})
@@ -132,16 +135,22 @@ sign-layer ({{ $runtime.name }}-{{ $runtime.arch }}):
132135
- LAYER_FILE=datadog_lambda_py-{{ $runtime.arch}}-{{ $runtime.python_version }}.zip ./scripts/sign_layers.sh prod
133136

134137
{{ range $environment_name, $environment := (ds "environments").environments }}
138+
{{ $dotenv := print $runtime.name "_" $runtime.arch "_" $environment_name ".env" }}
135139

136140
publish-layer-{{ $environment_name }} ({{ $runtime.name }}-{{ $runtime.arch }}):
137141
stage: publish
138142
tags: ["arch:amd64"]
139143
image: registry.ddbuild.io/images/docker:20.10-py3
140144
rules:
145+
- if: '"{{ $environment_name }}" == "sandbox" && $REGION == "{{ $e2e_region }}" && "{{ $runtime.arch }}" == "amd64"'
146+
when: on_success
141147
- if: '"{{ $environment_name }}" == "sandbox"'
142148
when: manual
143149
allow_failure: true
144150
- if: '$CI_COMMIT_TAG =~ /^v.*/'
151+
artifacts:
152+
reports:
153+
dotenv: {{ $dotenv }}
145154
needs:
146155
{{ if or (eq $environment_name "prod") }}
147156
- sign-layer ({{ $runtime.name }}-{{ $runtime.arch}})
@@ -166,7 +175,7 @@ publish-layer-{{ $environment_name }} ({{ $runtime.name }}-{{ $runtime.arch }}):
166175
before_script:
167176
- EXTERNAL_ID_NAME={{ $environment.external_id }} ROLE_TO_ASSUME={{ $environment.role_to_assume }} AWS_ACCOUNT={{ $environment.account }} source ./ci/get_secrets.sh
168177
script:
169-
- STAGE={{ $environment_name }} PYTHON_VERSION={{ $runtime.python_version }} ARCH={{ $runtime.arch }} ./ci/publish_layers.sh
178+
- STAGE={{ $environment_name }} PYTHON_VERSION={{ $runtime.python_version }} ARCH={{ $runtime.arch }} DOTENV={{ $dotenv }} ./ci/publish_layers.sh
170179

171180
{{- end }}
172181

@@ -232,3 +241,56 @@ signed layer bundle:
232241
- rm -rf datadog_lambda_py-signed-bundle-${CI_JOB_ID}
233242
- mkdir -p datadog_lambda_py-signed-bundle-${CI_JOB_ID}
234243
- cp .layers/datadog_lambda_py-*.zip datadog_lambda_py-signed-bundle-${CI_JOB_ID}
244+
245+
e2e-test:
246+
stage: e2e
247+
trigger:
248+
project: DataDog/serverless-e2e-tests
249+
strategy: depend
250+
variables:
251+
LANGUAGES_SUBSET: python
252+
# These env vars are inherited from the dotenv reports of the publish-layer jobs
253+
{{- range (ds "runtimes").runtimes }}
254+
{{- if eq .arch "amd64" }}
255+
{{- $version := print (.name | strings.Trim "python") }}
256+
PYTHON_{{ $version }}_VERSION: $PYTHON_{{ $version }}_VERSION
257+
{{- end }}
258+
{{- end }}
259+
needs: {{ range (ds "runtimes").runtimes }}
260+
{{- if eq .arch "amd64" }}
261+
- "publish-layer-sandbox ({{ .name }}-{{ .arch }}): [{{ $e2e_region }}]"
262+
{{- end }}
263+
{{- end }}
264+
265+
e2e-test-status:
266+
stage: e2e
267+
image: registry.ddbuild.io/images/docker:20.10-py3
268+
tags: ["arch:amd64"]
269+
timeout: 3h
270+
script: |
271+
GITLAB_API_TOKEN=$(aws ssm get-parameter --region us-east-1 --name "ci.${CI_PROJECT_NAME}.serverless-e2e-gitlab-token" --with-decryption --query "Parameter.Value" --out text)
272+
URL="${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/pipelines/${CI_PIPELINE_ID}/bridges"
273+
echo "Fetching E2E job status from: $URL"
274+
while true; do
275+
RESPONSE=$(curl -s --header "PRIVATE-TOKEN: ${GITLAB_API_TOKEN}" "$URL")
276+
E2E_JOB_STATUS=$(echo "$RESPONSE" | jq -r '.[] | select(.name=="e2e-test") | .downstream_pipeline.status')
277+
echo -n "E2E job status: $E2E_JOB_STATUS, "
278+
if [ "$E2E_JOB_STATUS" == "success" ]; then
279+
echo "✅ E2E tests completed successfully"
280+
exit 0
281+
elif [ "$E2E_JOB_STATUS" == "failed" ]; then
282+
echo "❌ E2E tests failed"
283+
exit 1
284+
elif [ "$E2E_JOB_STATUS" == "running" ]; then
285+
echo "⏳ E2E tests are still running, retrying in 1 minute..."
286+
elif [ "$E2E_JOB_STATUS" == "canceled" ]; then
287+
echo "🚫 E2E tests were canceled"
288+
exit 1
289+
elif [ "$E2E_JOB_STATUS" == "skipped" ]; then
290+
echo "⏭️ E2E tests were skipped"
291+
exit 0
292+
else
293+
echo "❓ Unknown E2E test status: $E2E_JOB_STATUS, retrying in 1 minute..."
294+
fi
295+
sleep 60
296+
done

ci/publish_layers.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,8 @@ fi
199199
while [ $latest_version -lt $VERSION ]; do
200200
latest_version=$(publish_layer $REGION $layer $aws_cli_python_version_key $layer_path)
201201
printf "[$REGION] Published version $latest_version for layer $layer in region $REGION\n"
202+
latest_arn=$(aws lambda get-layer-version --layer-name $layer --version-number $latest_version --region $REGION --query 'LayerVersionArn' --output text)
203+
printf "[$REGION] Published arn $latest_arn\n"
202204

203205
# This shouldn't happen unless someone manually deleted the latest version, say 28, and
204206
# then tries to republish 28 again. The published version would actually be 29, because
@@ -209,4 +211,10 @@ while [ $latest_version -lt $VERSION ]; do
209211
fi
210212
done
211213

214+
if [ -n "$DOTENV" ]; then
215+
printf "[$REGION] Exporting layer version to $DOTENV file...\n"
216+
echo "PYTHON_${PYTHON_VERSION/./}_VERSION=$latest_arn" >> "$DOTENV"
217+
cat "$DOTENV"
218+
fi
219+
212220
printf "[$REGION] Finished publishing layers...\n\n"

0 commit comments

Comments
 (0)