Integration Tests #101950
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# N/B: ci-core, which runs on PRs, will trigger linting for affected directories/modules | |
# no need to run lint twice | |
name: Integration Tests | |
run-name: Integration Tests ${{ inputs.distinct_run_name && inputs.distinct_run_name || '' }} | |
on: | |
merge_group: | |
pull_request: | |
types: [opened, synchronize, reopened, labeled] | |
push: | |
tags: | |
- "*" | |
branches: | |
- develop | |
workflow_dispatch: | |
inputs: | |
cl_ref: | |
description: "The ref to checkout, defaults to the calling branch" | |
required: false | |
type: string | |
evm-ref: | |
description: "The sha of the chainlink-evm commit to use if wanted" | |
required: false | |
type: string | |
run_solana: | |
description: "Run solana tests" | |
required: false | |
type: string | |
default: "false" | |
distinct_run_name: | |
description: "A unique identifier for this run, only use from other repos" | |
required: false | |
type: string | |
ecr_name: | |
description: "The name of the ECR repository to push the image to, defaults to 'chainlink'" | |
required: false | |
type: string | |
default: "chainlink" | |
# Only run 1 of this workflow at a time per PR, but don't cancel runs on develop | |
concurrency: | |
group: ${{ github.ref != 'refs/heads/develop' && format('{0}-{1}-{2}-e2e-tests-{3}', github.ref, github.repository, github.event_name, inputs.distinct_run_name) || github.sha }} | |
cancel-in-progress: true | |
env: | |
# for run-test variables and environment | |
ENV_JOB_IMAGE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink-tests:${{ inputs.evm-ref || github.sha }} | |
CHAINLINK_IMAGE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/${{ inputs.ecr_name || 'chainlink-integration-tests' }} | |
CHAINLINK_REF: ${{ inputs.cl_ref || github.sha }} | |
TEST_SUITE: smoke | |
MOD_CACHE_VERSION: 2 | |
jobs: | |
enforce-ctf-version: | |
name: Enforce CTF Version | |
runs-on: ubuntu-latest | |
# We don't directly merge dependabot PRs, so let's not waste the resources | |
if: github.actor != 'dependabot[bot]' | |
steps: | |
- run: echo "${{github.event_name}}" | |
- name: Checkout the repo | |
uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
repository: smartcontractkit/chainlink | |
ref: ${{ inputs.cl_ref }} | |
- name: Check Merge Group Condition | |
id: condition-check | |
run: | | |
echo "Checking event condition..." | |
SHOULD_ENFORCE="false" | |
if [[ "$GITHUB_EVENT_NAME" == "merge_group" ]]; then | |
echo "We are in a merge_group event, now check if we are on the develop branch" | |
target_branch=$(cat $GITHUB_EVENT_PATH | jq -r .merge_group.base_ref) | |
if [[ "$target_branch" == "refs/heads/develop" ]]; then | |
echo "We are on the develop branch, we should enforce ctf version" | |
SHOULD_ENFORCE="true" | |
fi | |
fi | |
echo "should we enforce ctf version = $SHOULD_ENFORCE" | |
echo "should-enforce=$SHOULD_ENFORCE" >> $GITHUB_OUTPUT | |
- name: Enforce CTF Version | |
if: steps.condition-check.outputs.should-enforce == 'true' | |
uses: smartcontractkit/.github/actions/ctf-check-mod-version@21b0189c5fdca0318617d259634b1a91e6d80262 # [email protected] | |
with: | |
go-project-path: ./integration-tests | |
module-name: github.com/smartcontractkit/chainlink-testing-framework/lib | |
enforce-semantic-tag: "true" | |
changes: | |
name: Check Paths That Require Tests To Run | |
# We don't directly merge dependabot PRs, so let's not waste the resources | |
if: github.actor != 'dependabot[bot]' | |
runs-on: ubuntu-latest | |
environment: integration | |
outputs: | |
general-changes: ${{ steps.changes.outputs.general_changes }} | |
core-changes: ${{ steps.changes.outputs.core_changes }} | |
cre-changes: ${{ steps.changes.outputs.cre_changes }} | |
ccip-changes: ${{ steps.changes.outputs.ccip_changes }} | |
steps: | |
- name: Checkout the repo | |
uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
repository: smartcontractkit/chainlink | |
ref: ${{ inputs.cl_ref }} | |
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 | |
id: changes | |
with: | |
filters: | | |
general_changes: | |
- '.github/workflows/integration-tests.yml' | |
- '.github/workflows/run-e2e-tests-reusable-workflow.yml' | |
- '.github/workflows/cre-system-tests.yaml' | |
- '.github/e2e-tests.yml' | |
- 'GNUmakefile' | |
- 'core/chainlink.Dockerfile' | |
- 'plugins/chainlink.Dockerfile' | |
core_changes: &core_changes | |
- '**/*.go' | |
- '**/*go.sum' | |
- '**/*go.mod' | |
- '**/*Dockerfile' | |
- 'core/**/migrations/*.sql' | |
- 'core/**/config/**/*.toml' | |
- 'integration-tests/**/*.toml' | |
cre_changes: | |
- *core_changes | |
- 'core/scripts/cre/environment/**/*' | |
- 'system-tests/**' | |
- 'plugins/plugins.private.yaml' | |
- 'plugins/plugins.public.yaml' | |
ccip_changes: | |
- '**/*ccip*' | |
- '**/*ccip*/**' | |
labels: | |
name: Get PR labels and set runner labels | |
if: github.actor != 'dependabot[bot]' | |
runs-on: ubuntu-latest | |
permissions: | |
contents: read | |
pull-requests: write | |
outputs: | |
builder-runner-label-core: ${{ steps.runner-labels.outputs.builder-runner-label-core || steps.runner-labels.outputs.builder-runner-label }} | |
builder-runner-label-plugins: ${{ steps.runner-labels.outputs.builder-runner-label-plugins || steps.runner-labels.outputs.builder-runner-label }} | |
solana-runner-label: ${{ steps.runner-labels.outputs.solana-runner-label }} | |
should-use-self-hosted-runners: ${{ steps.label-runs-on-opt-out.outputs.check-label-found == 'false' }} | |
run-e2e-tests-label-found: ${{ steps.label-runs-e2e-tests.outputs.check-label-found || 'false' }} | |
skip-e2e-regression-label-found: ${{ steps.label-skip-e2e-regression.outputs.check-label-found || 'false' }} | |
steps: | |
- name: Get PR Labels (runs-on-opt-out) | |
id: label-runs-on-opt-out | |
uses: smartcontractkit/.github/actions/get-pr-labels@get-pr-labels/v1 | |
with: | |
check-label: "runs-on-opt-out" | |
- name: Get PR Labels (run-e2e-tests) | |
if: github.event_name == 'pull_request' | |
id: label-runs-e2e-tests | |
uses: smartcontractkit/.github/actions/get-pr-labels@get-pr-labels/v1 | |
with: | |
check-label: "run-e2e-tests" | |
- name: Get PR Labels (skip-e2e-regression) | |
if: github.event_name == 'pull_request' | |
id: label-skip-e2e-regression | |
uses: smartcontractkit/.github/actions/get-pr-labels@get-pr-labels/v1 | |
with: | |
check-label: "skip-e2e-regression" | |
- name: Set runner labels | |
id: runner-labels | |
env: | |
OPT_OUT: ${{ steps.label-runs-on-opt-out.outputs.check-label-found || 'false' }} | |
GH_BUILDER_RUNNER: ubuntu22.04-8cores-32GB | |
GH_SOLANA_RUNNER: ubuntu22.04-8cores-32GB | |
# include unique label (core/plugins/solana) to ensure jobs are not competing for the same runner | |
SH_BUILDER_RUNNER_CORE: runs-on=${{ github.run_id }}-core/cpu=32+36/memory=64+72/family=c6i+c7i+c5.*/extras=s3-cache+tmpfs | |
SH_BUILDER_RUNNER_PLUGINS: runs-on=${{ github.run_id }}-plugins/cpu=32+36/memory=64+72/family=c6i+c7i+c5.*/extras=s3-cache+tmpfs | |
SH_SOLANA_RUNNER: runs-on=${{ github.run_id }}-solana/cpu=48/ram=96/family=c6i/spot=false/image=ubuntu24-full-x64/extras=s3-cache+tmpfs | |
run: | | |
if [[ "${OPT_OUT}" == "true" ]]; then | |
echo "builder-runner-label=${GH_BUILDER_RUNNER}" | tee -a "$GITHUB_OUTPUT" | |
echo "solana-runner-label=${GH_SOLANA_RUNNER}" | tee -a "$GITHUB_OUTPUT" | |
else | |
echo "builder-runner-label-core=${SH_BUILDER_RUNNER_CORE}" | tee -a "$GITHUB_OUTPUT" | |
echo "builder-runner-label-plugins=${SH_BUILDER_RUNNER_PLUGINS}" | tee -a "$GITHUB_OUTPUT" | |
echo "solana-runner-label=${SH_SOLANA_RUNNER}" | tee -a "$GITHUB_OUTPUT" | |
fi | |
build-chainlink: | |
name: Build Chainlink Image ${{ matrix.image.name }} | |
if: github.actor != 'dependabot[bot]' | |
environment: integration | |
runs-on: ${{ matrix.image.runner }} | |
needs: | |
[ | |
labels, | |
enforce-ctf-version, | |
run-core-cre-e2e-tests-setup, | |
run-core-e2e-tests-setup, | |
run-ccip-e2e-tests-setup, | |
solana-smoke-tests-setup, | |
] | |
permissions: | |
id-token: write | |
contents: read | |
strategy: | |
matrix: | |
image: | |
- name: "" | |
runner: ${{ needs.labels.outputs.builder-runner-label-core || 'ubuntu22.04-8cores-32GB' }} | |
dockerfile: core/chainlink.Dockerfile | |
tag-suffix: "" | |
# todo: optimize this conditional | |
should-build: >- | |
${{ | |
needs.run-core-e2e-tests-setup.outputs.should-run == 'true' || | |
needs.run-ccip-e2e-tests-setup.outputs.should-run == 'true' || | |
needs.solana-smoke-tests-setup.outputs.should-run-solana-tests == 'true' || | |
needs.run-core-cre-e2e-tests-setup.outputs.should-run == 'true' | |
}} | |
- name: (plugins) | |
runner: ${{ needs.labels.outputs.builder-runner-label-plugins || 'ubuntu22.04-8cores-32GB' }} | |
dockerfile: plugins/chainlink.Dockerfile | |
tag-suffix: -plugins | |
# todo: optimize this conditional | |
should-build: >- | |
${{ | |
needs.run-core-e2e-tests-setup.outputs.should-run == 'true' || | |
needs.run-ccip-e2e-tests-setup.outputs.should-run == 'true' || | |
needs.solana-smoke-tests-setup.outputs.should-run-solana-tests == 'true' || | |
needs.run-core-cre-e2e-tests-setup.outputs.should-run == 'true' | |
}} | |
steps: | |
- name: Enable S3 Cache for Self-Hosted Runners | |
# these env vars are set (and exposed) when it is a self-hosted runner with extras=s3-cache | |
if: ${{ env.RUNS_ON_INSTANCE_ID != '' && env.ACTIONS_CACHE_URL != '' }} | |
uses: runs-on/action@66d4449b717b5462159659523d1241051ff470b9 # v1 | |
- name: Check if image exists in ECR | |
id: check-image-exists | |
uses: smartcontractkit/.github/actions/ecr-image-exists@ecr-image-exists/0.0.1 | |
with: | |
repository: ${{ inputs.ecr_name || 'chainlink-integration-tests' }} | |
tag: ${{ inputs.evm-ref || env.CHAINLINK_REF }}${{ matrix.image.tag-suffix }} | |
aws-role-arn: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }} | |
- name: Explain | |
env: | |
SHOULD_BUILD: ${{ matrix.image.should-build }} | |
IMAGE_EXISTS: ${{ steps.check-image-exists.outputs.exists }} | |
run: | | |
if [[ "${SHOULD_BUILD}" == 'true' && "${IMAGE_EXISTS}" == 'false' ]]; then | |
echo "We will build the image because the matrix's should-build is true and the image does not already exist in ECR." | |
echo "Should build is true when:" | |
echo "- For the non-plugins image: the core tests, ccip tests, or solana tests will be run." | |
echo "- For the plugins image: the core cre e2e tests will be run." | |
else | |
echo "We will not build the image because either the matrix's should-build is false or the image already exists in ECR." | |
echo "should-build: ${SHOULD_BUILD}" | |
echo "image-exists: ${IMAGE_EXISTS}" | |
fi | |
- name: Checkout the repo | |
if: matrix.image.should-build && steps.check-image-exists.outputs.exists != 'true' | |
uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
repository: smartcontractkit/chainlink | |
ref: ${{ env.CHAINLINK_REF }} | |
- name: Build Chainlink Image | |
if: matrix.image.should-build && steps.check-image-exists.outputs.exists != 'true' | |
uses: smartcontractkit/.github/actions/ctf-build-image@ctf-build-image/v1 | |
with: | |
image-tag: ${{ inputs.evm-ref || env.CHAINLINK_REF }}${{ matrix.image.tag-suffix }} | |
dockerfile: ${{ matrix.image.dockerfile }} | |
docker-registry-url: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com | |
docker-repository-name: ${{ inputs.ecr_name || 'chainlink-integration-tests' }} | |
aws-account-number: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }} | |
aws-region: ${{ secrets.QA_AWS_REGION }} | |
aws-role-arn: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }} | |
docker-additional-build-args: | | |
CL_IS_PROD_BUILD=false | |
go-get-overrides: | | |
github.com/smartcontractkit/chainlink-evm=${{ inputs.evm-ref }} | |
gati-role-arn: ${{ secrets.AWS_OIDC_GLOBAL_READ_ONLY_TOKEN_ISSUER_ROLE_ARN }} | |
gati-lambda-url: ${{ secrets.AWS_INFRA_RELENG_TOKEN_ISSUER_LAMBDA_URL }} | |
run-core-cre-e2e-tests-setup: | |
name: Run Core CRE E2E Tests Setup | |
runs-on: ubuntu-latest | |
needs: [changes, labels] | |
permissions: | |
contents: read | |
outputs: | |
should-run: ${{ steps.form-inputs.outputs.should-run }} | |
with-regression: ${{ steps.form-inputs.outputs.with-regression }} | |
workflow-name: ${{ steps.form-inputs.outputs.workflow-name }} | |
steps: | |
- name: Form Inputs for Core CRE E2E Tests | |
id: form-inputs | |
env: | |
GITHUB_EVENT_NAME: ${{ github.event_name }} | |
GITHUB_REF_TYPE: ${{ github.ref_type }} | |
CONTAINS_CHANGES: ${{ needs.changes.outputs.general-changes == 'true' || needs.changes.outputs.cre-changes == 'true' }} | |
RUN_E2E_TESTS_LABEL_FOUND: ${{ needs.labels.outputs.run-e2e-tests-label-found }} | |
SKIP_E2E_TESTS_REGRESSION_LABEL_FOUND: ${{ needs.labels.outputs.skip-e2e-regression-label-found }} | |
run: | | |
if [[ "${GITHUB_EVENT_NAME}" == 'pull_request' ]]; then | |
# Run Core CRE E2E tests on PRs if there are relevant changes | |
if [[ "${CONTAINS_CHANGES}" == 'true' ]]; then | |
echo "should-run=true" | tee -a "$GITHUB_OUTPUT" | |
elif [[ "${RUN_E2E_TESTS_LABEL_FOUND}" == 'true' ]]; then | |
# Run if the PR has the label "run-e2e-tests" | |
echo "should-run=true" | tee -a "$GITHUB_OUTPUT" | |
fi | |
if [[ "${SKIP_E2E_TESTS_REGRESSION_LABEL_FOUND}" == 'true' ]]; then | |
# Opt-out of CRE regression tests if the label 'skip-e2e-regression' is found | |
echo "with-regression=false" | tee -a "$GITHUB_OUTPUT" | |
else | |
# Run CRE regression tests by default | |
echo "with-regression=true" | tee -a "$GITHUB_OUTPUT" | |
fi | |
elif [[ "${GITHUB_EVENT_NAME}" == 'merge_group' ]]; then | |
# Run Core CRE E2E tests in the merge queue, if there are relevant changes | |
echo "workflow-name=Run Core CRE E2E Tests For Merge Queue" | tee -a "$GITHUB_OUTPUT" | |
echo "should-run=${CONTAINS_CHANGES}" | tee -a "$GITHUB_OUTPUT" | |
elif [[ "${GITHUB_EVENT_NAME}" == 'workflow_dispatch' ]]; then | |
# Always run Core CRE E2E tests on workflow dispatch | |
echo "workflow-name=Run Core CRE E2E Tests For Workflow Dispatch" | tee -a "$GITHUB_OUTPUT" | |
echo "should-run=true" | tee -a "$GITHUB_OUTPUT" | |
elif [[ "${GITHUB_EVENT_NAME}" == 'push' ]]; then | |
# Run Core CRE E2E tests on push events, only if there are relevant changes, or it's a tag push | |
echo "workflow-name=Run Core CRE E2E Tests For Push" | tee -a "$GITHUB_OUTPUT" | |
if [[ "${CONTAINS_CHANGES}" == 'true' || "${GITHUB_REF_TYPE}" == 'tag' ]]; then | |
echo "should-run=true" | tee -a "$GITHUB_OUTPUT" | |
fi | |
else | |
echo "workflow-name=Run Core CRE E2E Tests For Unknown Event" | tee -a "$GITHUB_OUTPUT" | |
echo "test-trigger=Unknown CRE E2E Core Tests" | tee -a "$GITHUB_OUTPUT" | |
echo "should-run=false" | tee -a "$GITHUB_OUTPUT" | |
fi | |
run-core-cre-e2e-tests: | |
name: Run Core CRE E2E Tests For PR | |
needs: [build-chainlink, run-core-cre-e2e-tests-setup] | |
permissions: | |
actions: read | |
checks: write | |
pull-requests: write | |
id-token: write | |
contents: read | |
if: needs.run-core-cre-e2e-tests-setup.outputs.should-run == 'true' | |
uses: ./.github/workflows/cre-system-tests.yaml | |
with: | |
ecr_name: ${{ inputs.ecr_name || 'chainlink-integration-tests' }} | |
chainlink_version: ${{ inputs.evm-ref || inputs.cl_ref || github.sha }} | |
chainlink_image_tag: ${{ inputs.evm-ref && format('{0}', inputs.evm-ref) || inputs.cl_ref && format('{0}', inputs.cl_ref) || format('{0}', github.sha) }} | |
secrets: inherit | |
run-core-cre-e2e-regression-tests: | |
name: Run Core CRE E2E Regression Tests For PR | |
needs: [build-chainlink, run-core-cre-e2e-tests-setup] | |
permissions: | |
actions: read | |
checks: write | |
pull-requests: write | |
id-token: write | |
contents: read | |
if: needs.run-core-cre-e2e-tests-setup.outputs.should-run == 'true' && needs.run-core-cre-e2e-tests-setup.outputs.with-regression == 'true' | |
uses: ./.github/workflows/cre-regression-system-tests.yaml | |
with: | |
ecr_name: ${{ inputs.ecr_name || 'chainlink-integration-tests' }} | |
chainlink_version: ${{ inputs.evm-ref || inputs.cl_ref || github.sha }} | |
chainlink_image_tag: ${{ inputs.evm-ref && format('{0}', inputs.evm-ref) || inputs.cl_ref && format('{0}', inputs.cl_ref) || format('{0}', github.sha) }} | |
secrets: inherit | |
run-core-e2e-tests-setup: | |
name: Run Core E2E Tests Setup | |
runs-on: ubuntu-latest | |
needs: [changes, labels] | |
permissions: | |
contents: read | |
outputs: | |
should-run: ${{ steps.form-inputs.outputs.should-run }} | |
workflow-name: ${{ steps.form-inputs.outputs.workflow-name }} | |
test-trigger: ${{ steps.form-inputs.outputs.test-trigger }} | |
steps: | |
- name: Form Inputs for Core E2E Tests | |
id: form-inputs | |
env: | |
GITHUB_EVENT_NAME: ${{ github.event_name }} | |
GITHUB_REF_TYPE: ${{ github.ref_type }} | |
CONTAINS_CHANGES: ${{ needs.changes.outputs.general-changes == 'true' || needs.changes.outputs.core-changes == 'true' }} | |
RUN_E2E_TESTS_LABEL_FOUND: ${{ needs.labels.outputs.run-e2e-tests-label-found || 'false' }} | |
run: | | |
if [[ "${GITHUB_EVENT_NAME}" == 'pull_request' ]]; then | |
# Run Core E2E tests on PRs only if the label "run-e2e-tests" is present, and there are relevant changes | |
echo "workflow-name=Run Core E2E Tests For PR" | tee -a "$GITHUB_OUTPUT" | |
echo "test-trigger=PR E2E Core Tests" | tee -a "$GITHUB_OUTPUT" | |
if [[ "${RUN_E2E_TESTS_LABEL_FOUND}" == 'true' ]]; then | |
# only run if the PR has the label "run-e2e-tests" | |
echo "should-run=true" | tee -a "$GITHUB_OUTPUT" | |
fi | |
elif [[ "${GITHUB_EVENT_NAME}" == 'merge_group' ]]; then | |
# Run Core E2E tests in the merge queue, if there are relevant changes | |
echo "workflow-name=Run Core E2E Tests For Merge Queue" | tee -a "$GITHUB_OUTPUT" | |
echo "test-trigger=Merge Queue E2E Core Tests" | tee -a "$GITHUB_OUTPUT" | |
echo "should-run=${CONTAINS_CHANGES}" | tee -a "$GITHUB_OUTPUT" | |
elif [[ "${GITHUB_EVENT_NAME}" == 'workflow_dispatch' ]]; then | |
# Always run Core E2E tests on workflow dispatch | |
echo "workflow-name=Run Core E2E Tests For Workflow Dispatch" | tee -a "$GITHUB_OUTPUT" | |
echo "test-trigger=Workflow Dispatch E2E Core Tests" | tee -a "$GITHUB_OUTPUT" | |
echo "should-run=true" | tee -a "$GITHUB_OUTPUT" | |
elif [[ "${GITHUB_EVENT_NAME}" == 'push' ]]; then | |
# Run Core E2E tests on push events, only if there are relevant changes or if it's a tag push | |
echo "workflow-name=Run Core E2E Tests For Push" | tee -a "$GITHUB_OUTPUT" | |
echo "test-trigger=Push E2E Core Tests" | tee -a "$GITHUB_OUTPUT" | |
if [[ "${CONTAINS_CHANGES}" == 'true' || "${GITHUB_REF_TYPE}" == 'tag' ]]; then | |
echo "should-run=true" | tee -a "$GITHUB_OUTPUT" | |
fi | |
else | |
echo "workflow-name=Run Core E2E Tests For Unknown Event" | tee -a "$GITHUB_OUTPUT" | |
echo "test-trigger=Unknown E2E Core Tests" | tee -a "$GITHUB_OUTPUT" | |
echo "should-run=false" | tee -a "$GITHUB_OUTPUT" | |
fi | |
run-core-e2e-tests: | |
needs: [run-core-e2e-tests-setup, build-chainlink, changes, labels] | |
name: ${{ needs.run-core-e2e-tests-setup.outputs.workflow-name }} | |
permissions: | |
actions: read | |
checks: write | |
pull-requests: write | |
id-token: write | |
contents: read | |
if: needs.run-core-e2e-tests-setup.outputs.should-run == 'true' | |
uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@a1273177bb5fc9577ec88364df09e95e102e87d1 # 2025-10-06 | |
with: | |
workflow_name: ${{ needs.run-core-e2e-tests-setup.outputs.workflow-name }} | |
chainlink_version: ${{ inputs.evm-ref || inputs.cl_ref || github.sha }} | |
test_path: .github/e2e-tests.yml | |
test_trigger: ${{ needs.run-core-e2e-tests-setup.outputs.test-trigger }} | |
upload_cl_node_coverage_artifact: true | |
enable_otel_traces_for_ocr2_plugins: ${{ contains(join(github.event.pull_request.labels.*.name, ' '), 'enable tracing') }} | |
use-self-hosted-runners: ${{ needs.labels.outputs.should-use-self-hosted-runners }} | |
ecr_name: ${{ inputs.ecr_name || 'chainlink-integration-tests' }} | |
quarantine: "true" | |
secrets: | |
QA_AWS_REGION: ${{ secrets.QA_AWS_REGION }} | |
QA_AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }} | |
QA_AWS_ACCOUNT_NUMBER: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }} | |
PROD_AWS_ACCOUNT_NUMBER: ${{ secrets.AWS_ACCOUNT_ID_PROD }} | |
QA_PYROSCOPE_INSTANCE: ${{ secrets.QA_PYROSCOPE_INSTANCE }} | |
QA_PYROSCOPE_KEY: ${{ secrets.QA_PYROSCOPE_KEY }} | |
GRAFANA_INTERNAL_TENANT_ID: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }} | |
GRAFANA_INTERNAL_BASIC_AUTH: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }} | |
GRAFANA_INTERNAL_HOST: ${{ secrets.GRAFANA_INTERNAL_HOST }} | |
GRAFANA_INTERNAL_URL_SHORTENER_TOKEN: ${{ secrets.GRAFANA_INTERNAL_URL_SHORTENER_TOKEN }} | |
LOKI_TENANT_ID: ${{ secrets.LOKI_TENANT_ID }} | |
LOKI_URL: ${{ secrets.LOKI_URL }} | |
LOKI_BASIC_AUTH: ${{ secrets.LOKI_BASIC_AUTH }} | |
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
AWS_REGION: ${{ secrets.QA_AWS_REGION }} | |
AWS_OIDC_IAM_ROLE_VALIDATION_PROD_ARN: ${{ secrets.AWS_OIDC_IAM_ROLE_VALIDATION_PROD_ARN }} | |
AWS_API_GW_HOST_GRAFANA: ${{ secrets.AWS_API_GW_HOST_GRAFANA }} | |
SLACK_BOT_TOKEN: ${{ secrets.QA_SLACK_API_KEY }} | |
OPTIONAL_GATI_AWS_ROLE_ARN: ${{ secrets.AWS_OIDC_GLOBAL_READ_ONLY_TOKEN_ISSUER_ROLE_ARN }} | |
OPTIONAL_GATI_LAMBDA_URL: ${{ secrets.AWS_INFRA_RELENG_TOKEN_ISSUER_LAMBDA_URL}} | |
TRUNK_API_KEY: ${{ secrets.TRUNK_API_KEY }} | |
run-ccip-e2e-tests-setup: | |
name: Run CCIP E2E Tests Setup | |
runs-on: ubuntu-latest | |
needs: [changes, labels] | |
permissions: | |
contents: read | |
outputs: | |
should-run: ${{ steps.form-inputs.outputs.should-run }} | |
workflow-name: ${{ steps.form-inputs.outputs.workflow-name }} | |
test-trigger: ${{ steps.form-inputs.outputs.test-trigger }} | |
steps: | |
- name: Form Inputs for Core E2E Tests | |
id: form-inputs | |
env: | |
GITHUB_EVENT_NAME: ${{ github.event_name }} | |
GITHUB_REF_TYPE: ${{ github.ref_type }} | |
CONTAINS_CHANGES: ${{ needs.changes.outputs.general-changes == 'true' || needs.changes.outputs.core-changes == 'true' }} | |
RUN_E2E_TESTS_LABEL_FOUND: ${{ needs.labels.outputs.run-e2e-tests-label-found || 'false' }} | |
run: | | |
if [[ "${GITHUB_EVENT_NAME}" == 'pull_request' ]]; then | |
# Run Core E2E tests on PRs only if the label "run-e2e-tests" is present, and there are relevant changes | |
echo "workflow-name=Run CCIP E2E Tests For PR" | tee -a "$GITHUB_OUTPUT" | |
echo "test-trigger=PR E2E CCIP Tests" | tee -a "$GITHUB_OUTPUT" | |
if [[ "${RUN_E2E_TESTS_LABEL_FOUND}" == 'true' ]]; then | |
# only run if the PR has the label "run-e2e-tests" | |
echo "should-run=true" | tee -a "$GITHUB_OUTPUT" | |
fi | |
elif [[ "${GITHUB_EVENT_NAME}" == 'merge_group' ]]; then | |
# Run Core E2E tests in the merge queue, if there are relevant changes | |
echo "workflow-name=Run CCIP E2E Tests For Merge Queue" | tee -a "$GITHUB_OUTPUT" | |
echo "test-trigger=Merge Queue E2E CCIP Tests" | tee -a "$GITHUB_OUTPUT" | |
echo "should-run=${CONTAINS_CHANGES}" | tee -a "$GITHUB_OUTPUT" | |
elif [[ "${GITHUB_EVENT_NAME}" == 'workflow_dispatch' ]]; then | |
# Always run Core E2E tests on workflow dispatch | |
echo "workflow-name=Run CCIP E2E Tests For Workflow Dispatch" | tee -a "$GITHUB_OUTPUT" | |
echo "test-trigger=Workflow Dispatch E2E CCIP Tests" | tee -a "$GITHUB_OUTPUT" | |
echo "should-run=true" | tee -a "$GITHUB_OUTPUT" | |
elif [[ "${GITHUB_EVENT_NAME}" == 'push' ]]; then | |
# Run Core E2E tests on push events, only if there are relevant changes or if it's a tag push | |
echo "workflow-name=Run CCIP E2E Tests For Push" | tee -a "$GITHUB_OUTPUT" | |
echo "test-trigger=Push E2E CCIP Tests" | tee -a "$GITHUB_OUTPUT" | |
if [[ "${CONTAINS_CHANGES}" == 'true' || "${GITHUB_REF_TYPE}" == 'tag' ]]; then | |
echo "should-run=true" | tee -a "$GITHUB_OUTPUT" | |
fi | |
else | |
echo "workflow-name=Run Core E2E Tests For Unknown Event" | tee -a "$GITHUB_OUTPUT" | |
echo "test-trigger=Unknown E2E Core Tests" | tee -a "$GITHUB_OUTPUT" | |
echo "should-run=false" | tee -a "$GITHUB_OUTPUT" | |
fi | |
run-ccip-e2e-tests: | |
name: ${{ needs.run-ccip-e2e-tests-setup.outputs.workflow-name }} | |
permissions: | |
actions: read | |
checks: write | |
pull-requests: write | |
id-token: write | |
contents: read | |
needs: [build-chainlink, run-ccip-e2e-tests-setup, changes, labels] | |
if: needs.run-ccip-e2e-tests-setup.outputs.should-run == 'true' | |
uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@a1273177bb5fc9577ec88364df09e95e102e87d1 # 2025-10-06 | |
with: | |
workflow_name: ${{ needs.run-ccip-e2e-tests-setup.outputs.workflow-name }} | |
chainlink_version: ${{ inputs.evm-ref || inputs.cl_ref || github.sha }} | |
test_path: .github/e2e-tests.yml | |
test_trigger: ${{ needs.run-ccip-e2e-tests-setup.outputs.test-trigger }} | |
upload_cl_node_coverage_artifact: true | |
enable_otel_traces_for_ocr2_plugins: ${{ contains(join(github.event.pull_request.labels.*.name, ' '), 'enable tracing') }} | |
use-self-hosted-runners: ${{ needs.labels.outputs.should-use-self-hosted-runners }} | |
ecr_name: ${{ inputs.ecr_name || 'chainlink-integration-tests' }} | |
team: "CCIP" | |
quarantine: "true" | |
secrets: | |
QA_AWS_REGION: ${{ secrets.QA_AWS_REGION }} | |
QA_AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }} | |
QA_AWS_ACCOUNT_NUMBER: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }} | |
PROD_AWS_ACCOUNT_NUMBER: ${{ secrets.AWS_ACCOUNT_ID_PROD }} | |
QA_PYROSCOPE_INSTANCE: ${{ secrets.QA_PYROSCOPE_INSTANCE }} | |
QA_PYROSCOPE_KEY: ${{ secrets.QA_PYROSCOPE_KEY }} | |
GRAFANA_INTERNAL_TENANT_ID: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }} | |
GRAFANA_INTERNAL_BASIC_AUTH: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }} | |
GRAFANA_INTERNAL_HOST: ${{ secrets.GRAFANA_INTERNAL_HOST }} | |
GRAFANA_INTERNAL_URL_SHORTENER_TOKEN: ${{ secrets.GRAFANA_INTERNAL_URL_SHORTENER_TOKEN }} | |
LOKI_TENANT_ID: ${{ secrets.LOKI_TENANT_ID }} | |
LOKI_URL: ${{ secrets.LOKI_URL }} | |
LOKI_BASIC_AUTH: ${{ secrets.LOKI_BASIC_AUTH }} | |
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
AWS_REGION: ${{ secrets.QA_AWS_REGION }} | |
AWS_OIDC_IAM_ROLE_VALIDATION_PROD_ARN: ${{ secrets.AWS_OIDC_IAM_ROLE_VALIDATION_PROD_ARN }} | |
AWS_API_GW_HOST_GRAFANA: ${{ secrets.AWS_API_GW_HOST_GRAFANA }} | |
SLACK_BOT_TOKEN: ${{ secrets.QA_SLACK_API_KEY }} | |
MAIN_DNS_ZONE_PUBLIC_SDLC: ${{ secrets.MAIN_DNS_ZONE_PUBLIC_SDLC }} | |
AWS_K8S_CLUSTER_NAME_SDLC: ${{ secrets.AWS_K8S_CLUSTER_NAME_SDLC }} | |
OPTIONAL_GATI_AWS_ROLE_ARN: ${{ secrets.AWS_OIDC_GLOBAL_READ_ONLY_TOKEN_ISSUER_ROLE_ARN }} | |
OPTIONAL_GATI_LAMBDA_URL: ${{ secrets.AWS_INFRA_RELENG_TOKEN_ISSUER_LAMBDA_URL}} | |
TRUNK_API_KEY: ${{ secrets.TRUNK_API_KEY }} | |
check-e2e-test-results: | |
if: always() | |
name: ETH Smoke Tests | |
runs-on: ubuntu-latest | |
needs: | |
[ | |
build-chainlink, | |
run-core-e2e-tests, | |
run-ccip-e2e-tests, | |
run-core-cre-e2e-tests, | |
run-core-cre-e2e-regression-tests, | |
] | |
steps: | |
- name: Check Core test results | |
id: check_core_results | |
run: | | |
results='${{ needs.run-core-e2e-tests.outputs.test_results }}' | |
echo "Core e2e test results:" | |
echo "$results" | jq . | |
node_migration_tests_failed=$(echo $results | jq '[.[] | select(.id == "integration-tests/migration/upgrade_version_test.go:*" ) | select(.result != "success")] | length > 0') | |
echo "node_migration_tests_failed=$node_migration_tests_failed" >> $GITHUB_OUTPUT | |
- name: Check CCIP test results | |
id: check_ccip_results | |
run: | | |
if [[ '${{ needs.run-ccip-e2e-tests.result }}' != 'skipped' ]]; then | |
results='${{ needs.run-ccip-e2e-tests.outputs.test_results }}' | |
echo "CCIP test results:" | |
echo "$results" | jq . | |
else | |
echo "CCIP tests were skipped." | |
fi | |
- name: Fail the job if core tests were not successful | |
if: always() | |
env: | |
RESULT: ${{ needs.run-core-e2e-tests.result }} | |
run: | | |
if [[ "${RESULT}" == "failure" ]]; then | |
echo "::error::Core E2E tests failed." | |
exit 1 | |
elif [[ "${RESULT}" == "cancelled" ]]; then | |
echo "::error::Core E2E tests were cancelled." | |
exit 1 | |
elif [[ "${RESULT}" == "skipped" ]]; then | |
echo "::warning::Core E2E tests were skipped." | |
fi | |
- name: Fail the job if core CRE tests were not successful | |
if: always() | |
env: | |
RESULT: ${{ needs.run-core-cre-e2e-tests.result }} | |
run: | | |
if [[ "${RESULT}" == "failure" ]]; then | |
echo "::error::Core CRE E2E tests failed." | |
exit 1 | |
elif [[ "${RESULT}" == "cancelled" ]]; then | |
echo "::error::Core CRE E2E tests were cancelled." | |
exit 1 | |
elif [[ "${RESULT}" == "skipped" ]]; then | |
echo "::warning::Core CRE E2E tests were skipped." | |
fi | |
- name: Fail the job if core CRE tests were not successful | |
if: always() | |
env: | |
RESULT: ${{ needs.run-core-cre-e2e-regression-tests.result }} | |
run: | | |
if [[ "${RESULT}" == "failure" ]]; then | |
echo "::error::Core CRE E2E regression tests failed." | |
exit 1 | |
elif [[ "${RESULT}" == "cancelled" ]]; then | |
echo "::error::Core CRE E2E regression tests were cancelled." | |
exit 1 | |
elif [[ "${RESULT}" == "skipped" ]]; then | |
echo "::warning::Core CRE E2E regression tests were skipped." | |
fi | |
- name: Warn if CCIP tests were not successful | |
if: always() | |
env: | |
RESULT: ${{ needs.run-ccip-e2e-tests.result }} | |
run: | | |
if [[ "${RESULT}" == "failure" ]]; then | |
echo "::warning::CCIP E2E tests failed in one of the runs. Not failing as they are not mandatory." | |
elif [[ "${RESULT}" == "cancelled" ]]; then | |
echo "::warning::CCIP E2E tests were cancelled." | |
elif [[ "${RESULT}" == "skipped" ]]; then | |
echo "::warning::CCIP E2E tests were skipped." | |
fi | |
- name: Fail the job if Chainlink image wasn't built | |
if: always() && needs.build-chainlink.result == 'failure' | |
run: exit 1 | |
cleanup: | |
name: Clean up integration environment deployments | |
# If the job was cancelled, it typically means that it was manually stopped, or a new commit was pushed. | |
# By always running this, it delays the start of the next workflow run due to concurrency rules. | |
if: always() && !cancelled() | |
needs: | |
[ | |
run-core-e2e-tests, | |
run-ccip-e2e-tests, | |
run-core-cre-e2e-tests, | |
run-core-cre-e2e-regression-tests, | |
] | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout repo | |
if: ${{ github.event_name == 'pull_request' }} | |
uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
repository: smartcontractkit/chainlink | |
ref: ${{ env.CHAINLINK_REF }} | |
- name: 🧼 Clean up Environment | |
if: ${{ github.event_name == 'pull_request' }} | |
uses: ./.github/actions/delete-deployments | |
with: | |
environment: integration | |
ref: ${{ github.head_ref }} # See https://github.com/github/docs/issues/15319#issuecomment-1476705663 | |
show-chainlink-node-coverage: | |
name: Show Chainlink Node Go Coverage | |
if: false | |
# if: always() | |
needs: [run-core-e2e-tests, run-ccip-e2e-tests] | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout the repo | |
uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
repository: smartcontractkit/chainlink | |
ref: ${{ env.CHAINLINK_REF }} | |
- name: Download All Artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
path: cl_node_coverage_data | |
pattern: cl_node_coverage_data_* | |
merge-multiple: true | |
- name: Show Coverage | |
run: go run ./integration-tests/scripts/show_coverage.go "${{ github.workspace }}/cl_node_coverage_data/*/merged" | |
## Solana Section | |
solana-smoke-tests-setup: | |
name: Solana Smoke Tests Setup | |
# We don't directly merge dependabot PRs, so let's not waste the resources | |
if: ${{ github.actor != 'dependabot[bot]' }} | |
runs-on: ubuntu-latest | |
needs: [changes, labels] | |
permissions: | |
contents: read | |
outputs: | |
should-run-solana-tests: ${{ steps.run-tests.outputs.should-run-solana-tests }} | |
steps: | |
- name: Determine if Solana tests should run | |
id: run-tests | |
env: | |
GITHUB_EVENT_NAME: ${{ github.event_name }} | |
GITHUB_REF_TYPE: ${{ github.ref_type }} | |
CONTAINS_CHANGES: ${{ needs.changes.outputs.general-changes == 'true' || needs.changes.outputs.core-changes == 'true' }} | |
RUN_E2E_TESTS_LABEL_FOUND: ${{ needs.labels.outputs.run-e2e-tests-label-found || 'false' }} | |
INPUTS_RUN_SOLANA: ${{ inputs.run_solana }} | |
run: | | |
if [[ "${INPUTS_RUN_SOLANA}" == 'false' ]]; then | |
echo "Solana tests are disabled by input, skipping." | |
echo "should-run-solana-tests=false" | tee -a "$GITHUB_OUTPUT" | |
elif [[ "${GITHUB_EVENT_NAME}" == 'pull_request' ]]; then | |
# Run Solana tests on PRs only if the label "run-e2e-tests" is present, and there are relevant changes | |
if [[ "${RUN_E2E_TESTS_LABEL_FOUND}" == 'true' && "${CONTAINS_CHANGES}" == 'true' ]]; then | |
echo "Solana tests will run on PR with label and relevant changes." | |
echo "should-run-solana-tests=true" | tee -a "$GITHUB_OUTPUT" | |
fi | |
elif [[ "${GITHUB_EVENT_NAME}" == 'merge_group' ]]; then | |
# Run Solana tests in the merge queue, if there are relevant changes | |
echo "Solana tests will run in the merge queue." | |
echo "should-run-solana-tests=${CONTAINS_CHANGES}" | tee -a "$GITHUB_OUTPUT" | |
elif [[ "${GITHUB_EVENT_NAME}" == 'workflow_dispatch' ]]; then | |
# Always run Solana tests on workflow dispatch | |
echo "Solana tests will run on workflow dispatch." | |
echo "should-run-solana-tests=true" | tee -a "$GITHUB_OUTPUT" | |
elif [[ "${GITHUB_EVENT_NAME}" == 'push' ]]; then | |
# Run Solana tests on push events, only if there are relevant changes or if it's a tag push | |
if [[ "${CONTAINS_CHANGES}" == 'true' || "${GITHUB_REF_TYPE}" == 'tag' ]]; then | |
echo "Solana tests will run on push with relevant changes or tag push." | |
echo "should-run-solana-tests=true" | tee -a "$GITHUB_OUTPUT" | |
fi | |
else | |
echo "Solana tests will not run for this event type: ${GITHUB_EVENT_NAME}." | |
echo "should-run-solana-tests=false" | tee -a "$GITHUB_OUTPUT" | |
fi | |
get-solana-sha: | |
if: needs.solana-smoke-tests-setup.outputs.should-run-solana-tests == 'true' | |
name: Get Solana Sha From Go Mod | |
environment: Integration | |
runs-on: ubuntu-latest | |
needs: [solana-smoke-tests-setup] | |
permissions: | |
contents: read | |
outputs: | |
sha: ${{ steps.getsha.outputs.sha }} | |
steps: | |
- name: Checkout the repo | |
uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
repository: smartcontractkit/chainlink | |
ref: ${{ env.CHAINLINK_REF }} | |
- name: Setup Go | |
uses: ./.github/actions/setup-go | |
with: | |
only-modules: "true" | |
- name: Get the sha from go mod | |
id: getshortsha | |
run: | | |
sol_ver=$(go list -m -json github.com/smartcontractkit/chainlink-solana | jq -r .Version) | |
if [ -z "${sol_ver}" ]; then | |
echo "Error: could not get the solana version from the go.mod file, look above for error(s)" | |
exit 1 | |
fi | |
short_sha="${sol_ver##*-}" | |
echo "short sha is: ${short_sha}" | |
echo "short_sha=${short_sha}" | tee -a "$GITHUB_OUTPUT" | |
- name: Checkout solana | |
uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
repository: smartcontractkit/chainlink-solana | |
ref: develop | |
fetch-depth: 0 | |
path: solanapath | |
- name: Get long sha | |
id: getsha | |
run: | | |
cd solanapath | |
full_sha=$(git rev-parse ${{steps.getshortsha.outputs.short_sha}}^{}) # additional suffix allows handling tagged versions as well | |
if [ -z "${full_sha}" ]; then | |
echo "Error: could not get the full sha from the short sha using git, look above for error(s)" | |
exit 1 | |
fi | |
echo "sha is: ${full_sha}" | |
echo "sha=${full_sha}" | tee -a "$GITHUB_OUTPUT" | |
solana-test-image-exists: | |
environment: integration | |
permissions: | |
checks: write | |
pull-requests: write | |
id-token: write | |
contents: read | |
name: Check If Solana Test Image Exists | |
runs-on: ubuntu-latest | |
needs: [get-solana-sha] | |
outputs: | |
exists: ${{ steps.check-image.outputs.exists }} | |
steps: | |
- name: Check if image exists | |
id: check-image | |
uses: smartcontractkit/chainlink-github-actions/docker/image-exists@0ce1e67b254a4f041e03cc6f0e3afc987b47c7bd # v2.3.30 | |
with: | |
repository: chainlink-solana-tests | |
tag: ${{ needs.get-solana-sha.outputs.sha }} | |
AWS_REGION: ${{ secrets.QA_AWS_REGION }} | |
AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }} | |
solana-build-contracts: | |
name: Solana Build Artifacts | |
if: needs.solana-smoke-tests-setup.outputs.should-run-solana-tests == 'true' | |
environment: integration | |
permissions: | |
checks: write | |
pull-requests: write | |
id-token: write | |
contents: read | |
runs-on: ubuntu22.04-8cores-32GB | |
needs: | |
[ | |
changes, | |
solana-test-image-exists, | |
get-solana-sha, | |
solana-smoke-tests-setup, | |
] | |
steps: | |
- name: Checkout the solana repo | |
uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
repository: smartcontractkit/chainlink-solana | |
ref: ${{ needs.get-solana-sha.outputs.sha }} | |
- name: Build contracts | |
if: needs.solana-test-image-exists.outputs.exists == 'false' | |
uses: smartcontractkit/chainlink-solana/.github/actions/build_contract_artifacts@841f6229b6a0be0114c47cb676b1136d92f935c9 # node20 update on may 10, 2024 | |
with: | |
ref: ${{ needs.get-solana-sha.outputs.sha }} | |
runner-os: ${{ runner.os }} | |
solana-build-test-image: | |
name: Solana Build Test Image | |
if: needs.solana-smoke-tests-setup.outputs.should-run-solana-tests == 'true' | |
environment: integration | |
permissions: | |
checks: write | |
pull-requests: write | |
id-token: write | |
contents: read | |
runs-on: ubuntu22.04-8cores-32GB | |
needs: | |
[ | |
solana-build-contracts, | |
solana-test-image-exists, | |
changes, | |
get-solana-sha, | |
solana-smoke-tests-setup, | |
] | |
env: | |
CONTRACT_ARTIFACTS_PATH: contracts/target/deploy | |
GOTOOLCHAIN: auto | |
steps: | |
- name: Checkout the repo | |
if: needs.solana-test-image-exists.outputs.exists == 'false' | |
uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
repository: smartcontractkit/chainlink-solana | |
ref: ${{ needs.get-solana-sha.outputs.sha }} | |
- name: Download Artifacts | |
if: needs.solana-test-image-exists.outputs.exists == 'false' | |
uses: actions/download-artifact@v4 | |
with: | |
name: artifacts | |
path: ${{ env.CONTRACT_ARTIFACTS_PATH }} | |
- name: Build Test Image | |
if: needs.solana-test-image-exists.outputs.exists == 'false' | |
uses: smartcontractkit/.github/actions/ctf-build-test-image@ctf-build-test-image/0.3.0 | |
with: | |
repository: chainlink-solana-tests | |
tag: ${{ needs.get-solana-sha.outputs.sha }} | |
suites: smoke | |
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 }} | |
solana-smoke-tests: | |
environment: integration | |
permissions: | |
checks: write | |
pull-requests: write | |
id-token: write | |
contents: read | |
name: Solana Smoke Tests | |
if: needs.solana-smoke-tests-setup.outputs.should-run-solana-tests == 'true' | |
runs-on: ${{ needs.labels.outputs.builder-runner-label || 'ubuntu22.04-8cores-32GB' }} | |
needs: | |
[ | |
build-chainlink, | |
solana-build-contracts, | |
solana-build-test-image, | |
labels, | |
changes, | |
get-solana-sha, | |
solana-smoke-tests-setup, | |
] | |
env: | |
CHAINLINK_COMMIT_SHA: ${{ inputs.evm-ref || inputs.cl_ref || github.sha }} | |
CHAINLINK_ENV_USER: ${{ github.actor }} | |
TEST_LOG_LEVEL: debug | |
CONTRACT_ARTIFACTS_PATH: contracts/target/deploy | |
steps: | |
- name: Enable S3 Cache for Self-Hosted Runners | |
# these env vars are set (and exposed) when it is a self-hosted runner with extras=s3-cache | |
if: ${{ env.RUNS_ON_INSTANCE_ID != '' && env.ACTIONS_CACHE_URL != '' }} | |
uses: runs-on/action@66d4449b717b5462159659523d1241051ff470b9 # v1 | |
- name: Checkout the repo | |
uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
repository: smartcontractkit/chainlink-solana | |
ref: ${{ needs.get-solana-sha.outputs.sha }} | |
- name: Run Setup | |
uses: smartcontractkit/.github/actions/ctf-setup-run-tests-environment@4ff522b1aef76519d2ced17b5d052927754fd34b # [email protected] | |
with: | |
go_mod_path: ./integration-tests/go.mod | |
cache_restore_only: true | |
cache_key_id: core-solana-e2e-${{ env.MOD_CACHE_VERSION }} | |
aws_registries: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }} | |
dockerhub_username: ${{ secrets.DOCKERHUB_READONLY_USERNAME }} | |
dockerhub_password: ${{ secrets.DOCKERHUB_READONLY_PASSWORD }} | |
QA_AWS_REGION: ${{ secrets.QA_AWS_REGION }} | |
QA_AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }} | |
main-dns-zone: ${{ secrets.MAIN_DNS_ZONE_PUBLIC_SDLC }} | |
k8s-cluster-name: ${{ secrets.AWS_K8S_CLUSTER_NAME_SDLC }} | |
- name: Pull Artifacts | |
run: | | |
IMAGE_NAME=${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink-solana-tests:${{ needs.get-solana-sha.outputs.sha }} | |
# Pull the Docker image | |
docker pull "$IMAGE_NAME" | |
# Create a container without starting it | |
CONTAINER_ID=$(docker create "$IMAGE_NAME") | |
# Copy the artifacts from the container | |
mkdir -p ./${{env.CONTRACT_ARTIFACTS_PATH}}/ | |
docker cp "$CONTAINER_ID:/go/testdir/${{env.CONTRACT_ARTIFACTS_PATH}}/" "./${{env.CONTRACT_ARTIFACTS_PATH}}/../" | |
# Remove the created container | |
docker rm "$CONTAINER_ID" | |
- name: Install Solana CLI # required for ensuring the local test validator is configured correctly | |
run: ./scripts/install-solana-ci.sh | |
- name: Install gauntlet | |
run: | | |
yarn --cwd ./gauntlet install --frozen-lockfile | |
yarn --cwd ./gauntlet build | |
yarn --cwd ./gauntlet gauntlet | |
- name: Generate config overrides | |
env: | |
VERSION: ${{ inputs.evm-ref || env.CHAINLINK_REF }} | |
run: | |
| # https://github.com/smartcontractkit/chainlink-testing-framework/lib/blob/main/config/README.md | |
cat << EOF > config.toml | |
[ChainlinkImage] | |
version="${{ env.VERSION }}" | |
[Common] | |
user="${{ github.actor }}" | |
internal_docker_repo = "${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com" | |
EOF | |
# shellcheck disable=SC2002 | |
BASE64_CONFIG_OVERRIDE=$(cat config.toml | base64 -w 0) | |
# shellcheck disable=SC2086 | |
echo ::add-mask::$BASE64_CONFIG_OVERRIDE | |
# shellcheck disable=SC2086 | |
echo "BASE64_CONFIG_OVERRIDE=$BASE64_CONFIG_OVERRIDE" >> $GITHUB_ENV | |
- name: Run Tests | |
uses: smartcontractkit/.github/actions/ctf-run-tests@725dd141dd77cc87dad420e9484416fc4ae26be2 # [email protected] | |
env: | |
E2E_TEST_CHAINLINK_IMAGE: ${{ env.CHAINLINK_IMAGE }} | |
E2E_TEST_SOLANA_SECRET: thisisatestingonlysecret | |
CHAINLINK_USER_TEAM: "BIX" | |
with: | |
test_command_to_run: export ENV_JOB_IMAGE=${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink-solana-tests:${{ needs.get-solana-sha.outputs.sha }} && make test_smoke | |
test_config_override_base64: ${{ env.BASE64_CONFIG_OVERRIDE }} | |
cl_repo: ${{ env.CHAINLINK_IMAGE }} | |
cl_image_tag: test-${{ inputs.evm-ref || env.CHAINLINK_REF }} | |
publish_check_name: Solana Smoke Test Results | |
go_mod_path: ./integration-tests/go.mod | |
cache_key_id: core-solana-e2e-${{ env.MOD_CACHE_VERSION }} | |
token: ${{ secrets.GITHUB_TOKEN }} | |
aws_registries: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }} | |
artifacts_name: solana-test-artifacts | |
artifacts_location: | | |
./integration-tests/smoke/logs | |
./integration-tests/smoke/db_dumps | |
./integration-tests/smoke/seth_artifacts | |
/tmp/gotest.log | |
QA_AWS_REGION: ${{ secrets.QA_AWS_REGION }} | |
QA_AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }} | |
run_setup: false | |
go_coverage_src_dir: /var/tmp/go-coverage | |
go_coverage_dest_dir: ${{ github.workspace }}/.covdata | |
main-dns-zone: ${{ secrets.MAIN_DNS_ZONE_PUBLIC_SDLC }} | |
k8s-cluster-name: ${{ secrets.AWS_K8S_CLUSTER_NAME_SDLC }} | |
- name: Upload Coverage Data | |
uses: actions/upload-artifact@v4 | |
timeout-minutes: 2 | |
continue-on-error: true | |
with: | |
name: cl_node_coverage_data_solana_tests | |
path: .covdata | |
retention-days: 1 | |
notify-test-failure: | |
name: Notify Test Failure | |
# TODO: uncomment this when we want to notify on test failures post-merge, if Phase 3 is necessary | |
if: false | |
# if: ${{ github.ref_name == 'develop' && failure() }} | |
needs: [check-e2e-test-results, solana-smoke-tests] | |
runs-on: ubuntu-latest | |
steps: | |
- name: Send slack notification for failed migration tests | |
id: send-slack-notification | |
uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0 | |
with: | |
errors: "true" | |
method: chat.postMessage | |
token: ${{ secrets.QA_SLACK_API_KEY }} | |
payload: | | |
{ | |
"channel": "C023GJUSQ0H", | |
"text": "E2E Tests Failed Post-Merge, Immediate Action Required", | |
"blocks": [ | |
{ | |
"type": "section", | |
"text": { | |
"type": "mrkdwn", | |
"text": "*:rotating_light: E2E Tests Failed Post-Merge, Immediate Action Required :rotating_light:*" | |
} | |
}, | |
{ | |
"type": "section", | |
"text": { | |
"type": "mrkdwn", | |
"text": "Alerting <!subteam^S04SLH4V4JJ|devex-cicd-oncall> and <@U01Q4N37KFG>, E2E tests failed for commit <${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }}|${{ github.sha }}> on run ID <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|${{ github.run_id }}>. This commit was already merged to develop by user `${{ github.actor }}`. Please follow instructions below to remedy the issue." | |
} | |
}, | |
{ | |
"type": "divider" | |
}, | |
{ | |
"type": "section", | |
"text": { | |
"type": "mrkdwn", | |
"text": "1. Use the `/gh-lookup ${{ github.actor }}` command to find the who made the commit.\n2. <https://smartcontract-it.atlassian.net/wiki/spaces/ENG/pages/597262421/Raising+an+Incident|Raise a Pager Duty Incident> with that engineer to fix the issue.\n3. Start a 1 hour timer. If the E2E tests cannot be made passing on `develop` branch by then, please use `git revert <last-green-commit>` to revert the `develop` branch back to a happy state.\n4. Write a quick summary of the actions taken and post it in a thread to this message." | |
} | |
} | |
] | |
} |