LinkBalMonV2(minPerform) and CCIPWatchlist AutoUpdate Contract #847
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: Client Compatibility Tests | |
on: | |
schedule: | |
- cron: "30 5 * * *" # Run every night at midnight + 30min EST | |
push: | |
tags: | |
- "*" | |
workflow_dispatch: | |
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: | |
# Build Test Dependencies | |
check-ecr-images-exist: | |
environment: integration | |
permissions: | |
id-token: write | |
contents: read | |
name: Check images used as test dependencies exist in ECR | |
runs-on: ubuntu-latest | |
strategy: | |
fail-fast: false | |
matrix: | |
mirror: | |
- name: ethereum/client-go | |
expression: '^(alltools-v|v)[0-9]\.[0-9]+\.[0-9]+$' | |
- name: hyperledger/besu | |
expression: '^[0-9]+\.[0-9]+(\.[0-9]+)?$' | |
page_size: 300 | |
- name: thorax/erigon | |
expression: '^v[0-9]+\.[0-9]+\.[0-9]+$' | |
- name: nethermind/nethermind | |
expression: '^[0-9]+\.[0-9]+\.[0-9]+$' | |
- name: tofelb/ethereum-genesis-generator | |
expression: '^[0-9]+\.[0-9]+\.[0-9]+(\-slots\-per\-epoch)?' | |
steps: | |
- name: Update internal ECR if the latest Ethereum client image does not exist | |
uses: smartcontractkit/chainlink-testing-framework/.github/actions/update-internal-mirrors@5eea86ee4f7742b4e944561a570a6b268e712d9e # v1.30.3 | |
with: | |
aws_region: ${{ secrets.QA_AWS_REGION }} | |
role_to_assume: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }} | |
aws_account_number: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }} | |
image_name: ${{matrix.mirror.name}} | |
expression: ${{matrix.mirror.expression}} | |
page_size: ${{matrix.mirror.page_size}} | |
build-chainlink: | |
environment: integration | |
permissions: | |
id-token: write | |
contents: read | |
name: Build Chainlink Image | |
runs-on: ubuntu-latest | |
steps: | |
- name: Collect Metrics | |
id: collect-gha-metrics | |
uses: smartcontractkit/push-gha-metrics-action@d9da21a2747016b3e13de58c7d4115a3d5c97935 # v3.0.1 | |
with: | |
id: client-compatablility-build-chainlink | |
org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }} | |
basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }} | |
hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }} | |
this-job-name: Build Chainlink Image | |
continue-on-error: true | |
- name: Checkout the repo | |
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 | |
with: | |
ref: ${{ github.event.pull_request.head.sha || github.event.merge_group.head_sha }} | |
- name: Build Chainlink 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 }} | |
# End Build Test Dependencies | |
client-compatibility-matrix: | |
environment: integration | |
permissions: | |
checks: write | |
pull-requests: write | |
id-token: write | |
contents: read | |
needs: [build-chainlink, check-ecr-images-exist] | |
env: | |
SELECTED_NETWORKS: SIMULATED,SIMULATED_1,SIMULATED_2 | |
CHAINLINK_COMMIT_SHA: ${{ github.sha }} | |
CHAINLINK_ENV_USER: ${{ github.actor }} | |
TEST_LOG_LEVEL: debug | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- name: ocr-geth | |
os: ubuntu-latest | |
test: TestOCRBasic | |
file: ocr | |
client: geth | |
timeout: 30m | |
pyroscope_env: ci-smoke-ocr-geth-simulated | |
- name: ocr-nethermind | |
test: TestOCRBasic | |
file: ocr | |
client: nethermind | |
timeout: 30m | |
pyroscope_env: ci-smoke-ocr-nethermind-simulated | |
- name: ocr-besu | |
test: TestOCRBasic | |
file: ocr | |
client: besu | |
timeout: 30m | |
pyroscope_env: ci-smoke-ocr-besu-simulated | |
- name: ocr-erigon | |
test: TestOCRBasic | |
file: ocr | |
client: erigon | |
timeout: 30m | |
pyroscope_env: ci-smoke-ocr-erigon-simulated | |
- name: ocr2-geth | |
test: "^TestOCRv2Basic/plugins$" | |
file: ocr2 | |
client: geth | |
timeout: 30m | |
pyroscope_env: ci-smoke-ocr2-geth-simulated | |
- name: ocr2-nethermind | |
test: "^TestOCRv2Basic/plugins$" | |
file: ocr2 | |
client: nethermind | |
timeout: 30m | |
pyroscope_env: ci-smoke-nethermind-evm-simulated | |
- name: ocr2-besu | |
test: "^TestOCRv2Basic/plugins$" | |
file: ocr2 | |
client: besu | |
timeout: 30m | |
pyroscope_env: ci-smoke-ocr2-besu-simulated | |
- name: ocr2-erigon | |
test: "^TestOCRv2Basic/plugins$" | |
file: ocr2 | |
client: erigon | |
timeout: 60m | |
pyroscope_env: ci-smoke-ocr2-erigon-simulated | |
runs-on: ubuntu-latest | |
name: Client Compatibility Test ${{ matrix.name }} | |
steps: | |
- name: Checkout the repo | |
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 | |
with: | |
repository: smartcontractkit/chainlink | |
ref: ${{ github.sha }} | |
- name: Prepare Base64 TOML config | |
env: | |
RUN_ID: ${{ github.run_id }} | |
SELECTED_NETWORKS: SIMULATED,SIMULATED_1,SIMULATED_2 | |
PYROSCOPE_SERVER: ${{ secrets.QA_PYROSCOPE_INSTANCE }} | |
PYROSCOPE_ENVIRONMENT: ci-client-compatability-${{ matrix.client }}-testnet | |
PYROSCOPE_KEY: ${{ secrets.QA_PYROSCOPE_KEY }} | |
ETH2_EL_CLIENT: ${{matrix.client}} | |
CHAINLINK_VERSION: ${{ github.sha }} | |
GRAFANA_URL: "http://localhost:8080/primary" | |
GRAFANA_DASHBOARD_URL: "/d/ddf75041-1e39-42af-aa46-361fe4c36e9e/ci-e2e-tests-logs" | |
GRAFANA_BEARER_TOKEN: ${{ secrets.GRAFANA_INTERNAL_URL_SHORTENER_TOKEN }} | |
LOKI_ENDPOINT: https://${{ secrets.GRAFANA_INTERNAL_HOST }}/loki/api/v1/push | |
LOKI_TENANT_ID: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }} | |
LOKI_BASIC_AUTH: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }} | |
run: | | |
convert_to_toml_array() { | |
local IFS=',' | |
local input_array=($1) | |
local toml_array_format="[" | |
for element in "${input_array[@]}"; do | |
toml_array_format+="\"$element\"," | |
done | |
toml_array_format="${toml_array_format%,}]" | |
echo "$toml_array_format" | |
} | |
selected_networks=$(convert_to_toml_array "$SELECTED_NETWORKS") | |
if [ -n "$ETH2_EL_CLIENT" ]; then | |
execution_layer="$ETH2_EL_CLIENT" | |
else | |
execution_layer="geth" | |
fi | |
if [ -n "$PYROSCOPE_SERVER" ]; then | |
pyroscope_enabled=true | |
else | |
pyroscope_enabled=false | |
fi | |
grafana_bearer_token="" | |
if [ -n "$GRAFANA_BEARER_TOKEN" ]; then | |
grafana_bearer_token="bearer_token_secret=\"$GRAFANA_BEARER_TOKEN\"" | |
fi | |
cat << EOF > config.toml | |
[Network] | |
selected_networks=$selected_networks | |
[ChainlinkImage] | |
image="$CHAINLINK_IMAGE" | |
version="$CHAINLINK_VERSION" | |
[Pyroscope] | |
enabled=$pyroscope_enabled | |
server_url="$PYROSCOPE_SERVER" | |
environment="$PYROSCOPE_ENVIRONMENT" | |
key_secret="$PYROSCOPE_KEY" | |
[Logging] | |
run_id="$RUN_ID" | |
[Logging.LogStream] | |
log_targets=["file","loki"] | |
[Logging.Loki] | |
tenant_id="$LOKI_TENANT_ID" | |
endpoint="$LOKI_ENDPOINT" | |
basic_auth_secret="$LOKI_BASIC_AUTH" | |
[Logging.Grafana] | |
base_url="$GRAFANA_URL" | |
dashboard_url="$GRAFANA_DASHBOARD_URL" | |
$grafana_bearer_token | |
[PrivateEthereumNetwork] | |
ethereum_version="eth2" | |
consensus_layer="prysm" | |
execution_layer="$execution_layer" | |
wait_for_finalization=false | |
[PrivateEthereumNetwork.EthereumChainConfig] | |
chain_id=1337 | |
genesis_delay=15 | |
seconds_per_slot=3 | |
validator_count=8 | |
slots_per_epoch=2 | |
addresses_to_fund=["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"] | |
EOF | |
BASE64_CONFIG_OVERRIDE=$(cat config.toml | base64 -w 0) | |
echo ::add-mask::$BASE64_CONFIG_OVERRIDE | |
echo "BASE64_CONFIG_OVERRIDE=$BASE64_CONFIG_OVERRIDE" >> $GITHUB_ENV | |
touch .root_dir | |
- name: Run Tests | |
uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@af92c5fae8dcf1659201e907db82d221fc304b94 # v2.3.21 | |
with: | |
test_command_to_run: cd ./integration-tests/smoke && go test -timeout ${{ matrix.timeout }} -count=1 -json -test.run ${{ matrix.test }} 2>&1 | tee /tmp/gotest.log | gotestloghelper -ci -singlepackage -hidepassingtests=false -hidepassinglogs | |
test_download_vendor_packages_command: cd ./integration-tests && go mod download | |
cl_repo: ${{ env.CHAINLINK_IMAGE }} | |
cl_image_tag: ${{ github.sha }} | |
aws_registries: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }} | |
artifacts_name: ${{ matrix.name }}-test-logs | |
artifacts_location: | | |
./integration-tests/smoke/logs/ | |
/tmp/gotest.log | |
publish_check_name: ${{ matrix.name }} | |
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" | |
go_coverage_src_dir: /var/tmp/go-coverage | |
go_coverage_dest_dir: ${{ github.workspace }}/.covdata | |
- name: Print failed test summary | |
if: always() | |
uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@fc3e0df622521019f50d772726d6bf8dc919dd38 # v2.3.19 | |
start-slack-thread: | |
name: Start Slack Thread | |
if: ${{ always() && 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: [client-compatibility-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": "Client 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>' || '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.product}} | |
if: ${{ always() && 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 | |
strategy: | |
fail-fast: false | |
matrix: | |
product: [ocr, ocr2] | |
steps: | |
- name: Checkout the repo | |
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 | |
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: ^Client Compatibility Test ${{ matrix.product }}-(?<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 }} |