Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 45 additions & 23 deletions .github/workflows/devenv-compat.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ on:
type: boolean
default: false
refs:
description: "Git refs to test, should be used only for tool testing purposes. In all other cases refs are detected automatically either from Git or RANE SOT"
description: "Git refs to test, should be used only for tool testing purposes.
In all other cases refs are detected automatically either from Git or
RANE SOT"
required: false
type: string
exclude-refs:
Expand Down Expand Up @@ -56,6 +58,11 @@ on:
required: false
default: "2"
type: string
tag-version-ceiling:
description: "Version ceiling for compatibility testing (tags newer than this
version will be excluded)"
required: false
type: string
working-directory:
description: "Working directory for commands"
required: false
Expand Down Expand Up @@ -95,13 +102,16 @@ jobs:
DON_NODES: ${{ inputs.don-nodes }}
NODE_NAME_TEMPLATE: ${{ inputs.node-name-template }}
VERSIONS_BACK: ${{ inputs.versions-back }}
TAG_VERSION_CEILING: ${{ inputs.tag-version-ceiling }}
WORKING_DIR: ${{ inputs.working-directory }}
LOGS_DIR: ${{ inputs.logs-directory }}
CTF_LOG_LEVEL: ${{ inputs.ctf-log-level }}
# JD is required by the local CRE-based tests
CTF_JD_IMAGE: "${{ secrets.AWS_ACCOUNT_ID_PROD }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/job-distributor:0.22.1"
CTF_JD_IMAGE: "${{ secrets.AWS_ACCOUNT_ID_PROD }}.dkr.ecr.${{
secrets.QA_AWS_REGION }}.amazonaws.com/job-distributor:0.22.1"
# ChIP Router is required by the local CRE-based tests
CTF_CHIP_ROUTER_IMAGE: "${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/local-cre-chip-router:v1.0.1"
CTF_CHIP_ROUTER_IMAGE: "${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{
secrets.QA_AWS_REGION }}.amazonaws.com/local-cre-chip-router:v1.0.1"
steps:
- name: Checkout code
uses: actions/checkout@v5
Expand Down Expand Up @@ -129,7 +139,8 @@ jobs:
id: login-ecr
uses: aws-actions/amazon-ecr-login@062b18b96a7aff071d4dc91bc00c4c1a7945b076 # v2.0.1
with:
registries: ${{ format('{0},{1}', secrets.QA_AWS_ACCOUNT_NUMBER, secrets.AWS_ACCOUNT_ID_PROD) }}
registries: ${{ format('{0},{1}', secrets.QA_AWS_ACCOUNT_NUMBER,
secrets.AWS_ACCOUNT_ID_PROD) }}
env:
AWS_REGION: ${{ secrets.QA_AWS_REGION }}

Expand Down Expand Up @@ -157,7 +168,7 @@ jobs:
working-directory: ${{ env.WORKING_DIR }}
run: |
CTF_VERSION=$(go list -m -json "github.com/smartcontractkit/chainlink-testing-framework/framework" | jq -r .Version)
echo "CTF_TAG=framework/$CTF_VERSION" >> $GITHUB_ENV
echo "CTF_TAG=framework/$CTF_VERSION" >> "$GITHUB_ENV"

