Skip to content

Integration Tests #122234

Integration Tests

Integration Tests #122234

# 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
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@v7
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" | tee -a "$GITHUB_OUTPUT"
- name: Enforce CTF Version
if: steps.condition-check.outputs.should-enforce == 'true'
uses: smartcontractkit/.github/actions/ctf-check-mod-version@21b0189c5fdca0318617d259634b1a91e6d80262 # ctf-check-mod-version@0.0.0
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:
# http://docs.github.com/en/actions/how-tos/deploy/configure-and-manage-deployments/control-deployments#using-environments-without-deployments
name: integration
deployment: false
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@v7
with:
persist-credentials: false
repository: smartcontractkit/chainlink
ref: ${{ inputs.cl_ref }}
- uses: dorny/paths-filter@7b450fff21473bca461d4b92ce414b9d0420d706 # v4.0.2
id: changes
with:
filters: |
general_changes:
- '.github/workflows/integration-tests.yml'
- '.github/workflows/cre-system-tests.yaml'
- '.github/workflows/cre-regression-system-tests.yaml'
- '.github/workflows/ccip-system-tests.yaml'
- '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:
- '.github/workflows/integration-tests.yml'
- '.github/workflows/ccip-system-tests.yaml'
- '.github/actions/**'
- 'integration-tests/**'
- 'core/capabilities/ccip/**'
- name: Decide which tests to run (rollout-only)
# To validate that this properly tests, we will run this beside the dorny/paths-filter actions
# before using its output to actually gate any jobs.
id: triggers
uses: smartcontractkit/.github/actions/advanced-triggers@advanced-triggers/v1
continue-on-error: true
with:
file-sets: |
go-files:
- "**/*.go"
- "**/go.mod"
- "**/go.sum"
core-files:
- "GNUmakefile"
- "core/**/*.go"
- "core/**/migrations/*.sql"
- "core/**/config/**/*.toml"
workflow-files:
- ".github/workflows/integration-tests.yml"
- ".github/workflows/ccip-system-tests.yaml"
- ".github/actions/**/*.y*ml"
docker-files:
- "**/*Dockerfile"
- "plugins/plugins.public.yaml"
- "plugins/plugins.private.yaml"
legacy-integ-test-files:
- "integration-tests/**"
system-test-files:
- "system-tests/**"
- "core/scripts/cre/**"
- ".github/workflows/cre-system-tests.yaml"
- ".github/workflows/cre-regression-system-tests.yaml"
core-test-files:
- "testdata/**"
- "core/**/testdata/**"
- "core/**/*_test.go"
deployment-test-files:
- "deployment/**/*_test.go"
- "deployment/**/testdata/**"
# Note:
# - for pull_request, merge_group, and push events, a trigger will resolve to true if any changed files match the path/glob patterns
# - exclusion-sets/negations are applied first, and therefore filter all changed files before inclusion sets are applied
# - by default these will resolve to true for schedule, and workflow_dispatch events
triggers: |
cre-e2e:
exclusion-sets: [ core-test-files, deployment-test-files, legacy-integ-test-files ]
inclusion-sets: [ go-files, core-files, workflow-files, docker-files, system-test-files ]
paths:
- "!deployment/**"
core-e2e:
exclusion-sets: [ core-test-files, deployment-test-files, system-test-files ]
inclusion-sets: [ go-files, core-files, workflow-files, docker-files, legacy-integ-test-files ]
paths:
- "!deployment/**"
ccip-e2e:
exclusion-sets: [ core-test-files, deployment-test-files, system-test-files ]
inclusion-sets: [ go-files, core-files, workflow-files, docker-files, legacy-integ-test-files ]
paths:
- "!deployment/**"
- "**/*ccip*"
- "**/*ccip*/**"
- ".github/workflows/ccip-system-tests.yaml"
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 }}
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)
if: github.event_name == 'pull_request'
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
# include unique label (core/plugins) to ensure jobs are not competing for the same runner
SH_BUILDER_RUNNER_CORE: runs-on=${{ github.run_id }}-core/cpu=32/memory=64/family=c7i+c8i+c6i+m7i/spot=co/extras=s3-cache+tmpfs
SH_BUILDER_RUNNER_PLUGINS: runs-on=${{ github.run_id }}-plugins/cpu=32/memory=64/family=c7i+c8i+c6i+m7i/spot=co/extras=s3-cache+tmpfs
run: |
if [[ "${OPT_OUT}" == "true" ]]; then
echo "builder-runner-label=${GH_BUILDER_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"
fi
build-chainlink:
name: Build Chainlink Image ${{ matrix.image.name }}
if: github.actor != 'dependabot[bot]'
environment:
# http://docs.github.com/en/actions/how-tos/deploy/configure-and-manage-deployments/control-deployments#using-environments-without-deployments
name: integration
deployment: false
runs-on: ${{ matrix.image.runner }}
needs: [labels, enforce-ctf-version, changes]
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: ""
cache-scope: core
any-should-run: >-
${{
github.event_name == 'workflow_dispatch' ||
needs.changes.outputs.general-changes == 'true' ||
needs.changes.outputs.core-changes == 'true' ||
needs.changes.outputs.cre-changes == 'true' ||
needs.changes.outputs.ccip-changes == 'true' ||
needs.labels.outputs.run-e2e-tests-label-found == 'true'
}}
- name: (plugins)
runner: ${{ needs.labels.outputs.builder-runner-label-plugins || 'ubuntu22.04-8cores-32GB' }}
dockerfile: plugins/chainlink.Dockerfile
tag-suffix: -plugins
cache-scope: plugins
any-should-run: >-
${{
github.event_name == 'workflow_dispatch' ||
needs.changes.outputs.general-changes == 'true' ||
needs.changes.outputs.core-changes == 'true' ||
needs.changes.outputs.cre-changes == 'true' ||
needs.labels.outputs.run-e2e-tests-label-found == 'true'
}}
steps:
- name: Enable S3 Cache for Self-Hosted Runners
uses: runs-on/action@4e5f72399b6b17f2e79c511c1b38a315a64d22dc # v2.2.0
- name: Check if image exists in ECR
id: check-image-exists
uses: smartcontractkit/.github/actions/ecr-image-exists@ecr-image-exists/0.2.0
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 build/no-build decision
id: explain
env:
EVENT_NAME: ${{ github.event_name }}
REF_NAME: ${{ github.ref_name }}
ANY_SHOULD_RUN: ${{ matrix.image.any-should-run }}
IMAGE_EXISTS: ${{ steps.check-image-exists.outputs.exists }}
run: |
if [[ "${EVENT_NAME}" == "push" && "${REF_NAME}" == "develop" ]]; then
echo "We force build on pushes to develop to populate the docker layer cache."
echo "build-image=true" | tee -a "$GITHUB_OUTPUT"
elif [[ "${ANY_SHOULD_RUN}" == "true" && "${IMAGE_EXISTS}" != "true" ]]; then
echo "We will build the image because the matrix's any-should-run is true and the image does not already exist in ECR."
echo "any-should-run is true when:"
echo " - For the non-plugins image: the CCIP v1.6 tests will be run."
echo " - For the plugins image: the core cre e2e tests will be run."
echo "build-image=true" | tee -a "$GITHUB_OUTPUT"
else
echo "We will not build the image because either the matrix's any-should-run is false or the image already exists in ECR."
echo "build-image=false" | tee -a "$GITHUB_OUTPUT"
fi
- name: Checkout the repo
if: steps.explain.outputs.build-image == 'true'
uses: actions/checkout@v7
with:
persist-credentials: false
repository: smartcontractkit/chainlink
ref: ${{ env.CHAINLINK_REF }}
- name: Build Chainlink Image
if: steps.explain.outputs.build-image == '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 }}
free-disk-space: "false"
docker-additional-build-args: |
CL_IS_PROD_BUILD=false
# go-get-overrides is empty when inputs.evm-ref is unset so ctf-build-image skips an unnecessary setup-go / go mod tidy.
go-get-overrides: >-
${{ inputs.evm-ref && format('chainlink-evm={0}', inputs.evm-ref) || '' }}
gati-role-arn: ${{ secrets.AWS_OIDC_CHAINLINK_READ_ONLY_TOKEN_ISSUER_ROLE_ARN }}
gati-lambda-url: ${{ secrets.AWS_INFRA_RELENG_TOKEN_ISSUER_LAMBDA_URL }}
cache-scope: ${{ matrix.image.cache-scope }}
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.cre-e2e-tests.outputs.should-run }}
with-regression: ${{ steps.cre-regression-tests.outputs.with-regression }}
steps:
- name: CRE E2E Tests
id: cre-e2e-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.cre-changes == 'true' }}
RUN_E2E_TESTS_LABEL_FOUND: ${{ needs.labels.outputs.run-e2e-tests-label-found }}
run: |
SHOULD_RUN="false"
# -- PULL REQUEST --
if [[ "$GITHUB_EVENT_NAME" == 'pull_request' ]]; then
if [[ "$CONTAINS_CHANGES" == 'true' || "$RUN_E2E_TESTS_LABEL_FOUND" == 'true' ]]; then
SHOULD_RUN="true"
fi
# -- MERGE GROUP --
elif [[ "$GITHUB_EVENT_NAME" == 'merge_group' ]]; then
if [[ "$CONTAINS_CHANGES" == 'true' ]]; then
SHOULD_RUN="true"
fi
# -- PUSH --
elif [[ "$GITHUB_EVENT_NAME" == 'push' ]]; then
if [[ "$CONTAINS_CHANGES" == 'true' || "$GITHUB_REF_TYPE" == 'tag' ]]; then
SHOULD_RUN="true"
fi
# -- WORKFLOW DISPATCH --
elif [[ "$GITHUB_EVENT_NAME" == 'workflow_dispatch' ]]; then
SHOULD_RUN="true"
fi
echo "should-run=${SHOULD_RUN}" | tee -a "$GITHUB_OUTPUT"
- name: CRE E2E Regression Tests
id: cre-regression-tests
env:
GITHUB_EVENT_NAME: ${{ github.event_name }}
IS_DEFAULT_BRANCH: ${{ github.ref_name == 'develop' }}
SKIP_E2E_TESTS_REGRESSION_LABEL_FOUND: ${{ needs.labels.outputs.skip-e2e-regression-label-found }}
run: |
SHOULD_RUN_REGRESSION="false"
# -- PULL REQUEST --
if [[ "$GITHUB_EVENT_NAME" == 'pull_request' ]]; then
if [[ "$SKIP_E2E_TESTS_REGRESSION_LABEL_FOUND" != 'true' ]]; then
SHOULD_RUN_REGRESSION="true"
fi
# -- PUSH --
elif [[ "$GITHUB_EVENT_NAME" == 'push' ]]; then
if [[ "$IS_DEFAULT_BRANCH" == 'true' ]]; then
SHOULD_RUN_REGRESSION="true"
fi
# -- WORKFLOW DISPATCH --
elif [[ "$GITHUB_EVENT_NAME" == 'workflow_dispatch' ]]; then
SHOULD_RUN_REGRESSION="true"
fi
echo "with-regression=${SHOULD_RUN_REGRESSION}" | tee -a "$GITHUB_OUTPUT"
run-core-cre-e2e-tests:
name: Run Core CRE E2E Tests
needs: [build-chainlink, run-core-cre-e2e-tests-setup, compile-tests]
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: "sdlc"
chainlink_image_repository_path: ${{ 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
needs: [build-chainlink, run-core-cre-e2e-tests-setup, compile-tests]
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: "sdlc"
chainlink_image_repository_path: ${{ 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-ccip-v1-6-e2e-tests-setup:
name: Run CCIP v1.6 E2E Tests Setup
runs-on: ubuntu-latest
needs: [changes, labels]
permissions:
contents: read
outputs:
should-run: ${{ steps.form-inputs.outputs.should-run }}
steps:
- name: Form Inputs for CCIP v1.6 E2E Tests
id: form-inputs
env:
GITHUB_EVENT_NAME: ${{ github.event_name }}
GITHUB_REF_TYPE: ${{ github.ref_type }}
CONTAINS_CHANGES: ${{ needs.changes.outputs.ccip-changes == 'true' }}
RUN_E2E_TESTS_LABEL_FOUND: ${{ needs.labels.outputs.run-e2e-tests-label-found || 'false' }}
run: |
if [[ "${GITHUB_EVENT_NAME}" == 'pull_request' ]]; then
# CCIP v1.6 E2E Tests run on merge queue (merge_group), not on PRs
echo "should-run=false" | tee -a "$GITHUB_OUTPUT"
elif [[ "${GITHUB_EVENT_NAME}" == 'merge_group' ]]; then
# Run CCIP v1.6 E2E Tests in the merge queue, if there are relevant changes
echo "should-run=${CONTAINS_CHANGES}" | tee -a "$GITHUB_OUTPUT"
elif [[ "${GITHUB_EVENT_NAME}" == 'workflow_dispatch' ]]; then
# Always Run CCIP v1.6 E2E Tests on workflow dispatch
echo "should-run=true" | tee -a "$GITHUB_OUTPUT"
elif [[ "${GITHUB_EVENT_NAME}" == 'push' ]]; then
# Run CCIP v1.6 E2E 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 "should-run=true" | tee -a "$GITHUB_OUTPUT"
else
echo "should-run=false" | tee -a "$GITHUB_OUTPUT"
fi
else
echo "should-run=false" | tee -a "$GITHUB_OUTPUT"
fi
# Central writer for the unified `integration-tests-v1` build cache consumed (restore-only) by
# CRE smoke + regression matrices and CCIP test suites.
# Keyed on go.sum hash to optimize parallel PR cache hits (Strategy A + B + C).
compile-tests:
name: Compile CRE & CCIP Tests
if: >-
${{
github.actor != 'dependabot[bot]' &&
(needs.run-core-cre-e2e-tests-setup.outputs.should-run == 'true' ||
needs.run-ccip-v1-6-e2e-tests-setup.outputs.should-run == 'true')
}}
needs:
- run-core-cre-e2e-tests-setup
- run-ccip-v1-6-e2e-tests-setup
runs-on: runs-on=${{ github.run_id }}-compile/cpu=32/ram=64/family=c6i+c7i+c8i/spot=co/volume=100GB/extras=s3-cache
environment:
name: integration
deployment: false
permissions:
id-token: write
contents: read
steps:
- name: Enable S3 Cache for Self-Hosted Runners
uses: runs-on/action@4e5f72399b6b17f2e79c511c1b38a315a64d22dc # v2.2.0
- name: Setup GitHub token using GATI
id: github-token
uses: smartcontractkit/.github/actions/setup-github-token@setup-github-token/v1
with:
aws-role-arn: ${{ secrets.AWS_OIDC_CHAINLINK_READ_ONLY_TOKEN_ISSUER_ROLE_ARN }}
aws-lambda-url: ${{ secrets.AWS_INFRA_RELENG_TOKEN_ISSUER_LAMBDA_URL }}
aws-region: us-west-2
aws-role-duration-seconds: "1800"
set-git-config: "true"
- name: Checkout the repo
uses: actions/checkout@v7
with:
persist-credentials: false
repository: smartcontractkit/chainlink
ref: ${{ env.CHAINLINK_REF }}
- name: Set up Go for compilation
id: setup-go
uses: smartcontractkit/.github/actions/ctf-setup-go@fa1d48a33e24f9b3b9f8c52e99a578a4597cb2a5 # v0.4.0
with:
# Key the cache on go.sum hash; restore-only on PRs to eliminate upload overhead and cache thrashing.
go_mod_path: ./system-tests/tests/go.mod
cache_key_id: integration-tests-v1
cache_builds: true
cache_restore_only: ${{ github.ref_name != 'develop' }}
should_tidy: false
no_cache: false
gati_token: ${{ steps.github-token.outputs.access-token }}
# No cache-hit short-circuit: ctf-setup-go@v0.4.0 exposes no `cache-hit` output,
# and this job's purpose is to (re)populate the shared build cache regardless.
- name: Compile E2E tests
shell: bash
env:
SHOULD_RUN_CRE: ${{ needs.run-core-cre-e2e-tests-setup.outputs.should-run }}
SHOULD_RUN_CCIP: ${{ needs.run-ccip-v1-6-e2e-tests-setup.outputs.should-run }}
run: |
set -euo pipefail
mkdir -p "$GITHUB_WORKSPACE/.gotmp"
export GOTMPDIR="$GITHUB_WORKSPACE/.gotmp"
mkdir -p "$GITHUB_WORKSPACE/system-tests/tests/bin"
mkdir -p "$GITHUB_WORKSPACE/integration-tests/bin"
cre_pid=""
ccip_pid=""
if [[ "${SHOULD_RUN_CRE}" == "true" ]]; then
(
set -euo pipefail
echo "Compiling CRE tests and CLI in parallel..."
cd "$GITHUB_WORKSPACE/system-tests/tests"
go mod download
go test -c -ldflags="-s -w" -o ./bin/cre-smoke.test ./smoke/cre &
p1=$!
go test -c -ldflags="-s -w" -o ./bin/cre-regression.test ./regression/cre &
p2=$!
(cd "$GITHUB_WORKSPACE/core/scripts/cre/environment" && go build -ldflags="-s -w" -o "$GITHUB_WORKSPACE/system-tests/tests/bin/cre-env" .) &
p3=$!
set +e
wait "$p1"; p1_exit=$?
wait "$p2"; p2_exit=$?
wait "$p3"; p3_exit=$?
set -e
if [[ "$p1_exit" -ne 0 || "$p2_exit" -ne 0 || "$p3_exit" -ne 0 ]]; then
echo "Compilation failed (cre-smoke=$p1_exit, cre-regression=$p2_exit, cre-env=$p3_exit)" >&2
exit 1
fi
) &
cre_pid=$!
fi
if [[ "${SHOULD_RUN_CCIP}" == "true" ]]; then
(
set -euo pipefail
echo "Compiling CCIP tests in parallel..."
cd "$GITHUB_WORKSPACE/integration-tests"
go mod download
go test -c -tags embed -ldflags="-s -w" -o ./bin/ccip-smoke.test ./smoke/ccip
) &
ccip_pid=$!
fi
if [ -n "$cre_pid" ]; then wait "$cre_pid"; fi
if [ -n "$ccip_pid" ]; then wait "$ccip_pid"; fi
rm -rf "$GITHUB_WORKSPACE/.gotmp"
- name: Cache Pre-Compiled CRE Test Binaries
if: needs.run-core-cre-e2e-tests-setup.outputs.should-run == 'true'
uses: actions/cache/save@v6
with:
path: system-tests/tests/bin/
key: test-binaries-cre-${{ inputs.evm-ref || inputs.cl_ref || github.sha }}
- name: Cache Pre-Compiled CCIP Test Binaries
if: needs.run-ccip-v1-6-e2e-tests-setup.outputs.should-run == 'true'
uses: actions/cache/save@v6
with:
path: integration-tests/bin/
key: test-binaries-${{ inputs.evm-ref || inputs.cl_ref || github.sha }}
run-ccip-v1-6-e2e-tests:
needs: [run-ccip-v1-6-e2e-tests-setup, build-chainlink, compile-tests]
name: Run CCIP v1.6 E2E Tests
permissions:
actions: read
checks: write
pull-requests: write
id-token: write
contents: read
if: needs.run-ccip-v1-6-e2e-tests-setup.outputs.should-run == 'true'
uses: ./.github/workflows/ccip-system-tests.yaml
with:
ecr: "sdlc"
chainlink_image_repository_path: ${{ 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
check-e2e-test-results:
if: always()
name: ETH Smoke Tests
runs-on: ubuntu-latest
needs:
[
build-chainlink,
run-ccip-v1-6-e2e-tests,
run-core-cre-e2e-tests,
run-core-cre-e2e-regression-tests,
]
steps:
- name: Check all E2E test results
if: always()
env:
CCIP_RESULT: ${{ needs.run-ccip-v1-6-e2e-tests.result }}
CRE_RESULT: ${{ needs.run-core-cre-e2e-tests.result }}
CRE_REGRESSION_RESULT: ${{ needs.run-core-cre-e2e-regression-tests.result }}
BUILD_RESULT: ${{ needs.build-chainlink.result }}
run: |
check_result() {
local name="$1" result="$2"
case "${result}" in
failure)
echo "::error::${name} failed."
return 1
;;
cancelled)
echo "::error::${name} cancelled."
return 1
;;
skipped)
echo "::warning::${name} skipped."
;;
esac
return 0
}
failed=0
check_result "CCIP v1.6 E2E tests" "${CCIP_RESULT}" || failed=1
check_result "Core CRE E2E tests" "${CRE_RESULT}" || failed=1
check_result "Core CRE E2E regression tests" "${CRE_REGRESSION_RESULT}" || failed=1
check_result "Chainlink image build" "${BUILD_RESULT}" || failed=1
if [[ "$failed" -eq 1 ]]; then
exit 1
fi