Skip to content

Commit

Permalink
.github/workflows: add integration test workflow (#59)
Browse files Browse the repository at this point in the history
* wip

* fix go get?

* checkout mk/bump-chainlink-ccip branch on ccip

* add CL_DATABASE_URL env var

* revert TODO
  • Loading branch information
makramkd authored Aug 12, 2024
1 parent f1cc953 commit 7783ee9
Show file tree
Hide file tree
Showing 6 changed files with 154 additions and 0 deletions.
5 changes: 5 additions & 0 deletions .github/actions/setup-postgres/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
POSTGRES_USER=postgres
POSTGRES_OPTIONS="-c max_connections=1000 -c shared_buffers=2GB -c log_lock_waits=true"
POSTGRES_PASSWORD=postgres
POSTGRES_DB=chainlink_test
POSTGRES_HOST_AUTH_METHOD=trust
18 changes: 18 additions & 0 deletions .github/actions/setup-postgres/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
name: Setup Postgresql
description: Setup postgres docker container via docker-compose, allowing usage of a custom command, see https://github.com/orgs/community/discussions/26688
inputs:
base-path:
description: Path to the base of the repo
required: false
default: .
runs:
using: composite
steps:
- name: Start postgres service
run: docker compose up -d
shell: bash
working-directory: ${{ inputs.base-path }}/.github/actions/setup-postgres
- name: Wait for postgres service to be healthy
run: ./wait-for-healthy-postgres.sh
shell: bash
working-directory: ${{ inputs.base-path }}/.github/actions/setup-postgres
23 changes: 23 additions & 0 deletions .github/actions/setup-postgres/bin/pg_dump
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#!/usr/bin/env bash
#
# This script acts as a docker replacement around pg_dump so that developers can
# run DB involved tests locally without having postgres installed.
#
# Installation:
# - Make sure that your PATH doesn't already contain a postgres installation
# - Add this script to your PATH
#
# Usage:
# You should be able to setup your test db via:
# - go build -o chainlink.test . # Build the chainlink binary to run test db prep commands from
# - export CL_DATABASE_URL="postgresql://postgres:postgres@localhost:5432/chainlink_test?sslmode=disable"
# - pushd .github/actions/setup-postgres/ # Navigate to the setup-postgres action so we can spin up a docker postgres
# instance
# - docker compose up # Spin up postgres
# - ./chainlink.test local db preparetest # Run the db migration, which will shell out to our pg_dump wrapper too.
# - popd
# - go test -timeout 30s ./core/services/workflows/... -v # Run tests that use the database

cd "$(dirname "$0")" || exit

docker compose exec -T postgres pg_dump "$@"
15 changes: 15 additions & 0 deletions .github/actions/setup-postgres/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
name: gha_postgres
services:
postgres:
ports:
- "5432:5432"
container_name: cl_pg
image: postgres:14-alpine
command: postgres ${POSTGRES_OPTIONS}
env_file:
- .env
healthcheck:
test: "pg_isready -d ${POSTGRES_DB} -U ${POSTGRES_USER}"
interval: 2s
timeout: 5s
retries: 5
25 changes: 25 additions & 0 deletions .github/actions/setup-postgres/wait-for-healthy-postgres.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#!/bin/bash
RETRIES=10

until [ $RETRIES -eq 0 ]; do
DOCKER_OUTPUT=$(docker compose ps postgres --status running --format json)
JSON_TYPE=$(echo "$DOCKER_OUTPUT" | jq -r 'type')

if [ "$JSON_TYPE" == "array" ]; then
HEALTH_STATUS=$(echo "$DOCKER_OUTPUT" | jq -r '.[0].Health')
elif [ "$JSON_TYPE" == "object" ]; then
HEALTH_STATUS=$(echo "$DOCKER_OUTPUT" | jq -r '.Health')
else
HEALTH_STATUS="Unknown JSON type: $JSON_TYPE"
fi

echo "postgres health status: $HEALTH_STATUS"
if [ "$HEALTH_STATUS" == "healthy" ]; then
exit 0
fi

echo "Waiting for postgres server, $((RETRIES--)) remaining attempts..."
sleep 2
done

exit 1
68 changes: 68 additions & 0 deletions .github/workflows/ccip-integration-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
name: "Run CCIP OCR3 Integration Test"

on:
pull_request:
push:
branches:
- 'ccip-develop'

jobs:
integration-test-ccip-ocr3:
env:
# We explicitly have this env var not be "CL_DATABASE_URL" to avoid having it be used by core related tests
# when they should not be using it, while still allowing us to DRY up the setup
DB_URL: postgresql://postgres:postgres@localhost:5432/chainlink_test?sslmode=disable

runs-on: ubuntu-latest
strategy:
matrix:
go-version: ['1.22.5']
steps:
- name: Checkout the repo
uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
- name: Setup Go ${{ matrix.go-version }}
uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0
with:
go-version: ${{ matrix.go-version }}
- name: Display Go version
run: go version
- name: Clone CCIP repo
run: |
git clone https://github.com/smartcontractkit/ccip.git
cd ccip
git fetch
git checkout ccip-develop
- name: Update chainlink-ccip dependency in ccip
run: |
cd ccip
go get github.com/smartcontractkit/chainlink-ccip@${{ github.event.pull_request.head.sha }}
make gomodtidy
- name: Setup Postgres
uses: ./.github/actions/setup-postgres
- name: Download Go vendor packages
run: |
cd ccip
go mod download
- name: Build binary
run: |
cd ccip
go build -o ccip.test .
- name: Setup DB
run: |
cd ccip
./ccip.test local db preparetest
env:
CL_DATABASE_URL: ${{ env.DB_URL }}
- name: Run ccip ocr3 integration test
run: |
cd ccip
go test -v -timeout 3m -run "^TestIntegration_OCR3Nodes$" ./core/capabilities/ccip/ccip_integration_tests
EXITCODE=${PIPESTATUS[0]}
if [ $EXITCODE -ne 0 ]; then
echo "Integration test failed"
else
echo "Integration test passed!"
fi
exit $EXITCODE
env:
CL_DATABASE_URL: ${{ env.DB_URL }}

0 comments on commit 7783ee9

Please sign in to comment.