- name: Install CTF binary
working-directory: ${{ env.WORKING_DIR }}
Expand Down Expand Up @@ -199,57 +210,68 @@ jobs:
STRIP_IMAGE_SUFFIX: ${{ env.STRIP_IMAGE_SUFFIX }}
PRODUCT: ${{ env.PRODUCT }}
NO_GIT_ROLLBACK: ${{ env.NO_GIT_ROLLBACK }}
REFS: ${{ env.REFS }}
EXCLUDE_REFS: ${{ env.EXCLUDE_REFS }}
BUILD_CMD: ${{ env.BUILD_CMD }}
ENV_CMD: ${{ env.ENV_CMD }}
TEST_CMD: ${{ env.TEST_CMD }}
NODES: ${{ env.NODES }}
VERSIONS_BACK: ${{ env.VERSIONS_BACK }}
TAG_VERSION_CEILING: ${{ env.TAG_VERSION_CEILING }}
run: |
REFS_ARGS=""
if [ -n "${{ env.REFS }}" ]; then
REFS_ARGS="--refs ${{ env.REFS }}"
REFS_ARGS=()
if [ -n "${REFS}" ]; then
REFS_ARGS=(--refs "${REFS}")
fi
EXCLUDE_REFS_ARGS=()
if [ -n "${EXCLUDE_REFS}" ]; then
EXCLUDE_REFS_ARGS=(--exclude-refs "${EXCLUDE_REFS}")
fi
EXCLUDE_REFS_ARGS=""
if [ -n "${{ env.EXCLUDE_REFS }}" ]; then
EXCLUDE_REFS_ARGS="--exclude-refs ${{ env.EXCLUDE_REFS }}"
ROLLBACK_FLAG=()
if [ -n "${NO_GIT_ROLLBACK}" ]; then
ROLLBACK_FLAG=("${NO_GIT_ROLLBACK}")
fi
./bin/ctf compat backward \
--registry "${REGISTRY}" \
--buildcmd "${BUILD_CMD}" \
--envcmd "${ENV_CMD}" \
--testcmd "${TEST_CMD}" \
--product "${PRODUCT}" \
${REFS_ARGS} \
${EXCLUDE_REFS_ARGS} \
"${REFS_ARGS[@]}" \
"${EXCLUDE_REFS_ARGS[@]}" \
--upgrade-nodes "${UPGRADE_NODES}" \
--don_nodes "${DON_NODES}" \
--node-name-template "${NODE_NAME_TEMPLATE}" \
--strip-image-suffix "${STRIP_IMAGE_SUFFIX}" \
--versions-back "${VERSIONS_BACK}" \
${{ env.NO_GIT_ROLLBACK }}
--tag-version-ceiling "${TAG_VERSION_CEILING}" \
"${ROLLBACK_FLAG[@]}"

- name: Attach CI Summary
working-directory: ${{ env.WORKING_DIR }}
if: always()
run: |
if [ -f "ci_summary.txt" ]; then
echo "" >> $GITHUB_STEP_SUMMARY
echo "**CI Summary:**" >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
cat ci_summary.txt >> $GITHUB_STEP_SUMMARY
{
echo ""
echo "**CI Summary:**"
echo '```'
cat ci_summary.txt
} >> "$GITHUB_STEP_SUMMARY"
else
echo "ci_summary.txt not found" >> $GITHUB_STEP_SUMMARY
echo "ci_summary.txt not found" >> "$GITHUB_STEP_SUMMARY"
fi

- name: Collect Docker container logs
if: always()
working-directory: ${{ env.WORKING_DIR }}
run: |
mkdir -p logs
for container in $(docker ps -q); do
container_name=$(docker inspect --format='{{.Name}}' $container | sed 's/^\///')
docker logs $container > "logs/${container_name}.log" 2>&1
done
while IFS= read -r container; do
[ -z "${container}" ] && continue
container_name=$(docker inspect --format='{{.Name}}' "${container}" | sed 's/^\///')
docker logs "${container}" > "logs/${container_name}.log" 2>&1
done < <(docker ps -q)

- name: Upload logs
if: always()
Expand Down
8 changes: 8 additions & 0 deletions .github/workflows/post-build-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,17 @@ jobs:
echo "Chainlink Version is required, but 'client_payload.chainlink_version' is empty"
exit 1
fi
if [[ "$CHAINLINK_VERSION" != v* ]]; then
echo "This workflow can only be used with semver tags, 'chainlink_version' must begin with 'v', got: $CHAINLINK_VERSION"
exit 1
fi
echo "Trigger validated successfully"
# Upgrade compatibility tests
# Include rc and beta releases, since we will be upgrading from them on canary servers
df1-compat:
uses: ./.github/workflows/devenv-compat.yml
name: Data Feeds v1 Upgrade Test
needs: validate-trigger
permissions:
id-token: write
contents: read
Expand All @@ -48,11 +53,13 @@ jobs:
logs-directory: "./devenv/tests/ocr2/logs"
ctf-log-level: "debug"
strip-image-suffix: "v"
tag-version-ceiling: ${{ github.event.client_payload.chainlink_version }}
secrets: inherit

