Skip to content

Continuous Integration #8771

Continuous Integration

Continuous Integration #8771

Workflow file for this run

name: Continuous Integration
env:
FOUNDRY_VERSION: nightly
RIVER_BLOCK_TIME: 1
on:
schedule:
# Run every hour
- cron: '0 * * * *'
pull_request:
workflow_dispatch: # Allow manual trigger in GitHub UI
inputs:
skip_common_ci:
description: Skip Common CI checks (i.e linting, prettier, etc)
required: false
default: false
type: boolean
skip_multinode:
description: Skip Multi-node Tests
required: false
default: false
type: boolean
skip_multinode_ent:
description: Skip Multi-node Ent Tests
required: false
default: false
type: boolean
skip_multinode_ent_legacy:
description: Skip Multi-node Ent Legacy Tests
required: false
default: false
type: boolean
skip_go:
description: Skip Go Tests
required: false
default: false
type: boolean
skip_xchain_integration:
description: Skip XChain Integration Tests
required: false
default: false
type: boolean
jobs:
Common_CI:
permissions: write-all
if: github.event_name != 'workflow_dispatch' || !inputs.skip_common_ci
runs-on: ubuntu-latest-8-cores
timeout-minutes: 30
steps:
- name: Print bash environment
run: env
- name: Cancel previous runs
if: github.event_name != 'schedule'
uses: styfle/[email protected]
with:
access_token: ${{ github.token }}
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version-file: 'go.work'
cache-dependency-path: '**/*.sum'
- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
with:
version: ${{ env.FOUNDRY_VERSION }}
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'yarn'
- name: Install node dependencies
run: yarn install --immutable
- name: Print versions
run: ./scripts/print-versions.sh
# Start an ssh session with tmate if the PR has the 'ssh' label
- name: Setup tmate session
uses: mxschmitt/action-tmate@v3
if: contains(github.event.pull_request.labels.*.name, 'ssh')
- name: Start and configure blockchains
run: ./scripts/bc-all-start.sh
- name: Maintain Turbo cache
uses: actions/cache@v4
with:
path: node_modules/.cache/turbo
key: ${{ runner.os }}-turbo-${{ github.run_id }}
restore-keys: |
${{ runner.os }}-turbo-
- name: Setup Done
id: setup_success
run: echo "Setup done, running all checks..."
- name: Syncpack
if: ${{ !cancelled() && steps.setup_success.outcome == 'success' }}
run: yarn syncpack:check
- name: Build
id: ts_build
if: ${{ !cancelled() && steps.setup_success.outcome == 'success' }}
run: yarn build
- name: Prettier
if: ${{ !cancelled() && steps.setup_success.outcome == 'success' }}
run: yarn prettier:check
- name: Lint
if: ${{ !cancelled() && steps.setup_success.outcome == 'success' }}
run: yarn lint
- name: Linting River Node
if: ${{ !cancelled() && steps.setup_success.outcome == 'success' }}
uses: golangci/golangci-lint-action@v6
with:
version: v1.62.0
working-directory: core
args: --timeout=10m --config=.golangci.yml
- name: Linting River Node W/ Custom Rules
if: ${{ !cancelled() && steps.setup_success.outcome == 'success' }}
run: |
cd core/node
./lint_extensions.sh > river_lint_extensions.txt
if [ -s river_lint_extensions.txt ]; then
echo "Linter found issues:"
cat river_lint_extensions.txt
exit 1
fi
- name: Generate react-sdk docs
if: ${{ !cancelled() && steps.setup_success.outcome == 'success' }}
working-directory: packages/react-sdk
run: yarn gen
- name: Docs checking broken links
working-directory: packages/docs
run: yarn docs:broken-links
- name: Docs spellcheck
working-directory: packages/docs
run: yarn spellcheck
- name: Staticcheck River Node
if: ${{ !cancelled() && steps.setup_success.outcome == 'success' }}
uses: dominikh/staticcheck-action@v1
with:
version: v0.5.1
working-directory: core
install-go: false
# - name: Terraform Lint
# run: make lint
# working-directory: ./infra
- name: Build town types
if: ${{ !cancelled() && steps.setup_success.outcome == 'success' }}
run: ./scripts/build-contract-types.sh localhost --frozen
- name: Unit Tests
if: ${{ !cancelled() && steps.setup_success.outcome == 'success' && steps.ts_build.outcome == 'success' }}
run: yarn test:unit
Multinode:
permissions: write-all
if: github.event_name != 'workflow_dispatch' || !inputs.skip_multinode
runs-on: ubuntu-latest-8-cores
timeout-minutes: 30
services:
postgres-core:
image: postgres:latest
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
ports:
# Maps tcp port 5433 on service container to the host
- 5433:5432
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
--name river_postgres_container
steps:
- uses: taiki-e/install-action@just
- name: Cancel previous runs
if: github.event_name != 'schedule'
uses: styfle/[email protected]
with:
access_token: ${{ github.token }}
- name: Show PostgreSQL max_connections
run: psql -h localhost -p 5433 -U postgres -c 'SHOW max_connections;'
env:
POSTGRES_PASSWORD: postgres
PGPASSWORD: postgres
- name: Increase max_connections in Postgres
run: |
docker exec -i river_postgres_container bash << EOF
echo 'max_connections = 1000' >> /var/lib/postgresql/data/postgresql.conf
echo 'shared_buffers = 2GB' >> /var/lib/postgresql/data/postgresql.conf
EOF
docker restart --time 0 river_postgres_container
sleep 5
- name: Show PostgreSQL max_connections
run: psql -h localhost -p 5433 -U postgres -c 'SHOW max_connections;'
env:
POSTGRES_PASSWORD: postgres
PGPASSWORD: postgres
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version-file: 'go.work'
cache-dependency-path: '**/*.sum'
- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
with:
version: ${{ env.FOUNDRY_VERSION }}
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'yarn'
- name: Install node dependencies
run: yarn install --immutable
- name: Build all packages
run: yarn build
- name: Print versions
run: ./scripts/print-versions.sh
# Start an ssh session with tmate if the PR has the 'ssh' label
- name: Setup tmate session
uses: mxschmitt/action-tmate@v3
if: contains(github.event.pull_request.labels.*.name, 'ssh')
- name: Start and configure blockchains
run: ./scripts/bc-all-start.sh
- name: Print Yarn package versions
run: yarn info --name-only --all
- name: Maintain Turbo cache
uses: actions/cache@v4
with:
path: node_modules/.cache/turbo
key: ${{ runner.os }}-turbo-${{ github.run_id }}
restore-keys: |
${{ runner.os }}-turbo-
- name: create db
run: psql -h localhost -p 5433 -U postgres -f scripts/sql/create_db.sql
working-directory: core
env:
POSTGRES_PASSWORD: postgres
PGPASSWORD: postgres
- name: Setup River CA for testing certificates
run: ./scripts/register-ca.sh
working-directory: core
- name: Set up Custom CA Certificate for Node.js
run: |
echo "NODE_EXTRA_CA_CERTS=$HOME/river-ca-cert.pem" >> $GITHUB_ENV
- name: Run multiple nodes
working-directory: core
run: just RUN_ENV=multi_ne config-and-start
- name: Run SDK Tests (without entitlements)
working-directory: packages/sdk
run: yarn test:ci:multi:ne
- name: Run Stream Metadata Nodes
run: |
yarn workspace @river-build/stream-metadata dev:local_multi_ne &
yarn wait-on http://localhost:3003/health --timeout=120000 --i=5000 --verbose
- name: Run Stream Metadata Tests (without entitlements)
working-directory: packages/stream-metadata
run: yarn test:integration
- name: Archive River Node Logs and Settings
if: always()
uses: actions/upload-artifact@v4
with:
name: 'river-node-${{ github.job }}'
path: |
./core/run_files/
!./core/**/bin/**
Multinode_Ent:
permissions: write-all
if: github.event_name != 'workflow_dispatch' || !inputs.skip_multinode_ent
runs-on: ubuntu-latest-8-cores
timeout-minutes: 40
services:
postgres-core:
image: postgres:latest
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
ports:
# Maps tcp port 5433 on service container to the host
- 5433:5432
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
--name river_postgres_container
steps:
- uses: taiki-e/install-action@just
- name: Cancel previous runs
if: github.event_name != 'schedule'
uses: styfle/[email protected]
with:
access_token: ${{ github.token }}
- name: Show PostgreSQL max_connections
run: psql -h localhost -p 5433 -U postgres -c 'SHOW max_connections;'
env:
POSTGRES_PASSWORD: postgres
PGPASSWORD: postgres
- name: Increase max_connections in Postgres
run: |
docker exec -i river_postgres_container bash << EOF
echo 'max_connections = 1000' >> /var/lib/postgresql/data/postgresql.conf
echo 'shared_buffers = 2GB' >> /var/lib/postgresql/data/postgresql.conf
EOF
docker restart --time 0 river_postgres_container
sleep 5
- name: Show PostgreSQL max_connections
run: psql -h localhost -p 5433 -U postgres -c 'SHOW max_connections;'
env:
POSTGRES_PASSWORD: postgres
PGPASSWORD: postgres
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version-file: 'go.work'
cache-dependency-path: '**/*.sum'
- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
with:
version: ${{ env.FOUNDRY_VERSION }}
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'yarn'
- name: Install node dependencies
run: yarn install --immutable
- name: Print versions
run: ./scripts/print-versions.sh
# Start an ssh session with tmate if the PR has the 'ssh' label
- name: Setup tmate session
uses: mxschmitt/action-tmate@v3
if: contains(github.event.pull_request.labels.*.name, 'ssh')
- name: Start and configure blockchains
run: ./scripts/bc-all-start.sh
- name: Print Yarn package versions
run: yarn info --name-only --all
- name: Maintain Turbo cache
uses: actions/cache@v4
with:
path: node_modules/.cache/turbo
key: ${{ runner.os }}-turbo-${{ github.run_id }}
restore-keys: |
${{ runner.os }}-turbo-
- name: create db
run: psql -h localhost -p 5433 -U postgres -f scripts/sql/create_db.sql
working-directory: core
env:
POSTGRES_PASSWORD: postgres
PGPASSWORD: postgres
- name: Setup River CA for testing certificates
run: ./scripts/register-ca.sh
working-directory: core
- name: Set up Custom CA Certificate for Node.js
run: |
echo "NODE_EXTRA_CA_CERTS=$HOME/river-ca-cert.pem" >> $GITHUB_ENV
- name: Run multiple nodes
run: just RUN_ENV=multi config-and-start
working-directory: core
- name: Build & Test (with entitlements)
run: yarn csb:turbo-no-sdk
- name: Run River Tests (with entitlements)
run: yarn workspace @river-build/sdk run test:ci:multi:ent
- name: Run Stress Test Tests (yarn) (with entitlements)
run: yarn workspace @river-build/stress run test:ci:with-entitlements
- name: Run Stress Test Demo (node) (with entitlements)
run: ./packages/stress/scripts/localhost_demo.sh
- name: Archive River Node Logs and Settings
if: always()
uses: actions/upload-artifact@v4
with:
name: 'river-node-${{ github.job }}'
path: |
./core/run_files/
!./core/**/bin/**
Multinode_Ent_Legacy:
permissions: write-all
if: github.event_name != 'workflow_dispatch' || !inputs.skip_multinode_ent_legacy
runs-on: ubuntu-latest-8-cores
timeout-minutes: 40
services:
postgres-core:
image: postgres:latest
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
ports:
# Maps tcp port 5433 on service container to the host
- 5433:5432
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
--name river_postgres_container
steps:
- uses: taiki-e/install-action@just
- name: Cancel previous runs
if: github.event_name != 'schedule'
uses: styfle/[email protected]
with:
access_token: ${{ github.token }}
- name: Show PostgreSQL max_connections
run: psql -h localhost -p 5433 -U postgres -c 'SHOW max_connections;'
env:
POSTGRES_PASSWORD: postgres
PGPASSWORD: postgres
- name: Increase max_connections in Postgres
run: |
docker exec -i river_postgres_container bash << EOF
echo 'max_connections = 1000' >> /var/lib/postgresql/data/postgresql.conf
echo 'shared_buffers = 2GB' >> /var/lib/postgresql/data/postgresql.conf
EOF
docker restart --time 0 river_postgres_container
sleep 5
- name: Show PostgreSQL max_connections
run: psql -h localhost -p 5433 -U postgres -c 'SHOW max_connections;'
env:
POSTGRES_PASSWORD: postgres
PGPASSWORD: postgres
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version-file: 'go.work'
cache-dependency-path: '**/*.sum'
- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
with:
version: ${{ env.FOUNDRY_VERSION }}
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'yarn'
- name: Install node dependencies
run: yarn install --immutable
- name: Print versions
run: ./scripts/print-versions.sh
# Start an ssh session with tmate if the PR has the 'ssh' label
- name: Setup tmate session
uses: mxschmitt/action-tmate@v3
if: contains(github.event.pull_request.labels.*.name, 'ssh')
- name: Start and configure blockchains
run: ./scripts/bc-all-start.sh
- name: Print Yarn package versions
run: yarn info --name-only --all
- name: Maintain Turbo cache
uses: actions/cache@v4
with:
path: node_modules/.cache/turbo
key: ${{ runner.os }}-turbo-${{ github.run_id }}
restore-keys: |
${{ runner.os }}-turbo-
- name: create db
run: psql -h localhost -p 5433 -U postgres -f scripts/sql/create_db.sql
working-directory: core
env:
POSTGRES_PASSWORD: postgres
PGPASSWORD: postgres
- name: Setup River CA for testing certificates
run: ./scripts/register-ca.sh
working-directory: core
- name: Set up Custom CA Certificate for Node.js
run: |
echo "NODE_EXTRA_CA_CERTS=$HOME/river-ca-cert.pem" >> $GITHUB_ENV
- name: Run multiple nodes
run: just RUN_ENV=multi config-and-start
working-directory: core
- name: Build & Test (with entitlements)
run: yarn csb:turbo-no-sdk
- name: Run River Tests Against Legacy Spaces (with entitlements)
run: yarn workspace @river-build/sdk run test:ci:multi:ent:legacy
- name: Archive River Node Logs and Settings
if: always()
uses: actions/upload-artifact@v4
with:
name: 'river-node-${{ github.job }}'
path: |
./core/run_files/
!./core/**/bin/**
Go_Tests:
permissions: write-all
if: github.event_name != 'workflow_dispatch' || !inputs.skip_go
runs-on: ubuntu-latest-8-cores
timeout-minutes: 30
services:
postgres-core:
image: postgres:latest
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
ports:
# Maps tcp port 5433 on service container to the host
- 5433:5432
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
--name river_postgres_container
steps:
- name: Cancel previous runs
if: github.event_name != 'schedule'
uses: styfle/[email protected]
with:
access_token: ${{ github.token }}
- name: Show PostgreSQL max_connections
run: psql -h localhost -p 5433 -U postgres -c 'SHOW max_connections;'
env:
POSTGRES_PASSWORD: postgres
PGPASSWORD: postgres
- name: Increase max_connections in Postgres
run: |
docker exec -i river_postgres_container bash << EOF
echo 'max_connections = 1000' >> /var/lib/postgresql/data/postgresql.conf
echo 'shared_buffers = 2GB' >> /var/lib/postgresql/data/postgresql.conf
EOF
docker restart --time 0 river_postgres_container
sleep 5
- name: Show PostgreSQL max_connections
run: psql -h localhost -p 5433 -U postgres -c 'SHOW max_connections;'
env:
POSTGRES_PASSWORD: postgres
PGPASSWORD: postgres
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version-file: 'go.work'
cache-dependency-path: '**/*.sum'
- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
with:
version: ${{ env.FOUNDRY_VERSION }}
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'yarn'
- name: Install node dependencies
run: yarn install --immutable
- name: Print versions
run: ./scripts/print-versions.sh
# Start an ssh session with tmate if the PR has the 'ssh' label
- name: Setup tmate session
uses: mxschmitt/action-tmate@v3
if: contains(github.event.pull_request.labels.*.name, 'ssh')
- name: Start and configure blockchains
run: ./scripts/bc-all-start.sh
- name: create db
run: psql -h localhost -p 5433 -U postgres -f scripts/sql/create_db.sql
working-directory: core
env:
POSTGRES_PASSWORD: postgres
PGPASSWORD: postgres
- name: Setup River CA for testing certificates
run: ./scripts/register-ca.sh
working-directory: core
- name: Run node tests
run: go test -race -timeout 24m -v -parallel 1 -count 1 -p 8 ./...
working-directory: core
XChain_Integration:
permissions: write-all
if: github.event_name != 'workflow_dispatch' || !inputs.skip_xchain_integration
runs-on: ubuntu-latest-8-cores
timeout-minutes: 30
steps:
- name: Cancel previous runs
if: github.event_name != 'schedule'
uses: styfle/[email protected]
with:
access_token: ${{ github.token }}
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version-file: 'go.work'
cache-dependency-path: '**/*.sum'
- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
with:
version: ${{ env.FOUNDRY_VERSION }}
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'yarn'
- name: Install node dependencies
run: yarn install --immutable
- name: Print versions
run: ./scripts/print-versions.sh
- name: Start Local Basechain
run: ./scripts/start-local-basechain.sh &
- name: Print Yarn package versions
run: yarn info --name-only --all
- name: Maintain Turbo cache
uses: actions/cache@v4
with:
path: node_modules/.cache/turbo
key: ${{ runner.os }}-turbo-${{ github.run_id }}
restore-keys: |
${{ runner.os }}-turbo-
- name: Run Integration Tests
run: make integration_tests
working-directory: core/xchain
Slack_Notification:
# NOTE: We should make sure that new jobs get added here
needs: [Common_CI, Multinode, Multinode_Ent, Go_Tests, XChain_Integration]
if: failure()
runs-on: ubuntu-latest
steps:
- name: Slack notification
if: (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch')
uses: rtCamp/action-slack-notify@v2
env:
SLACK_WEBHOOK: ${{ secrets.SLACK_CI_CHANNEL_WEBHOOK_URL }}
SLACK_TITLE: 'Failure'
SLACK_USERNAME: 'CI'
SLACK_ICON_EMOJI: ':boom:'
SLACK_COLOR: '#FF0000'
SLACK_MESSAGE: 'CI Failure on ${{ github.repository }} ${{ vars.RIVER_CI_ALERTS_SLACK_GROUP_ID }}'
SLACK_LINK_NAMES: true