[TT-1005] EVM versions pipeline #2
Workflow file for this run
This file contains 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
name: EVM Node Version Compatibility Tests | |
on: | |
merge_group: | |
pull_request: | |
push: | |
tags: | |
- "*" | |
workflow_dispatch: | |
inputs: | |
base64_test_list: | |
description: Base64 encoded test list (same format as ./integration-tests/evm_node_compatibility_test_list.json) | |
required: false | |
type: string | |
env: | |
CHAINLINK_IMAGE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink | |
INTERNAL_DOCKER_REPO: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com | |
MOD_CACHE_VERSION: 2 | |
jobs: | |
# Check if go.mod has changed | |
check-dependency-bump: | |
runs-on: ubuntu-latest | |
outputs: | |
dependency_bumped: ${{ steps.changes.outputs.dependency_bumped }} | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v2 | |
with: | |
repository: smartcontractkit/ccip | |
- name: Fetch develop branch | |
run: git fetch --depth=1 origin ccip-develop:ccip-develop | |
- name: Check for go.mod changes | |
id: changes | |
run: | | |
if git diff origin/ccip-develop -- go.mod | grep -q 'github.com/ethereum/go-ethereum'; then | |
echo "Dependency ethereum/go-ethereum was changed" | |
echo "dependency_bumped=true" >> "$GITHUB_OUTPUT" | |
else | |
echo "No relevant dependency bump detected." | |
echo "dependency_bumped=false" >> "$GITHUB_OUTPUT" | |
fi | |
# Build Test Dependencies | |
build-chainlink-ccip: | |
if: needs.check-dependency-bump.outputs.dependency_bumped == 'true' || github.event_name == 'workflow_dispatch' | |
needs: [check-dependency-bump] | |
environment: integration | |
permissions: | |
id-token: write | |
contents: read | |
name: Build Chainlink CCIP Image | |
runs-on: ubuntu-latest | |
steps: | |
- name: Collect Metrics | |
id: collect-gha-metrics | |
uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0 | |
with: | |
org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }} | |
basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }} | |
hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }} | |
this-job-name: Build Chainlink CCIP Image | |
continue-on-error: true | |
- name: Checkout the repo | |
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
with: | |
repository: smartcontractkit/ccip | |
ref: ${{ github.event.pull_request.head.sha || github.event.merge_group.head_sha }} | |
- name: Build Chainlink CCIP Image | |
uses: ./.github/actions/build-chainlink-image | |
with: | |
tag_suffix: "" | |
dockerfile: core/chainlink.Dockerfile | |
git_commit_sha: ${{ github.sha }} | |
AWS_REGION: ${{ secrets.QA_AWS_REGION }} | |
AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }} | |
build-tests: | |
if: needs.check-dependency-bump.outputs.dependency_bumped == 'true' || github.event_name == 'workflow_dispatch' | |
needs: [check-dependency-bump] | |
environment: integration | |
permissions: | |
id-token: write | |
contents: read | |
name: Build Tests Binary | |
runs-on: ubuntu-latest | |
steps: | |
- name: Collect Metrics | |
id: collect-gha-metrics | |
uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0 | |
with: | |
org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }} | |
basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }} | |
hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }} | |
this-job-name: Build Tests Binary | |
continue-on-error: true | |
- name: Checkout the repo | |
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
with: | |
repository: smartcontractkit/ccip | |
ref: ${{ inputs.cl_ref || github.event.pull_request.head.sha || github.event.merge_group.head_sha }} | |
- name: Build Test Image | |
if: needs.changes.outputs.src == 'true' || github.event_name == 'workflow_dispatch' | |
uses: ./.github/actions/build-test-image | |
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 }} | |
build-test-matrix: | |
if: needs.check-dependency-bump.outputs.dependency_bumped == 'true' || github.event_name == 'workflow_dispatch' | |
needs: [check-dependency-bump] | |
runs-on: ubuntu-latest | |
name: Build Test Matrix | |
outputs: | |
matrix: ${{ env.JOB_MATRIX_JSON }} | |
steps: | |
- name: Checkout the repo | |
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
with: | |
repository: smartcontractkit/ccip | |
- name: Setup environment variables | |
run: | | |
echo "BASE64_TEST_LIST=${{ github.event.inputs.base64_test_list }}" >> $GITHUB_ENV | |
- name: Decode Base64 Test List Input if Set | |
id: decode-base64-test-list | |
if: env.BASE64_TEST_LIST != '' | |
run: | | |
echo "Decoding base64 test list..." | |
DECODED_BASE64_TEST_LIST=$(echo $BASE64_TEST_LIST | base64 -d) | |
echo $DECODED_BASE64_TEST_LIST | |
cd ./integration-tests | |
echo $DECODED_BASE64_TEST_LIST >> ./ccip-tests/smoke/evm_node_compatibility_test_list.json | |
- name: Override Test List If Present | |
if: env.BASE64_TEST_LIST == '' | |
id: build-test-matrix-list | |
run: | | |
cd ./integration-tests | |
cp ./ccip-tests/smoke/evm_node_compatibility_test_list.json . | |
- name: Create Test Matrix | |
id: create-test-matrix-list | |
run: | | |
cd ./integration-tests | |
JOB_MATRIX_JSON=$(./scripts/buildEvmClientTestMatrixList.sh ./evm_node_compatibility_test_list.json ubuntu-latest) | |
echo "JOB_MATRIX_JSON=${JOB_MATRIX_JSON}" >> $GITHUB_ENV | |
echo $JOB_MATRIX_JSON | jq . | |
# End Build Test Dependencies | |
evm-node-compatiblity-matrix: | |
environment: integration | |
permissions: | |
checks: write | |
pull-requests: write | |
id-token: write | |
contents: read | |
needs: | |
[check-dependency-bump, build-chainlink-ccip, build-tests, build-test-matrix] | |
env: | |
SELECTED_NETWORKS: SIMULATED | |
CHAINLINK_COMMIT_SHA: ${{ github.sha }} | |
CHAINLINK_ENV_USER: ${{ github.actor }} | |
TEST_LOG_LEVEL: debug | |
strategy: | |
fail-fast: false | |
matrix: | |
evm_node: ${{fromJson(needs.build-test-matrix.outputs.matrix)}} | |
runs-on: ${{ matrix.evm_node.os }} | |
name: EVM node compatibility of ${{ matrix.evm_node.product }} with ${{ matrix.evm_node.docker_image }} | |
steps: | |
- name: Collect Metrics | |
if: needs.changes.outputs.src == 'true' || github.event_name == 'workflow_dispatch' | |
id: collect-gha-metrics | |
uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0 | |
with: | |
basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }} | |
hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }} | |
org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }} | |
this-job-name: EVM node compatibility ${{ matrix.evm_node.name }} ${{ matrix.evm_node.docker_image }} | |
test-results-file: '{"testType":"go","filePath":"/tmp/gotest.log"}' | |
continue-on-error: true | |
- name: Checkout the repo | |
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
with: | |
repository: smartcontractkit/ccip | |
ref: ${{ github.event.pull_request.head.sha || github.event.merge_group.head_sha }} | |
- name: Build Go Test Command | |
id: build-go-test-command | |
run: | | |
# if the matrix.evm_node.run is set, use it for a different command | |
if [ "${{ matrix.evm_node.run }}" != "" ]; then | |
echo "run_command=${{ matrix.evm_node.run }} ./ccip-tests/smoke/${{ matrix.evm_node.product }}_test.go" >> "$GITHUB_OUTPUT" | |
else | |
echo "run_command=./ccip-tests/smoke/${{ matrix.evm_node.product }}_test.go" >> "$GITHUB_OUTPUT" | |
fi | |
- name: Prepare Base64 TOML override | |
uses: ./.github/actions/setup-create-base64-config | |
with: | |
runId: ${{ github.run_id }} | |
testLogCollect: ${{ vars.TEST_LOG_COLLECT }} | |
selectedNetworks: ${{ env.SELECTED_NETWORKS }} | |
chainlinkImage: ${{ env.CHAINLINK_IMAGE }} | |
chainlinkVersion: ${{ github.sha }} | |
pyroscopeServer: ${{ matrix.product.pyroscope_env == '' && '' || !startsWith(github.ref, 'refs/tags/') && '' || secrets.QA_PYROSCOPE_INSTANCE }} # Avoid sending blank envs https://github.com/orgs/community/discussions/25725 | |
pyroscopeEnvironment: ${{ matrix.product.pyroscope_env }} | |
pyroscopeKey: ${{ secrets.QA_PYROSCOPE_KEY }} | |
lokiEndpoint: ${{ secrets.LOKI_URL_CI }} | |
lokiTenantId: ${{ vars.LOKI_TENANT_ID }} | |
lokiBasicAuth: ${{ secrets.LOKI_BASIC_AUTH }} | |
logstreamLogTargets: ${{ vars.LOGSTREAM_LOG_TARGETS }} | |
grafanaUrl: ${{ vars.GRAFANA_URL }} | |
grafanaDashboardUrl: "/d/ddf75041-1e39-42af-aa46-361fe4c36e9e/ci-e2e-tests-logs" | |
ethExecutionClient: ${{ matrix.evm_node.eth_client }} | |
customEthClientDockerImage: ${{ matrix.evm_node.docker_image }} | |
- name: Prepare Base64 TOML override for CCIP secrets | |
uses: ./.github/actions/setup-create-base64-config-ccip | |
with: | |
runId: ${{ github.run_id }} | |
testLogCollect: ${{ vars.TEST_LOG_COLLECT }} | |
selectedNetworks: SIMULATED_1,SIMULATED_2 | |
chainlinkImage: ${{ env.CHAINLINK_IMAGE }} | |
chainlinkVersion: ${{ github.sha }} | |
lokiEndpoint: ${{ secrets.LOKI_URL_CI }} | |
lokiTenantId: ${{ vars.LOKI_TENANT_ID }} | |
lokiBasicAuth: ${{ secrets.LOKI_BASIC_AUTH }} | |
logstreamLogTargets: ${{ vars.LOGSTREAM_LOG_TARGETS }} | |
grafanaUrl: ${{ vars.GRAFANA_URL }} | |
grafanaDashboardUrl: "/d/ddf75041-1e39-42af-aa46-361fe4c36e9e/ci-e2e-tests-logs" | |
- name: Run Tests | |
uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@c67a09566412d153ff7640d99f96b43aa03abc04 # v2.3.6 | |
with: | |
test_command_to_run: cd ./integration-tests && go test -timeout 45m -count=1 -json -test.parallel=2 ${{ steps.build-go-test-command.outputs.run_command }} 2>&1 | tee /tmp/gotest.log | gotestfmt | |
test_download_vendor_packages_command: cd ./integration-tests && go mod download | |
cl_repo: ${{ env.CHAINLINK_IMAGE }} | |
cl_image_tag: ${{ github.sha }}${{ matrix.product.tag_suffix }} | |
aws_registries: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }} | |
artifacts_name: ${{ matrix.product.name }}${{ matrix.product.tag_suffix }}-test-logs | |
artifacts_location: | | |
./integration-tests/smoke/logs/ | |
./integration-tests/ccip-tests/smoke/logs/* | |
publish_check_name: ${{ matrix.evm_node.product }}-compatibility-${{ matrix.evm_node.eth_client }}-${{ matrix.evm_node.docker_image }} | |
token: ${{ secrets.GITHUB_TOKEN }} | |
go_mod_path: ./integration-tests/go.mod | |
cache_key_id: core-e2e-${{ env.MOD_CACHE_VERSION }} | |
cache_restore_only: "true" | |
QA_AWS_REGION: ${{ secrets.QA_AWS_REGION }} | |
QA_AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }} | |
QA_KUBECONFIG: "" | |
should_tidy: "false" | |
- name: Print failed test summary | |
if: always() | |
uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@c67a09566412d153ff7640d99f96b43aa03abc04 # v2.3.6 | |
start-slack-thread: | |
name: Start Slack Thread | |
if: ${{ always() && needs.check-dependency-bump.outputs.dependency_bumped == 'true' && needs.*.result != 'skipped' && needs.*.result != 'cancelled' }} | |
environment: integration | |
outputs: | |
thread_ts: ${{ steps.slack.outputs.thread_ts }} | |
permissions: | |
checks: write | |
pull-requests: write | |
id-token: write | |
contents: read | |
runs-on: ubuntu-latest | |
needs: [ evm-node-compatiblity-matrix] | |
steps: | |
- name: Debug Result | |
run: echo ${{ join(needs.*.result, ',') }} | |
- name: Main Slack Notification | |
uses: slackapi/slack-github-action@6c661ce58804a1a20f6dc5fbee7f0381b469e001 # v1.25.0 | |
id: slack | |
with: | |
channel-id: ${{ secrets.QA_SLACK_CHANNEL }} | |
payload: | | |
{ | |
"attachments": [ | |
{ | |
"color": "${{ contains(join(needs.*.result, ','), 'failure') && '#C62828' || '#2E7D32' }}", | |
"blocks": [ | |
{ | |
"type": "header", | |
"text": { | |
"type": "plain_text", | |
"text": "CCIP EVM Node Compatability Test Results ${{ contains(join(needs.*.result, ','), 'failure') && ':x:' || ':white_check_mark:'}}", | |
"emoji": true | |
} | |
}, | |
{ | |
"type": "section", | |
"text": { | |
"type": "mrkdwn", | |
"text": "${{ contains(join(needs.*.result, ','), 'failure') && 'Some tests failed, notifying <@U060CGGPY8H>, <@U03GWA0NSF7>' || 'All Good!' }}" | |
} | |
}, | |
{ | |
"type": "divider" | |
}, | |
{ | |
"type": "section", | |
"text": { | |
"type": "mrkdwn", | |
"text": "<${{ github.server_url }}/${{ github.repository }}/releases/tag/${{ github.ref_name }}|${{ github.ref_name }}> | <${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }}|${{ github.sha }}> | <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Run>" | |
} | |
} | |
] | |
} | |
] | |
} | |
env: | |
SLACK_BOT_TOKEN: ${{ secrets.QA_SLACK_API_KEY }} | |
post-test-results-to-slack: | |
name: Post Test Results for ${{matrix.evm_node.eth_client}} to Slack | |
if: ${{ always() && needs.check-dependency-bump.outputs.dependency_bumped == 'true' && needs.*.result != 'skipped' && needs.*.result != 'cancelled' }} | |
environment: integration | |
permissions: | |
checks: write | |
pull-requests: write | |
id-token: write | |
contents: read | |
runs-on: ubuntu-latest | |
needs: [start-slack-thread, build-test-matrix] | |
strategy: | |
fail-fast: false | |
matrix: | |
# this basically works as group by in SQL; we should update it when we update the test list JSON file | |
product: [automation,ocr,ocr2,vrf,vrfv2,vrfv2plus] | |
steps: | |
- name: Checkout the repo | |
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
with: | |
ref: ${{ github.event.pull_request.head.sha || github.event.merge_group.head_sha }} | |
- name: Post Test Results to Slack | |
uses: ./.github/actions/notify-slack-jobs-result | |
with: | |
github_token: ${{ github.token }} | |
github_repository: ${{ github.repository }} | |
workflow_run_id: ${{ github.run_id }} | |
github_job_name_regex: ^EVM node compatibility of ${{ matrix.product }} with (?<cap>.*?)$ | |
message_title: ${{ matrix.product }} | |
slack_channel_id: ${{ secrets.QA_SLACK_CHANNEL }} | |
slack_bot_token: ${{ secrets.QA_SLACK_API_KEY }} | |
slack_thread_ts: ${{ needs.start-slack-thread.outputs.thread_ts }} |