cre-compat:
uses: ./.github/workflows/devenv-compat.yml
name: CRE Upgrade Test
needs: validate-trigger
permissions:
id-token: write
contents: read
Expand All @@ -68,6 +75,7 @@ jobs:
logs-directory: "./system-tests/tests/smoke/cre/logs"
ctf-log-level: "debug"
strip-image-suffix: "v"
tag-version-ceiling: ${{ github.event.client_payload.chainlink_version }}
secrets: inherit

legacy-system-tests:
Expand Down
8 changes: 8 additions & 0 deletions .github/workflows/post-image-released.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@ name: "Post Image Released"
on:
# to be used with post release tests
workflow_dispatch:
inputs:
tag-version-ceiling:
description: "Version ceiling for compatibility testing (tags newer than this
version will be excluded)"
required: false
type: string

permissions: {}

Expand All @@ -26,6 +32,7 @@ jobs:
logs-directory: "./devenv/tests/ocr2/logs"
ctf-log-level: "debug"
strip-image-suffix: "v"
tag-version-ceiling: ${{ inputs.tag-version-ceiling }}
secrets: inherit

cre-compat:
Expand All @@ -46,5 +53,6 @@ jobs:
logs-directory: "./system-tests/tests/smoke/cre/logs"
ctf-log-level: "debug"
strip-image-suffix: "v"
tag-version-ceiling: ${{ inputs.tag-version-ceiling }}
secrets: inherit
# Do not run other tests, since they were already run on the pre-release image
1 change: 1 addition & 0 deletions core/config/app_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ type AppConfig interface {
CCV() CCV
Billing() Billing
BridgeStatusReporter() BridgeStatusReporter
JobSpecReporter() JobSpecReporter
Sharding() Sharding
LOOPP() LOOPP
}
Expand Down
10 changes: 10 additions & 0 deletions core/config/docs/core.toml
Original file line number Diff line number Diff line change
Expand Up @@ -913,6 +913,16 @@ IgnoreInvalidBridges = true # Default
# IgnoreJoblessBridges skips bridges that have no associated jobs.
IgnoreJoblessBridges = false # Default

# JobSpecReporter holds settings for the Job Spec Reporter service, which periodically emits job spec telemetry.
[JobSpecReporter]
# Enabled enables the Job Spec Reporter service.
Enabled = false # Default
# PollingInterval is how often to emit a heartbeat event for each tracked job.
PollingInterval = "1h" # Default
# EnabledOCR2PluginTypes restricts OCR2 telemetry to jobs with these plugin types.
# An empty list disables all OCR2 telemetry. Use ["all"] to enable all OCR2 plugin types.
EnabledOCR2PluginTypes = ["median"] # Default

[CRE]
# UseLocalTimeProvider should be set true if the DON Time OCR Plugin is not running
UseLocalTimeProvider = true # Default
Expand Down
11 changes: 11 additions & 0 deletions core/config/job_spec_reporter_config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package config

import "time"

type JobSpecReporter interface {
Enabled() bool
PollingInterval() time.Duration
// EnabledOCR2PluginTypes is the allowlist of OCR2 plugin types to emit for
// (e.g. "median"). An empty slice disables all. Use ["all"] to enable all types.
EnabledOCR2PluginTypes() []string
}
43 changes: 43 additions & 0 deletions core/config/toml/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"reflect"
"regexp"
"strings"
"time"

