@hyperlane-xyz/core
Version:
Core solidity contracts for Hyperlane
739 lines (700 loc) • 36.4 kB
YAML
# This is a reusable workflow that runs E2E tests for Chainlink.
# It is not meant to be run on its own.
name: Run E2E Tests
on:
workflow_call:
inputs:
chainlink_version:
description: 'Enter Chainlink version to use for the tests. Example: "v2.10.0" or sha'
required: false
type: string
test_ids:
description: 'Run tests by test ids separated by commas. Example: "run_all_in_ocr_tests_go,run_TestOCRv2Request_in_ocr2_test_go". Check all test IDs in .github/e2e-tests.yml'
required: false
type: string
test_list:
description: 'Base64 encoded list of tests (YML objects) to run. Example in run-automation-ondemand-e2e-tests.yml'
required: false
type: string
test_workflow:
description: 'Run tests by workflow name. Example: "Run Nightly E2E Tests"'
required: false
type: string
# TODO: Uncomment once Test Config does not have any secrets. Related ticket https://smartcontract-it.atlassian.net/browse/TT-1392
# test_config_override_base64:
# required: false
# description: The base64-encoded test config override
# type: string
enable_check_test_configurations:
description: 'Set to "true" to enable check-test-configurations job'
required: false
type: boolean
default: false
with_existing_remote_runner_version:
description: 'Use the existing remote runner version for k8s tests. Example: "d3bf5044af33e08be788a2df31c4a745cf69d787"'
required: false
type: string
require_chainlink_image_versions_in_qa_ecr:
description: 'Check Chainlink image versions to be present in QA ECR. If not, build and push the image to QA ECR. Takes comma separated list of Chainlink image versions. Example: "5733cdcda9a9fc6da6343798b119b2ae136146cd,0b7d2c497a508efa5a827714780d908b7b8eda19"'
required: false
type: string
require_chainlink_plugin_versions_in_qa_ecr:
description: 'Check Chainlink plugins versions to be present in QA ECR. If not, build and push the image to QA ECR. Takes comma separated list of Chainlink image versions. Example: "5733cdcda9a9fc6da6343798b119b2ae136146cd,0b7d2c497a508efa5a827714780d908b7b8eda19"'
required: false
type: string
slack_notification_after_tests:
description: 'Set to "true" to send a slack notification after the tests'
required: false
type: boolean
default: false
slack_notification_after_tests_channel_id:
description: 'Slack channel ID to send the notification to'
required: false
type: string
slack_notification_after_tests_name:
description: 'Name of the slack notification'
required: false
type: string
test_log_upload_on_failure:
description: 'Set to "true" to upload the test log on failure as Github artifact'
required: false
type: boolean
default: false
test_log_upload_retention_days:
description: 'Number of days to retain the test log. Default is 3 days'
required: false
type: number
default: 3
secrets:
TEST_SECRETS_OVERRIDE_BASE64:
required: false
QA_AWS_REGION:
required: true
QA_AWS_ROLE_TO_ASSUME:
required: true
QA_AWS_ACCOUNT_NUMBER:
required: true
QA_PYROSCOPE_INSTANCE:
required: true
QA_PYROSCOPE_KEY:
required: true
QA_KUBECONFIG:
required: true
GRAFANA_INTERNAL_TENANT_ID:
required: true
GRAFANA_INTERNAL_BASIC_AUTH:
required: true
GRAFANA_INTERNAL_HOST:
required: true
GRAFANA_INTERNAL_URL_SHORTENER_TOKEN:
required: true
GH_TOKEN:
required: true
AWS_REGION:
required: true
AWS_OIDC_IAM_ROLE_VALIDATION_PROD_ARN:
required: true
AWS_API_GW_HOST_GRAFANA:
required: true
SLACK_BOT_TOKEN:
required: false
env:
CHAINLINK_IMAGE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink
QA_CHAINLINK_IMAGE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink
GITHUB_SHA_PLUGINS: ${{ github.sha }}-plugins
CHAINLINK_ENV_USER: ${{ github.actor }}
CHAINLINK_COMMIT_SHA: ${{ inputs.evm-ref || github.sha }}
SELECTED_NETWORKS: SIMULATED
MOD_CACHE_VERSION: 1
TEST_LOG_LEVEL: debug
jobs:
validate-inputs:
name: Validate workflow inputs
runs-on: ubuntu-latest
outputs:
require_chainlink_image_versions_in_qa_ecr_matrix: ${{ steps.set-required-chainlink-image-versions-matrix.outputs.versions }}
require_chainlink_plugin_versions_in_qa_ecr_matrix: ${{ steps.set-required-chainlink-plugin-versions-matrix.outputs.versions }}
steps:
- name: Check input conditions
run: |
if [[ "${{ inputs.test_ids }}" != "" && "${{ inputs.test_workflow }}" != "" ]]; then
echo "::error::Error: Both 'test_ids' and 'test_workflow' are provided. Please specify only one."
exit 1
fi
if [[ "${{ secrets.TEST_SECRETS_OVERRIDE_BASE64 }}" != "" ]]; then
echo "Will run tests with custom test secrets"
fi
- name: Install jq
run: sudo apt-get install jq
- name: Create matrix for required Chainlink image versions
id: set-required-chainlink-image-versions-matrix
run: |
if [[ "${{ inputs.require_chainlink_image_versions_in_qa_ecr }}" != '' ]]; then
image_versions=$(echo "${{ inputs.require_chainlink_image_versions_in_qa_ecr }}" | jq -Rc 'split(",") | if . == [""] then [] else . end')
echo "versions=$image_versions" >> $GITHUB_OUTPUT
fi
- name: Create matrix for required Chainlink plugin versions
id: set-required-chainlink-plugin-versions-matrix
run: |
if [[ "${{ inputs.require_chainlink_plugin_versions_in_qa_ecr }}" != '' ]]; then
image_versions=$(echo "${{ inputs.require_chainlink_plugin_versions_in_qa_ecr }}" | jq -Rc 'split(",") | if . == [""] then [] else . end')
echo "versions=$image_versions" >> $GITHUB_OUTPUT
fi
check-test-configurations:
name: Check test configurations
if: ${{ inputs.enable_check_test_configurations }}
needs: validate-inputs
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
- name: Setup Go
uses: ./.github/actions/setup-go
- name: Run Check Tests Command
run: |
cd integration-tests/
if ! go run citool/main.go check-tests . ../.github/e2e-tests.yml; then
echo "::error::Some E2E test configurations have to be added to .github/e2e-tests.yml. This file defines Github CI configuration for each E2E test or set of E2E tests." && exit 1
fi
get_latest_chainlink_release_version:
name: Get latest Chainlink release version
runs-on: ubuntu-latest
environment: integration
outputs:
latest_chainlink_release_version: ${{ steps.get_latest_version.outputs.latest_version }}
steps:
- name: Get Latest Version
id: get_latest_version
run: |
untrimmed_ver=$(curl --header "Authorization: token ${{ secrets.GH_TOKEN }}" --request GET https://api.github.com/repos/${{ github.repository }}/releases/latest | jq -r .name)
latest_version="${untrimmed_ver:1}"
echo "Latest Chainlink release version: $latest_version"
echo "latest_version=${latest_version}" >> "$GITHUB_OUTPUT"
# Check if latest_version is empty
if [ -z "$latest_version" ]; then
echo "Error: The latest_version is empty. The migration tests need a verison to run."
exit 1
fi
load-test-configurations:
name: Load test configurations
needs: [validate-inputs]
runs-on: ubuntu-latest
outputs:
run-docker-tests: ${{ steps.check-matrices.outputs.run-docker-tests }}
run-k8s-tests: ${{ steps.check-matrices.outputs.run-k8s-tests }}
docker-matrix: ${{ steps.set-docker-matrix.outputs.matrix }}
k8s-runner-matrix: ${{ steps.set-k8s-runner-matrix.outputs.matrix }}
steps:
- name: Checkout code
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
- name: Setup Go
uses: ./.github/actions/setup-go
- name: Install jq
run: sudo apt-get install jq
- name: Generate Docker Tests Matrix
id: set-docker-matrix
run: |
cd integration-tests/citool
MATRIX_JSON=$(go run main.go filter --file ${{ github.workspace }}/.github/e2e-tests.yml --test-env-type 'docker' --test-list '${{ inputs.test_list }}' --test-ids '${{ inputs.test_ids }}' --workflow '${{ inputs.test_workflow }}')
echo "Docker tests:"
echo "$MATRIX_JSON" | jq
echo "matrix=$MATRIX_JSON" >> $GITHUB_OUTPUT
- name: Generate K8s Tests Matrix
id: set-k8s-runner-matrix
run: |
cd integration-tests/citool
MATRIX_JSON=$(go run main.go filter --file ${{ github.workspace }}/.github/e2e-tests.yml --test-env-type 'k8s-remote-runner' --test-list '${{ inputs.test_list }}' --test-ids '${{ inputs.test_ids }}' --workflow '${{ inputs.test_workflow }}')
echo "K8s tests:"
echo "$MATRIX_JSON" | jq
echo "matrix=$MATRIX_JSON" >> $GITHUB_OUTPUT
- name: Check Test Matrices
id: check-matrices
run: |
DOCKER_MATRIX_EMPTY=$(echo '${{ steps.set-docker-matrix.outputs.matrix }}' | jq '.tests == null or .tests == []')
K8S_MATRIX_EMPTY=$(echo '${{ steps.set-k8s-runner-matrix.outputs.matrix }}' | jq '.tests == null or .tests == []')
# Check if jq commands succeeded
if [ $? -ne 0 ]; then
echo "JSON parse error occurred."
exit 1
fi
if [[ "$DOCKER_MATRIX_EMPTY" == "true" ]]; then
echo "run-docker-tests=false" >> $GITHUB_OUTPUT
else
echo "run-docker-tests=true" >> $GITHUB_OUTPUT
fi
if [[ "$K8S_MATRIX_EMPTY" == "true" ]]; then
echo "run-k8s-tests=false" >> $GITHUB_OUTPUT
else
echo "run-k8s-tests=true" >> $GITHUB_OUTPUT
fi
# Check if both matrices are empty
if [[ "$DOCKER_MATRIX_EMPTY" == "true" ]] && [[ "$K8S_MATRIX_EMPTY" == "true" ]]; then
echo "No tests found for inputs: '${{ toJson(inputs) }}'. Both Docker and Kubernetes tests matrices are empty"
exit 1
fi
shell: bash
- name: Check if test config override is required for any test
shell: bash
run: |
# Check if the test config override is provided and skip the checks if it is non-empty
# TODO: Uncomment once Test Config does not have any secrets. Related ticket https://smartcontract-it.atlassian.net/browse/TT-1392
# if [ -n "${{ inputs.test_config_override_base64 }}" ]; then
# echo "Test config override provided. Skipping checks for tests requiring config override."
# exit 0
# fi
# Parse the JSON to check for test_config_override_required in Docker matrix
DOCKER_TESTS_REQUIRING_CONFIG_OVERRIDE=$(echo '${{ steps.set-docker-matrix.outputs.matrix }}' | jq 'if .tests then .tests[] | select(has("test_config_override_required") and .test_config_override_required) | .id else empty end' -r)
# Parse the JSON to check for test_config_override_required in Kubernetes matrix
K8S_TESTS_REQUIRING_CONFIG_OVERRIDE=$(echo '${{ steps.set-k8s-runner-matrix.outputs.matrix }}' | jq 'if .tests then .tests[] | select(has("test_config_override_required") and .test_config_override_required) | .id else empty end' -r)
# Determine if any tests require a configuration override
if [ ! -z "$DOCKER_TESTS_REQUIRING_CONFIG_OVERRIDE" ] || [ ! -z "$K8S_TESTS_REQUIRING_CONFIG_OVERRIDE" ]; then
echo "Tests in .github/e2e-tests.yml requiring test config override:"
if [ ! -z "$DOCKER_TESTS_REQUIRING_CONFIG_OVERRIDE" ]; then
echo $DOCKER_TESTS_REQUIRING_CONFIG_OVERRIDE
fi
if [ ! -z "$K8S_TESTS_REQUIRING_CONFIG_OVERRIDE" ]; then
echo $K8S_TESTS_REQUIRING_CONFIG_OVERRIDE
fi
echo "::error::Error: Some of the tests require a test config override. Please see workflow logs and set 'test_config_override_base64' to run these tests."
exit 1
else
echo "No tests require a configuration override. Proceeding without overrides."
fi
- name: Check if test secrets are required for any test
shell: bash
run: |
# Check if the test secret key is provided and skip the checks if it is non-empty
if [ -n "${{ secrets.TEST_SECRETS_OVERRIDE_BASE64 }}" ]; then
echo "Test secret key provided. Skipping checks for tests requiring secrets."
exit 0
fi
# Parse the JSON to check for test_secrets_required in Docker matrix
DOCKER_TESTS_REQUIRING_SECRETS=$(echo '${{ steps.set-docker-matrix.outputs.matrix }}' | jq 'if .tests then .tests[] | select(has("test_secrets_required") and .test_secrets_required) | .id else empty end' -r)
# Parse the JSON to check for test_secrets_required in Kubernetes matrix
K8S_TESTS_REQUIRING_SECRETS=$(echo '${{ steps.set-k8s-runner-matrix.outputs.matrix }}' | jq 'if .tests then .tests[] | select(has("test_secrets_required") and .test_secrets_required) | .id else empty end' -r)
# Determine if any tests require secrets
if [ ! -z "$DOCKER_TESTS_REQUIRING_SECRETS" ] || [ ! -z "$K8S_TESTS_REQUIRING_SECRETS" ]; then
echo "Tests in .github/e2e-tests.yml requiring custom test secrets:"
if [ ! -z "$DOCKER_TESTS_REQUIRING_SECRETS" ]; then
echo $DOCKER_TESTS_REQUIRING_SECRETS
fi
if [ ! -z "$K8S_TESTS_REQUIRING_SECRETS" ]; then
echo $K8S_TESTS_REQUIRING_SECRETS
fi
echo "::error::Error: Some of the tests require custom test secrets to run. Please see workflow logs and set 'test_secrets_override_key' to run these tests."
exit 1
else
echo "No tests require secrets. Proceeding without additional secret setup."
fi
# Build Chainlink images required for the tests
require-chainlink-image-versions-in-qa-ecr:
name: Build Chainlink image
needs: [validate-inputs, load-test-configurations]
if: ${{ needs.validate-inputs.outputs.require_chainlink_image_versions_in_qa_ecr_matrix != '' }}
runs-on: ubuntu-latest
environment: integration
permissions:
id-token: write
contents: read
env:
CHAINLINK_IMAGE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink
strategy:
matrix:
version: ${{ fromJson(needs.validate-inputs.outputs.require_chainlink_image_versions_in_qa_ecr_matrix) }}
steps:
- name: Checkout the repo
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
- name: Build Chainlink image for ${{ matrix.version }} and push it to QA ECR
uses: ./.github/actions/build-chainlink-image
with:
dockerfile: core/chainlink.Dockerfile
git_commit_sha: ${{ matrix.version }}
tag_suffix: ''
check_image_exists: 'true'
AWS_REGION: ${{ secrets.QA_AWS_REGION }}
AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }}
# Build Chainlink plugins required for the tests
require-chainlink-plugin-versions-in-qa-ecr:
name: Build Chainlink plugins
needs: [validate-inputs, load-test-configurations]
if: ${{ needs.validate-inputs.outputs.require_chainlink_plugin_versions_in_qa_ecr_matrix != '' }}
runs-on: ubuntu-latest
environment: integration
permissions:
id-token: write
contents: read
env:
CHAINLINK_IMAGE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink
strategy:
matrix:
version: ${{ fromJson(needs.validate-inputs.outputs.require_chainlink_plugin_versions_in_qa_ecr_matrix) }}
steps:
- name: Checkout the repo
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
- name: Build Chainlink plugins image for ${{ matrix.version }}
uses: ./.github/actions/build-chainlink-image
with:
dockerfile: plugins/chainlink.Dockerfile
git_commit_sha: ${{ matrix.version }}
tag_suffix: '-plugins'
check_image_exists: 'true'
AWS_REGION: ${{ secrets.QA_AWS_REGION }}
AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }}
# Run Docker tests
run-docker-tests:
name: Run ${{ matrix.tests.id }}
needs: [load-test-configurations, require-chainlink-image-versions-in-qa-ecr, require-chainlink-plugin-versions-in-qa-ecr, get_latest_chainlink_release_version]
# Run when none of the needed jobs fail or are cancelled (skipped or successful jobs are ok)
if: ${{ needs.load-test-configurations.outputs.run-docker-tests == 'true' && always() && !failure() && !cancelled() }}
runs-on: ${{ matrix.tests.runs_on }}
strategy:
fail-fast: false
matrix: ${{fromJson(needs.load-test-configurations.outputs.docker-matrix)}}
environment: integration
permissions:
actions: read
checks: write
pull-requests: write
id-token: write
contents: read
env:
LATEST_CHAINLINK_RELEASE_VERSION: ${{ needs.get_latest_chainlink_release_version.outputs.latest_chainlink_release_version }}
steps:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
uses: smartcontractkit/push-gha-metrics-action@d9da21a2747016b3e13de58c7d4115a3d5c97935 # v3.0.1
with:
id: e2e_tests_${{ matrix.tests.id_sanitized }}
org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Run E2E Tests / Run ${{ matrix.tests.id }}
test-results-file: '{"testType":"go","filePath":"/tmp/gotest.log"}'
continue-on-error: true
- name: Checkout repository
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
- name: Install jq
run: sudo apt-get install -y jq
- name: Show test configuration
run: echo '${{ toJson(matrix.tests) }}' | jq .
- name: Setup Go
uses: ./.github/actions/setup-go
- name: Setup GAP for Grafana
uses: smartcontractkit/.github/actions/setup-gap@d316f66b2990ea4daa479daa3de6fc92b00f863e # setup-gap@0.3.2
id: setup-gap
with:
aws-region: ${{ secrets.AWS_REGION }}
aws-role-arn: ${{ secrets.AWS_OIDC_IAM_ROLE_VALIDATION_PROD_ARN }}
api-gateway-host: ${{ secrets.AWS_API_GW_HOST_GRAFANA }}
duplicate-authorization-header: "true"
- name: Run tests
uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@aa8eea635029ab8d95abd3c206f56dae1e22e623 # v2.3.28
env:
DETACH_RUNNER: true
with:
test_command_to_run: ${{ matrix.tests.test_cmd }} 2>&1 | tee /tmp/gotest.log | gotestloghelper -ci -singlepackage -hidepassingtests=false -hidepassinglogs
test_download_vendor_packages_command: cd ./integration-tests && go mod download
test_secrets_override_base64: ${{ secrets.TEST_SECRETS_OVERRIDE_BASE64 }}
# TODO: Uncomment once Test Config does not have any secrets. Related ticket https://smartcontract-it.atlassian.net/browse/TT-1392
# test_config_override_base64: ${{ inputs.test_config_override_base64 }}
test_config_chainlink_version: ${{ matrix.tests.test_inputs.chainlink_version || inputs.chainlink_version || github.sha }}
test_config_chainlink_upgrade_version: ${{ matrix.tests.test_inputs.chainlink_upgrade_version }}
test_config_chainlink_postgres_version: ${{ matrix.tests.test_inputs.chainlink_postgres_version }}
test_config_selected_networks: ${{ matrix.tests.test_inputs.selected_networks || env.SELECTED_NETWORKS}}
test_config_logging_run_id: ${{ github.run_id }}
test_config_logstream_log_targets: ${{ vars.LOGSTREAM_LOG_TARGETS }}
test_type: ${{ matrix.tests.test_inputs.test_type }}
test_suite: ${{ matrix.tests.test_inputs.test_suite }}
aws_registries: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}
artifacts_name: ${{ matrix.tests.id_sanitized }}-test-logs
artifacts_location: |
./integration-tests/smoke/logs/
/tmp/gotest.log
publish_check_name: ${{ matrix.tests.id_sanitized }}
token: ${{ secrets.GH_TOKEN }}
no_cache: true # Do not restore cache since go was already configured in the previous step
go_mod_path: ./integration-tests/go.mod
QA_AWS_REGION: ${{ secrets.QA_AWS_REGION }}
QA_AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }}
QA_KUBECONFIG: ""
should_tidy: "false"
go_coverage_src_dir: /var/tmp/go-coverage
go_coverage_dest_dir: ${{ github.workspace }}/.covdata
DEFAULT_CHAINLINK_IMAGE: ${{ matrix.tests.test_inputs.chainlink_image || env.CHAINLINK_IMAGE }}
DEFAULT_CHAINLINK_UPGRADE_IMAGE: ${{ matrix.tests.test_inputs.chainlink_upgrade_image }}
DEFAULT_LOKI_TENANT_ID: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
DEFAULT_LOKI_ENDPOINT: https://${{ secrets.GRAFANA_INTERNAL_HOST }}/loki/api/v1/push
DEFAULT_LOKI_BASIC_AUTH: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
DEFAULT_GRAFANA_BASE_URL: "http://localhost:8080/primary"
DEFAULT_GRAFANA_DASHBOARD_URL: "/d/ddf75041-1e39-42af-aa46-361fe4c36e9e/ci-e2e-tests-logs"
DEFAULT_GRAFANA_BEARER_TOKEN: ${{ secrets.GRAFANA_INTERNAL_URL_SHORTENER_TOKEN }}
DEFAULT_PYROSCOPE_ENVIRONMENT: ${{ matrix.tests.pyroscope_env }}
DEFAULT_PYROSCOPE_SERVER_URL: ${{ matrix.tests.pyroscope_env != '' && secrets.QA_PYROSCOPE_INSTANCE || '' }}
DEFAULT_PYROSCOPE_KEY: ${{ matrix.tests.pyroscope_env != '' && secrets.QA_PYROSCOPE_KEY || '' }}
DEFAULT_PYROSCOPE_ENABLED: ${{ matrix.tests.pyroscope_env != '' && 'true' || '' }}
- name: Upload test log as Github artifact
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
if: inputs.test_log_upload_on_failure && failure()
with:
name: test_log_${{ matrix.tests.id_sanitized }}
path: /tmp/gotest.log
retention-days: ${{ inputs.test_log_upload_retention_days }}
continue-on-error: true
# Run K8s tests using old remote runner
prepare-remote-runner-test-image:
needs: [load-test-configurations, require-chainlink-image-versions-in-qa-ecr, require-chainlink-plugin-versions-in-qa-ecr]
if: ${{ needs.load-test-configurations.outputs.run-k8s-tests == 'true' && always() && !failure() && !cancelled() }}
name: Prepare remote runner test image
runs-on: ubuntu-latest
environment: integration
permissions:
actions: read
checks: write
pull-requests: write
id-token: write
contents: read
outputs:
remote-runner-version: ${{ steps.set-remote-runner-version.outputs.remote-runner-version }}
env:
ENV_JOB_IMAGE_BASE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink-tests
steps:
- name: Checkout repository
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
- name: Build Test Runner Image
uses: ./.github/actions/build-test-image
if: ${{ inputs.with_existing_remote_runner_version == '' }}
with:
QA_AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }}
QA_AWS_REGION: ${{ secrets.QA_AWS_REGION }}
QA_AWS_ACCOUNT_NUMBER: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}
- name: Set Remote Runner Version
id: set-remote-runner-version
run: |
if [[ -z "${{ inputs.with_existing_remote_runner_version }}" ]]; then
echo "remote-runner-version=${{ github.sha }}" >> $GITHUB_OUTPUT
else
echo "remote-runner-version=${{ inputs.with_existing_remote_runner_version }}" >> $GITHUB_OUTPUT
fi
run-k8s-runner-tests:
needs: [load-test-configurations, prepare-remote-runner-test-image, require-chainlink-image-versions-in-qa-ecr, require-chainlink-plugin-versions-in-qa-ecr, get_latest_chainlink_release_version]
if: ${{ needs.load-test-configurations.outputs.run-k8s-tests == 'true' && always() && !failure() && !cancelled() }}
name: Run ${{ matrix.tests.id }}
runs-on: ${{ matrix.tests.runs_on }}
strategy:
fail-fast: false
matrix: ${{fromJson(needs.load-test-configurations.outputs.k8s-runner-matrix)}}
environment: integration
permissions:
actions: read
checks: write
pull-requests: write
id-token: write
contents: read
env:
LATEST_CHAINLINK_RELEASE_VERSION: ${{ needs.get_latest_chainlink_release_version.outputs.latest_chainlink_release_version }}
steps:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
uses: smartcontractkit/push-gha-metrics-action@d9da21a2747016b3e13de58c7d4115a3d5c97935 # v3.0.1
with:
id: e2e_tests_${{ matrix.tests.id_sanitized }}
org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Run E2E Tests / Run ${{ matrix.tests.id }}
continue-on-error: true
- name: Checkout repository
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
- name: Install jq
run: sudo apt-get install -y jq
- name: Show Test Configuration
run: echo '${{ toJson(matrix.tests) }}' | jq .
- name: Show Remote Runner Version
run: |
echo "Remote Runner Version: ${{ needs.prepare-remote-runner-test-image.outputs.remote-runner-version }}"
- name: Run tests
uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@aa8eea635029ab8d95abd3c206f56dae1e22e623 # v2.3.28
env:
DETACH_RUNNER: true
RR_MEM: ${{ matrix.tests.remote_runner_memory }}
TEST_ARGS: -test.timeout 900h -test.memprofile memprofile.out -test.cpuprofile profile.out
ENV_JOB_IMAGE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink-tests:${{ needs.prepare-remote-runner-test-image.outputs.remote-runner-version }}
INTERNAL_DOCKER_REPO: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com
# We can comment these out when we have a stable soak test and aren't worried about resource consumption
TEST_UPLOAD_CPU_PROFILE: true
TEST_UPLOAD_MEM_PROFILE: true
TEST_LOG_LEVEL: debug
REF_NAME: ${{ github.head_ref || github.ref_name }}
with:
test_command_to_run: ${{ matrix.tests.test_cmd }} 2>&1 | tee /tmp/gotest.log | gotestloghelper -ci -singlepackage -hidepassingtests=false -hidepassinglogs
test_download_vendor_packages_command: make gomod
test_secrets_override_base64: ${{ secrets.TEST_SECRETS_OVERRIDE_BASE64 }}
# TODO: Uncomment once Test Config does not have any secrets. Related ticket https://smartcontract-it.atlassian.net/browse/TT-1392
# test_config_override_base64: ${{ inputs.test_config_override_base64 }}
test_config_chainlink_version: ${{ matrix.tests.test_inputs.chainlink_version || inputs.chainlink_version || github.sha }}
test_config_chainlink_upgrade_version: ${{ matrix.tests.test_inputs.chainlink_upgrade_version }}
test_config_chainlink_postgres_version: ${{ matrix.tests.test_inputs.chainlink_postgres_version }}
test_config_selected_networks: ${{ matrix.tests.test_inputs.selected_networks || env.SELECTED_NETWORKS}}
test_config_logging_run_id: ${{ github.run_id }}
test_config_logstream_log_targets: ${{ vars.LOGSTREAM_LOG_TARGETS }}
test_type: ${{ matrix.tests.test_inputs.test_type }}
test_suite: ${{ matrix.tests.test_inputs.test_suite }}
token: ${{ secrets.GH_TOKEN }}
should_cleanup: false
no_cache: true # Do not restore cache since go was already configured in the previous step
go_mod_path: ./integration-tests/go.mod
QA_AWS_REGION: ${{ secrets.QA_AWS_REGION }}
QA_AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }}
QA_KUBECONFIG: ${{ secrets.QA_KUBECONFIG }}
DEFAULT_CHAINLINK_IMAGE: ${{ matrix.tests.test_inputs.chainlink_image || env.CHAINLINK_IMAGE }}
DEFAULT_CHAINLINK_UPGRADE_IMAGE: ${{ matrix.tests.test_inputs.chainlink_upgrade_image }}
DEFAULT_LOKI_TENANT_ID: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
DEFAULT_LOKI_ENDPOINT: https://${{ secrets.GRAFANA_INTERNAL_HOST }}/loki/api/v1/push
DEFAULT_LOKI_BASIC_AUTH: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
DEFAULT_GRAFANA_BASE_URL: "http://localhost:8080/primary"
DEFAULT_GRAFANA_DASHBOARD_URL: "/d/ddf75041-1e39-42af-aa46-361fe4c36e9e/ci-e2e-tests-logs"
DEFAULT_GRAFANA_BEARER_TOKEN: ${{ secrets.GRAFANA_INTERNAL_URL_SHORTENER_TOKEN }}
DEFAULT_PYROSCOPE_ENVIRONMENT: ${{ matrix.tests.pyroscope_env }}
DEFAULT_PYROSCOPE_SERVER_URL: ${{ matrix.tests.pyroscope_env != '' && secrets.QA_PYROSCOPE_INSTANCE || '' }}
DEFAULT_PYROSCOPE_KEY: ${{ matrix.tests.pyroscope_env != '' && secrets.QA_PYROSCOPE_KEY || '' }}
DEFAULT_PYROSCOPE_ENABLED: ${{ matrix.tests.pyroscope_env != '' && 'true' || '' }}
- name: Upload test log as Github artifact
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
if: inputs.test_log_upload_on_failure && failure()
with:
name: test_log_${{ matrix.tests.id_sanitized }}
path: /tmp/gotest.log
retention-days: ${{ inputs.test_log_upload_retention_days }}
continue-on-error: true
after_tests:
needs: [run-docker-tests, run-k8s-runner-tests]
if: always()
name: After tests notifications
runs-on: ubuntu-latest
steps:
- name: Determine combined test results
id: combine_results
run: |
docker_result="${{ needs.run-docker-tests.result }}"
k8s_result="${{ needs.run-k8s-runner-tests.result }}"
function map_outcome {
case "$1" in
success|skipped)
echo "success"
;;
cancelled)
echo "cancelled"
;;
*)
echo "failure"
;;
esac
}
combined_docker_result=$(map_outcome $docker_result)
combined_k8s_result=$(map_outcome $k8s_result)
if [[ $combined_docker_result == "failure" || $combined_k8s_result == "failure" ]]; then
echo "result=failure" >> $GITHUB_OUTPUT
elif [[ $combined_docker_result == "cancelled" || $combined_k8s_result == "cancelled" ]]; then
echo "result=cancelled" >> $GITHUB_OUTPUT
else
echo "result=success" >> $GITHUB_OUTPUT
fi
- name: Send Slack notification
uses: slackapi/slack-github-action@6c661ce58804a1a20f6dc5fbee7f0381b469e001 # v1.25.0
if: ${{ inputs.slack_notification_after_tests }}
id: slack
env:
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
with:
channel-id: ${{ inputs.slack_notification_after_tests_channel_id }}
payload: |
{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "${{ inputs.slack_notification_after_tests_name }} - ${{ steps.combine_results.outputs.result == 'failure' && 'Failed :x:' || steps.combine_results.outputs.result == 'cancelled' && 'Cancelled :warning:' || 'Passed :white_check_mark:' }}"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|View Build Details>"
}
}
]
}
# Run K8s tests using new remote runner
# remote-runner-k8s-tests:
# runs-on: ubuntu-latest
# container:
# image: golang:1.18
# steps:
# - name: Checkout repository
# uses: actions/checkout@v2
# - name: Set up Go
# uses: actions/setup-go@v2
# with:
# go-version: '1.18'
# - name: Load Runner Config
# run: echo "$RUNNER_CONFIG" > runner.toml
# env:
# RUNNER_CONFIG: |
# # Runner configuration
# detached_mode = true
# debug = false
# [[test_runs]]
# namespace = "dev-env"
# rbac_role_name = "dev-role"
# rbac_service_account_name = "dev-service-account"
# sync_value = "unique-sync-value-1"
# ttl_seconds_after_finished = 300
# image_registry_url = "https://myregistry.dev/"
# image_name = "dev-image"
# image_tag = "v1.0.0"
# test_name = "TestMercuryLoad/all_endpoints"
# test_config_base64_env_name = "CONFIG_ENV_DEV"
# test_config_file_path = "/configs/dev/test-config.toml"
# test_config_base64 = "dGVzdCBjb25maWcgdmFsdWUgZGV2"
# test_timeout = "30m"
# resources_requests_cpu = "500m"
# resources_requests_memory = "1Gi"
# resources_limits_cpu = "1000m"
# resources_limits_memory = "2Gi"
# job_count = 2
# chart_path = "/charts/dev"
# [envs]
# WASP_LOG_LEVEL = "info"
# TEST_LOG_LEVEL = "info"
# MERCURY_TEST_LOG_LEVEL = "info"
# [[test_runs]]
# namespace = "prod-env"
# rbac_role_name = "prod-role"
# rbac_service_account_name = "prod-service-account"
# sync_value = "unique-sync-value-2"
# ttl_seconds_after_finished = 600
# image_registry_url = "https://myregistry.prod/"
# image_name = "prod-image"
# image_tag = "v1.0.1"
# test_name = "TestMercuryLoad/all_endpoints"
# test_config_base64_env_name = "CONFIG_ENV_PROD"
# test_config_file_path = "/configs/prod/test-config.toml"
# test_config_base64 = "dGVzdCBjb25maWcgdmFsdWUgcHJvZA=="
# test_timeout = "45m"
# resources_requests_cpu = "800m"
# resources_requests_memory = "2Gi"
# resources_limits_cpu = "1500m"
# resources_limits_memory = "4Gi"
# job_count = 3
# chart_path = "/charts/prod"
# [envs]
# WASP_LOG_LEVEL = "info"
# TEST_LOG_LEVEL = "info"
# MERCURY_TEST_LOG_LEVEL = "info"
# # Schedule the tests in K8s in remote runner
# - name: Run Kubernetes Tests
# run: go run ./cmd/main.go run -c runner.toml