Continuous Integration #11312
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: 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: .turbo | |
key: ${{ runner.os }}-turbo-common-${{ github.ref_name}} | |
restore-keys: | | |
${{ runner.os }}-turbo-common-main | |
${{ runner.os }}-turbo-common- | |
- 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: Prettier | |
if: ${{ !cancelled() && steps.setup_success.outcome == 'success' }} | |
run: yarn prettier:check | |
- name: Build | |
id: ts_build | |
if: ${{ !cancelled() && steps.setup_success.outcome == 'success' }} | |
run: yarn build | |
- 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: Maintain Turbo cache | |
uses: actions/cache@v4 | |
with: | |
path: .turbo | |
key: ${{ runner.os }}-turbo-multinode-${{ github.ref_name}} | |
restore-keys: | | |
${{ runner.os }}-turbo-common-${{ github.ref_name}} | |
${{ runner.os }}-turbo-common-main | |
${{ runner.os }}-turbo-common- | |
- 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: 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) | |
run: yarn turbo run test:ci:multi:ne --filter=@river-build/sdk | |
- 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) | |
run: yarn turbo run test:integration --filter=@river-build/stream-metadata | |
- 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: .turbo | |
key: ${{ runner.os }}-turbo-multinode-ent-${{ github.ref_name}} | |
restore-keys: | | |
${{ runner.os }}-turbo-common-${{ github.ref_name}} | |
${{ runner.os }}-turbo-common-main | |
${{ runner.os }}-turbo-common- | |
- 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 turbo run test:ci:multi:ent --filter=@river-build/sdk | |
- name: Run Stress Test Tests (yarn) (with entitlements) | |
run: yarn turbo run test:ci:multi:ent --filter=@river-build/stress | |
- 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: .turbo | |
key: ${{ runner.os }}-turbo-multinode-ent-legacy-${{ github.ref_name}} | |
restore-keys: | | |
${{ runner.os }}-turbo-common-${{ github.ref_name}} | |
${{ runner.os }}-turbo-common-main | |
${{ runner.os }}-turbo-common- | |
- 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 turbo run test:ci:multi:ent:legacy --filter=@river-build/sdk | |
- 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: 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, | |
Multinode_Ent_Legacy, | |
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 |