Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

.github/workflows: add integration test workflow #59

Merged
merged 6 commits into from
Aug 12, 2024
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
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 }}
Loading