-
Notifications
You must be signed in to change notification settings - Fork 46
Run e2e tests on each PR. #584
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
f7bf07c
d8ccc3d
b8a4c8c
ff461f9
38cefad
d9c3601
9782ab0
ff9372d
7896e48
7c9476d
9daf17b
85d6083
1d35ac3
61fb775
ab9e2df
a3819c0
f4a0311
bbb5512
7813992
f5acbac
fba2869
82b3ee1
e7781e9
5505b6c
b536706
91a8afa
f60afb2
612e63b
02c4578
3f5bc43
fe77f31
ba03172
0fb0007
1256e10
27430d2
b164380
0497bf0
5a879f7
879eb75
ab18312
757a13b
bdce942
c1cfa8f
efa4ff5
d1e8c55
a5571f1
e261dcd
19d2fc3
b34d4b2
1374828
c38abb1
7f29f71
eb787a1
5cd891f
658ad5e
392c594
4776625
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,8 +1,11 @@ | ||
| {{- $e2e_region := "us-west-2" -}} | ||
|
|
||
| stages: | ||
| - build | ||
| - test | ||
| - sign | ||
| - publish | ||
| - e2e | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
|
|
||
| .python-before-script: &python-before-script | ||
| - pip install virtualenv | ||
|
|
@@ -56,11 +59,11 @@ check-layer-size ({{ $runtime.name }}-{{ $runtime.arch }}): | |
| stage: test | ||
| tags: ["arch:amd64"] | ||
| image: registry.ddbuild.io/images/docker:20.10 | ||
| needs: | ||
| needs: | ||
| - build-layer ({{ $runtime.name }}-{{ $runtime.arch }}) | ||
| dependencies: | ||
| - build-layer ({{ $runtime.name }}-{{ $runtime.arch }}) | ||
| script: | ||
| script: | ||
| - PYTHON_VERSION={{ $runtime.python_version }} ARCH={{ $runtime.arch }} ./scripts/check_layer_size.sh | ||
|
|
||
| lint python: | ||
|
|
@@ -69,7 +72,7 @@ lint python: | |
| image: registry.ddbuild.io/images/mirror/python:{{ $runtime.image }} | ||
| cache: &{{ $runtime.name }}-{{ $runtime.arch }}-cache | ||
| before_script: *python-before-script | ||
| script: | ||
| script: | ||
| - source venv/bin/activate | ||
| - ./scripts/check_format.sh | ||
|
|
||
|
|
@@ -79,15 +82,15 @@ unit-test ({{ $runtime.name }}-{{ $runtime.arch }}): | |
| image: registry.ddbuild.io/images/mirror/python:{{ $runtime.image }} | ||
| cache: &{{ $runtime.name }}-{{ $runtime.arch }}-cache | ||
| before_script: *python-before-script | ||
| script: | ||
| script: | ||
| - source venv/bin/activate | ||
| - pytest -vv | ||
|
|
||
| integration-test ({{ $runtime.name }}-{{ $runtime.arch }}): | ||
| stage: test | ||
| tags: ["arch:amd64"] | ||
| image: registry.ddbuild.io/images/docker:20.10-py3 | ||
| needs: | ||
| needs: | ||
| - build-layer ({{ $runtime.name }}-{{ $runtime.arch }}) | ||
| dependencies: | ||
| - build-layer ({{ $runtime.name }}-{{ $runtime.arch }}) | ||
|
|
@@ -132,16 +135,22 @@ sign-layer ({{ $runtime.name }}-{{ $runtime.arch }}): | |
| - LAYER_FILE=datadog_lambda_py-{{ $runtime.arch}}-{{ $runtime.python_version }}.zip ./scripts/sign_layers.sh prod | ||
|
|
||
| {{ range $environment_name, $environment := (ds "environments").environments }} | ||
| {{ $dotenv := print $runtime.name "_" $runtime.arch "_" $environment_name ".env" }} | ||
|
|
||
| publish-layer-{{ $environment_name }} ({{ $runtime.name }}-{{ $runtime.arch }}): | ||
| stage: publish | ||
| tags: ["arch:amd64"] | ||
| image: registry.ddbuild.io/images/docker:20.10-py3 | ||
| rules: | ||
| - if: '"{{ $environment_name }}" == "sandbox" && $REGION == "{{ $e2e_region }}" && "{{ $runtime.arch }}" == "amd64"' | ||
| when: on_success | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Always be sure to publish to the sandbox account in us-west-2 for e2e testing. |
||
| - if: '"{{ $environment_name }}" == "sandbox"' | ||
| when: manual | ||
| allow_failure: true | ||
| - if: '$CI_COMMIT_TAG =~ /^v.*/' | ||
| artifacts: | ||
| reports: | ||
| dotenv: {{ $dotenv }} | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. When saved as a dotenv report, this file will get sourced for its env vars in every downstream job. |
||
| needs: | ||
| {{ if or (eq $environment_name "prod") }} | ||
| - sign-layer ({{ $runtime.name }}-{{ $runtime.arch}}) | ||
|
|
@@ -166,7 +175,7 @@ publish-layer-{{ $environment_name }} ({{ $runtime.name }}-{{ $runtime.arch }}): | |
| before_script: | ||
| - EXTERNAL_ID_NAME={{ $environment.external_id }} ROLE_TO_ASSUME={{ $environment.role_to_assume }} AWS_ACCOUNT={{ $environment.account }} source ./ci/get_secrets.sh | ||
| script: | ||
| - STAGE={{ $environment_name }} PYTHON_VERSION={{ $runtime.python_version }} ARCH={{ $runtime.arch }} ./ci/publish_layers.sh | ||
| - STAGE={{ $environment_name }} PYTHON_VERSION={{ $runtime.python_version }} ARCH={{ $runtime.arch }} DOTENV={{ $dotenv }} ./ci/publish_layers.sh | ||
|
|
||
| {{- end }} | ||
|
|
||
|
|
@@ -232,3 +241,56 @@ signed layer bundle: | |
| - rm -rf datadog_lambda_py-signed-bundle-${CI_JOB_ID} | ||
| - mkdir -p datadog_lambda_py-signed-bundle-${CI_JOB_ID} | ||
| - cp .layers/datadog_lambda_py-*.zip datadog_lambda_py-signed-bundle-${CI_JOB_ID} | ||
|
|
||
| e2e-test: | ||
| stage: e2e | ||
| trigger: | ||
| project: DataDog/serverless-e2e-tests | ||
| strategy: depend | ||
| variables: | ||
| LANGUAGES_SUBSET: python | ||
| # These env vars are inherited from the dotenv reports of the publish-layer jobs | ||
| {{- range (ds "runtimes").runtimes }} | ||
| {{- if eq .arch "amd64" }} | ||
| {{- $version := print (.name | strings.Trim "python") }} | ||
| PYTHON_{{ $version }}_VERSION: $PYTHON_{{ $version }}_VERSION | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Explicitly pass environment variables from the sourced publish job dotenv file to the downstream job. These env vars are not passed downstream otherwise. |
||
| {{- end }} | ||
| {{- end }} | ||
| needs: {{ range (ds "runtimes").runtimes }} | ||
| {{- if eq .arch "amd64" }} | ||
| - "publish-layer-sandbox ({{ .name }}-{{ .arch }}): [{{ $e2e_region }}]" | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Run after all the publish jobs have completed. |
||
| {{- end }} | ||
| {{- end }} | ||
|
|
||
| e2e-test-status: | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This |
||
| stage: e2e | ||
| image: registry.ddbuild.io/images/docker:20.10-py3 | ||
| tags: ["arch:amd64"] | ||
| timeout: 3h | ||
| script: | | ||
| 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) | ||
| URL="${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/pipelines/${CI_PIPELINE_ID}/bridges" | ||
| echo "Fetching E2E job status from: $URL" | ||
| while true; do | ||
| RESPONSE=$(curl -s --header "PRIVATE-TOKEN: ${GITLAB_API_TOKEN}" "$URL") | ||
| E2E_JOB_STATUS=$(echo "$RESPONSE" | jq -r '.[] | select(.name=="e2e-test") | .downstream_pipeline.status') | ||
| echo -n "E2E job status: $E2E_JOB_STATUS, " | ||
| if [ "$E2E_JOB_STATUS" == "success" ]; then | ||
| echo "✅ E2E tests completed successfully" | ||
| exit 0 | ||
| elif [ "$E2E_JOB_STATUS" == "failed" ]; then | ||
| echo "❌ E2E tests failed" | ||
| exit 1 | ||
| elif [ "$E2E_JOB_STATUS" == "running" ]; then | ||
| echo "⏳ E2E tests are still running, retrying in 1 minute..." | ||
| elif [ "$E2E_JOB_STATUS" == "canceled" ]; then | ||
| echo "🚫 E2E tests were canceled" | ||
| exit 1 | ||
| elif [ "$E2E_JOB_STATUS" == "skipped" ]; then | ||
| echo "⏭️ E2E tests were skipped" | ||
| exit 0 | ||
| else | ||
| echo "❓ Unknown E2E test status: $E2E_JOB_STATUS, retrying in 1 minute..." | ||
| fi | ||
| sleep 60 | ||
| done | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -199,6 +199,8 @@ fi | |
| while [ $latest_version -lt $VERSION ]; do | ||
| latest_version=$(publish_layer $REGION $layer $aws_cli_python_version_key $layer_path) | ||
| printf "[$REGION] Published version $latest_version for layer $layer in region $REGION\n" | ||
| latest_arn=$(aws lambda get-layer-version --layer-name $layer --version-number $latest_version --region $REGION --query 'LayerVersionArn' --output text) | ||
| printf "[$REGION] Published arn $latest_arn\n" | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Be sur to always print the arn to stdout when publishing layers. The publish gitlab jobs will do a regex search on this stdout to determine the arn for a newly published layer.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Update, the publish gitlab job will not be doing a regex search. Instead we will write the layer versions to a dotenv file, as seen below. |
||
|
|
||
| # This shouldn't happen unless someone manually deleted the latest version, say 28, and | ||
| # then tries to republish 28 again. The published version would actually be 29, because | ||
|
|
@@ -209,4 +211,10 @@ while [ $latest_version -lt $VERSION ]; do | |
| fi | ||
| done | ||
|
|
||
| if [ -n "$DOTENV" ]; then | ||
| printf "[$REGION] Exporting layer version to $DOTENV file...\n" | ||
| echo "PYTHON_${PYTHON_VERSION/./}_VERSION=$latest_arn" >> "$DOTENV" | ||
| cat "$DOTENV" | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Here is where we write the arn to the given dotenv file. This dotenv file will be saved as an artifact on the job. |
||
| fi | ||
|
|
||
| printf "[$REGION] Finished publishing layers...\n\n" | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this a variable declaration? If so, why not use an environment variable?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, it is just a variable declaration. I hadn't thought of just using an environment variable. I was thinking that this way, the value is just built into the final yaml file, instead of being resolved later, at ci execution time. What are your thoughts on that?
Ah, okay, so one of the places this variable is used is in a
needsblock. According to gitlab docs, variables are not available inneedsblocks.