"github.com/google/uuid"
"go.uber.org/zap/zapcore"
Expand Down Expand Up @@ -64,6 +65,7 @@ type Core struct {
CRE CreConfig `toml:",omitempty"`
Billing Billing `toml:",omitempty"`
BridgeStatusReporter BridgeStatusReporter `toml:",omitempty"`
JobSpecReporter JobSpecReporter `toml:",omitempty"`
Sharding Sharding `toml:",omitempty"`
LOOPP LOOPP `toml:",omitempty"`
}
Expand Down Expand Up @@ -110,6 +112,7 @@ func (c *Core) SetFrom(f *Core) {
c.CRE.setFrom(&f.CRE)
c.Billing.setFrom(&f.Billing)
c.BridgeStatusReporter.setFrom(&f.BridgeStatusReporter)
c.JobSpecReporter.setFrom(&f.JobSpecReporter)

c.Sharding.setFrom(&f.Sharding)
c.LOOPP.setFrom(&f.LOOPP)
Expand Down Expand Up @@ -3040,6 +3043,46 @@ func (e *BridgeStatusReporter) ValidateConfig() error {
return nil
}

type JobSpecReporter struct {
Enabled *bool
PollingInterval *commonconfig.Duration
EnabledOCR2PluginTypes *[]string
}

func (e *JobSpecReporter) setFrom(f *JobSpecReporter) {
if f.Enabled != nil {
e.Enabled = f.Enabled
}
if f.PollingInterval != nil {
e.PollingInterval = f.PollingInterval
}
if f.EnabledOCR2PluginTypes != nil {
e.EnabledOCR2PluginTypes = f.EnabledOCR2PluginTypes
}
}

func (e *JobSpecReporter) ValidateConfig() error {
if e.Enabled == nil || !*e.Enabled {
return nil
}

if e.PollingInterval == nil {
defaultInterval := commonconfig.MustNewDuration(time.Hour)
e.PollingInterval = defaultInterval
}

if e.PollingInterval.Duration() < config.MinimumPollingInterval {
return configutils.ErrInvalid{Name: "PollingInterval", Value: e.PollingInterval.Duration(), Msg: "must be greater than or equal to: " + config.MinimumPollingInterval.String()}
}

if e.EnabledOCR2PluginTypes == nil {
defaultTypes := []string{"median"}
e.EnabledOCR2PluginTypes = &defaultTypes
}

return nil
}

type JobDistributor struct {
DisplayName *string
}
Expand Down
7 changes: 4 additions & 3 deletions core/scripts/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ require (
github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260421142741-9c7fbaf7c828
github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20260505131349-78e491b80735
github.com/smartcontractkit/chainlink-protos/job-distributor v0.18.0
github.com/smartcontractkit/chainlink-testing-framework/framework v0.15.19
github.com/smartcontractkit/chainlink-testing-framework/framework v0.15.21
github.com/smartcontractkit/chainlink-testing-framework/framework/components/dockercompose v0.1.22
github.com/smartcontractkit/chainlink-testing-framework/lib v1.54.5
github.com/smartcontractkit/chainlink-testing-framework/seth v1.51.5
Expand Down Expand Up @@ -486,7 +486,7 @@ require (
github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 // indirect
github.com/smartcontractkit/ccip-contract-examples/chains/evm v0.0.0-20260129135848-c86808ba5cb9 // indirect
github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect
github.com/smartcontractkit/chainlink-aptos v0.0.0-20260506112908-f0d993b5bd6d // indirect
github.com/smartcontractkit/chainlink-aptos v0.0.0-20260507123701-77fc93b573bb // indirect
github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260428205619-2db1389501a1 // indirect
github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260408145530-22e2d05695cd // indirect
github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260415165642-49f23e4d76cc // indirect
Expand All @@ -498,13 +498,14 @@ require (
github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 // indirect
github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20260423135514-5b1a7565a99c // indirect
github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20260423135514-5b1a7565a99c // indirect
github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20260423135514-5b1a7565a99c // indirect
github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20260505202410-b350dca113b4 // indirect
github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20260505202410-b350dca113b4 // indirect
github.com/smartcontractkit/chainlink-protos/billing/go v0.0.0-20251024234028-0988426d98f4 // indirect
github.com/smartcontractkit/chainlink-protos/chainlink-ccv/committee-verifier v0.0.0-20251211142334-5c3421fe2c8d // indirect
github.com/smartcontractkit/chainlink-protos/chainlink-ccv/heartbeat v0.0.0-20260115142640-f6b99095c12e // indirect
github.com/smartcontractkit/chainlink-protos/chainlink-ccv/message-discovery v0.0.0-20251211142334-5c3421fe2c8d // indirect
github.com/smartcontractkit/chainlink-protos/chainlink-ccv/verifier v0.0.0-20251211142334-5c3421fe2c8d // indirect
github.com/smartcontractkit/chainlink-protos/data-feeds v0.1.1-0.20260501174546-2e8846986b36 // indirect
github.com/smartcontractkit/chainlink-protos/linking-service/go v0.0.0-20251002192024-d2ad9222409b // indirect
github.com/smartcontractkit/chainlink-protos/node-platform v0.0.0-20260430172634-acccf17ece83 // indirect
github.com/smartcontractkit/chainlink-protos/orchestrator v0.10.0 // indirect
Expand Down
Loading
Loading