diff --git a/.github/actions/setup-postgres/.env b/.github/actions/setup-postgres/.env new file mode 100644 index 000000000..47ed8d9bc --- /dev/null +++ b/.github/actions/setup-postgres/.env @@ -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 diff --git a/.github/actions/setup-postgres/action.yml b/.github/actions/setup-postgres/action.yml new file mode 100644 index 000000000..45bfba596 --- /dev/null +++ b/.github/actions/setup-postgres/action.yml @@ -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 diff --git a/.github/actions/setup-postgres/bin/pg_dump b/.github/actions/setup-postgres/bin/pg_dump new file mode 100755 index 000000000..d8135ad82 --- /dev/null +++ b/.github/actions/setup-postgres/bin/pg_dump @@ -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 "$@" diff --git a/.github/actions/setup-postgres/docker-compose.yml b/.github/actions/setup-postgres/docker-compose.yml new file mode 100644 index 000000000..23f8d82b9 --- /dev/null +++ b/.github/actions/setup-postgres/docker-compose.yml @@ -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 diff --git a/.github/actions/setup-postgres/wait-for-healthy-postgres.sh b/.github/actions/setup-postgres/wait-for-healthy-postgres.sh new file mode 100755 index 000000000..438cfbaff --- /dev/null +++ b/.github/actions/setup-postgres/wait-for-healthy-postgres.sh @@ -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 diff --git a/.github/workflows/ccip-integration-test.yml b/.github/workflows/ccip-integration-test.yml new file mode 100644 index 000000000..15dc0e3e3 --- /dev/null +++ b/.github/workflows/ccip-integration-test.yml @@ -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 }}