407 lines
13 KiB
YAML
407 lines
13 KiB
YAML
name: Database Backwards Compatibility Test
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
pull_request:
|
|
branches: [main]
|
|
|
|
env:
|
|
TEST_DB_PASSWORD: "test_password_123!"
|
|
TEST_DB_NAME: "pinepods_test_db"
|
|
|
|
jobs:
|
|
test-mysql-compatibility:
|
|
runs-on: ubuntu-latest
|
|
services:
|
|
mysql:
|
|
image: mysql:latest
|
|
env:
|
|
MYSQL_ROOT_PASSWORD: test_password_123!
|
|
MYSQL_DATABASE: pinepods_test_db
|
|
ports:
|
|
- 3306:3306
|
|
options: >-
|
|
--health-cmd="mysqladmin ping"
|
|
--health-interval=10s
|
|
--health-timeout=5s
|
|
--health-retries=3
|
|
|
|
valkey:
|
|
image: valkey/valkey:8-alpine
|
|
ports:
|
|
- 6379:6379
|
|
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 0
|
|
|
|
- name: Get previous release tag
|
|
id: get_previous_tag
|
|
run: |
|
|
# Get the latest stable release (exclude rc, alpha, beta)
|
|
PREVIOUS_TAG=$(git tag --sort=-version:refname | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | head -n 1)
|
|
|
|
if [ -z "$PREVIOUS_TAG" ]; then
|
|
echo "No stable release tag found, using 0.7.9 as baseline"
|
|
PREVIOUS_TAG="0.7.9"
|
|
fi
|
|
|
|
echo "previous_tag=$PREVIOUS_TAG" >> $GITHUB_OUTPUT
|
|
echo "Using previous tag: $PREVIOUS_TAG"
|
|
|
|
- name: Start previous PinePods version
|
|
run: |
|
|
echo "🚀 Starting PinePods ${{ steps.get_previous_tag.outputs.previous_tag }}"
|
|
|
|
# Create docker-compose for previous version
|
|
cat > docker-compose.previous.yml << EOF
|
|
version: '3.8'
|
|
services:
|
|
pinepods_previous:
|
|
image: madeofpendletonwool/pinepods:${{ steps.get_previous_tag.outputs.previous_tag }}
|
|
environment:
|
|
DB_TYPE: mysql
|
|
DB_HOST: mysql
|
|
DB_PORT: 3306
|
|
DB_USER: root
|
|
DB_PASSWORD: ${{ env.TEST_DB_PASSWORD }}
|
|
DB_NAME: ${{ env.TEST_DB_NAME }}
|
|
VALKEY_HOST: valkey
|
|
VALKEY_PORT: 6379
|
|
HOSTNAME: 'http://localhost:8040'
|
|
DEBUG_MODE: true
|
|
SEARCH_API_URL: 'https://search.pinepods.online/api/search'
|
|
PEOPLE_API_URL: 'https://people.pinepods.online'
|
|
ports:
|
|
- "8040:8040"
|
|
depends_on:
|
|
- mysql
|
|
- valkey
|
|
networks:
|
|
- test_network
|
|
|
|
mysql:
|
|
image: mysql:8.0
|
|
environment:
|
|
MYSQL_ROOT_PASSWORD: ${{ env.TEST_DB_PASSWORD }}
|
|
MYSQL_DATABASE: ${{ env.TEST_DB_NAME }}
|
|
networks:
|
|
- test_network
|
|
|
|
valkey:
|
|
image: valkey/valkey:8-alpine
|
|
networks:
|
|
- test_network
|
|
|
|
networks:
|
|
test_network:
|
|
driver: bridge
|
|
EOF
|
|
|
|
# Start previous version and wait for it to be ready
|
|
docker compose -f docker-compose.previous.yml up -d
|
|
|
|
# Wait for services to be ready
|
|
echo "⏳ Waiting for previous version to initialize..."
|
|
sleep 30
|
|
|
|
# Check if previous version is responding
|
|
timeout 60 bash -c 'while ! curl -f http://localhost:8040/api/pinepods_check; do sleep 5; done'
|
|
echo "✅ Previous version (${{ steps.get_previous_tag.outputs.previous_tag }}) is ready"
|
|
|
|
- name: Stop previous version
|
|
run: |
|
|
echo "🛑 Stopping previous PinePods version"
|
|
docker compose -f docker-compose.previous.yml stop pinepods_previous
|
|
echo "✅ Previous version stopped (database preserved)"
|
|
|
|
|
|
- name: Build current version
|
|
run: |
|
|
echo "🔨 Building current PinePods version from source"
|
|
docker build -f dockerfile -t pinepods-current:test .
|
|
echo "✅ Build complete"
|
|
|
|
- name: Start current version
|
|
run: |
|
|
|
|
# Create docker-compose for current version
|
|
cat > docker-compose.current.yml << EOF
|
|
version: '3.8'
|
|
services:
|
|
pinepods_current:
|
|
image: pinepods-current:test
|
|
environment:
|
|
DB_TYPE: mysql
|
|
DB_HOST: mysql
|
|
DB_PORT: 3306
|
|
DB_USER: root
|
|
DB_PASSWORD: ${{ env.TEST_DB_PASSWORD }}
|
|
DB_NAME: ${{ env.TEST_DB_NAME }}
|
|
VALKEY_HOST: valkey
|
|
VALKEY_PORT: 6379
|
|
HOSTNAME: 'http://localhost:8040'
|
|
DEBUG_MODE: true
|
|
SEARCH_API_URL: 'https://search.pinepods.online/api/search'
|
|
PEOPLE_API_URL: 'https://people.pinepods.online'
|
|
ports:
|
|
- "8040:8040"
|
|
depends_on:
|
|
- mysql
|
|
- valkey
|
|
networks:
|
|
- test_network
|
|
|
|
mysql:
|
|
image: mysql:8.0
|
|
environment:
|
|
MYSQL_ROOT_PASSWORD: ${{ env.TEST_DB_PASSWORD }}
|
|
MYSQL_DATABASE: ${{ env.TEST_DB_NAME }}
|
|
networks:
|
|
- test_network
|
|
|
|
valkey:
|
|
image: valkey/valkey:8-alpine
|
|
networks:
|
|
- test_network
|
|
|
|
networks:
|
|
test_network:
|
|
driver: bridge
|
|
EOF
|
|
|
|
echo "🚀 Starting current PinePods version"
|
|
# Start current version
|
|
docker compose -f docker-compose.current.yml up -d pinepods_current
|
|
|
|
# Wait for current version to be ready
|
|
echo "⏳ Waiting for current version to initialize..."
|
|
sleep 60
|
|
|
|
# Check if current version is responding
|
|
timeout 120 bash -c 'while ! curl -f http://localhost:8040/api/pinepods_check; do echo "Waiting for current version..."; sleep 10; done'
|
|
echo "✅ Current version is ready"
|
|
|
|
- name: Build validator and validate upgraded database
|
|
run: |
|
|
echo "🔨 Building database validator"
|
|
docker build -f Dockerfile.validator -t pinepods-validator .
|
|
|
|
echo "🔍 Validating upgraded database schema"
|
|
docker run --rm --network pinepods_test_network \
|
|
-e DB_TYPE=mysql \
|
|
-e DB_HOST=mysql \
|
|
-e DB_PORT=3306 \
|
|
-e DB_USER=root \
|
|
-e DB_PASSWORD=${{ env.TEST_DB_PASSWORD }} \
|
|
-e DB_NAME=${{ env.TEST_DB_NAME }} \
|
|
pinepods-validator
|
|
|
|
- name: Test basic functionality
|
|
run: |
|
|
echo "🧪 Testing basic API functionality"
|
|
|
|
# Test health endpoint
|
|
curl -f http://localhost:8040/api/health || exit 1
|
|
|
|
# Test pinepods check endpoint
|
|
curl -f http://localhost:8040/api/pinepods_check || exit 1
|
|
|
|
echo "✅ Basic functionality tests passed"
|
|
|
|
- name: Cleanup
|
|
if: always()
|
|
run: |
|
|
echo "🧹 Cleaning up test environment"
|
|
docker compose -f docker-compose.previous.yml down -v || true
|
|
docker compose -f docker-compose.current.yml down -v || true
|
|
|
|
test-postgresql-compatibility:
|
|
runs-on: ubuntu-latest
|
|
services:
|
|
postgres:
|
|
image: postgres:15
|
|
env:
|
|
POSTGRES_PASSWORD: test_password_123!
|
|
POSTGRES_DB: pinepods_test_db
|
|
ports:
|
|
- 5432:5432
|
|
options: >-
|
|
--health-cmd pg_isready
|
|
--health-interval 10s
|
|
--health-timeout 5s
|
|
--health-retries 5
|
|
|
|
valkey:
|
|
image: valkey/valkey:8-alpine
|
|
ports:
|
|
- 6379:6379
|
|
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 0
|
|
|
|
- name: Get previous release tag
|
|
id: get_previous_tag
|
|
run: |
|
|
# Get the latest stable release (exclude rc, alpha, beta)
|
|
PREVIOUS_TAG=$(git tag --sort=-version:refname | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | head -n 1)
|
|
|
|
if [ -z "$PREVIOUS_TAG" ]; then
|
|
echo "No stable release tag found, using 0.7.9 as baseline"
|
|
PREVIOUS_TAG="0.7.9"
|
|
fi
|
|
|
|
echo "previous_tag=$PREVIOUS_TAG" >> $GITHUB_OUTPUT
|
|
echo "Using previous tag: $PREVIOUS_TAG"
|
|
|
|
- name: Start previous PinePods version
|
|
run: |
|
|
echo "🚀 Starting PinePods ${{ steps.get_previous_tag.outputs.previous_tag }} (PostgreSQL)"
|
|
|
|
cat > docker-compose.postgres-previous.yml << EOF
|
|
version: '3.8'
|
|
services:
|
|
pinepods_previous:
|
|
image: madeofpendletonwool/pinepods:${{ steps.get_previous_tag.outputs.previous_tag }}
|
|
environment:
|
|
DB_TYPE: postgresql
|
|
DB_HOST: postgres
|
|
DB_PORT: 5432
|
|
DB_USER: postgres
|
|
DB_PASSWORD: ${{ env.TEST_DB_PASSWORD }}
|
|
DB_NAME: ${{ env.TEST_DB_NAME }}
|
|
VALKEY_HOST: valkey
|
|
VALKEY_PORT: 6379
|
|
HOSTNAME: 'http://localhost:8040'
|
|
DEBUG_MODE: true
|
|
SEARCH_API_URL: 'https://search.pinepods.online/api/search'
|
|
PEOPLE_API_URL: 'https://people.pinepods.online'
|
|
ports:
|
|
- "8040:8040"
|
|
depends_on:
|
|
- postgres
|
|
- valkey
|
|
networks:
|
|
- test_network
|
|
|
|
postgres:
|
|
image: postgres:latest
|
|
environment:
|
|
POSTGRES_PASSWORD: ${{ env.TEST_DB_PASSWORD }}
|
|
POSTGRES_DB: ${{ env.TEST_DB_NAME }}
|
|
networks:
|
|
- test_network
|
|
|
|
valkey:
|
|
image: valkey/valkey:8-alpine
|
|
networks:
|
|
- test_network
|
|
|
|
networks:
|
|
test_network:
|
|
driver: bridge
|
|
EOF
|
|
|
|
docker compose -f docker-compose.postgres-previous.yml up -d
|
|
sleep 30
|
|
timeout 60 bash -c 'while ! curl -f http://localhost:8040/api/pinepods_check; do sleep 5; done'
|
|
|
|
- name: Stop previous version
|
|
run: |
|
|
echo "🛑 Stopping previous PinePods version"
|
|
docker compose -f docker-compose.postgres-previous.yml stop pinepods_previous
|
|
echo "✅ Previous version stopped (database preserved)"
|
|
|
|
- name: Build current version (PostgreSQL)
|
|
run: |
|
|
echo "🔨 Building current PinePods version from source"
|
|
docker build -f dockerfile -t pinepods-current:test .
|
|
echo "✅ Build complete"
|
|
|
|
- name: Test current version (PostgreSQL)
|
|
run: |
|
|
echo "🚀 Starting current PinePods version with PostgreSQL"
|
|
|
|
# Create docker-compose for current version
|
|
cat > docker-compose.postgres-current.yml << EOF
|
|
version: '3.8'
|
|
services:
|
|
pinepods_current:
|
|
image: pinepods-current:test
|
|
environment:
|
|
DB_TYPE: postgresql
|
|
DB_HOST: postgres
|
|
DB_PORT: 5432
|
|
DB_USER: postgres
|
|
DB_PASSWORD: ${{ env.TEST_DB_PASSWORD }}
|
|
DB_NAME: ${{ env.TEST_DB_NAME }}
|
|
VALKEY_HOST: valkey
|
|
VALKEY_PORT: 6379
|
|
HOSTNAME: 'http://localhost:8040'
|
|
DEBUG_MODE: true
|
|
SEARCH_API_URL: 'https://search.pinepods.online/api/search'
|
|
PEOPLE_API_URL: 'https://people.pinepods.online'
|
|
ports:
|
|
- "8040:8040"
|
|
depends_on:
|
|
- postgres
|
|
- valkey
|
|
networks:
|
|
- test_network
|
|
|
|
postgres:
|
|
image: postgres:latest
|
|
environment:
|
|
POSTGRES_PASSWORD: ${{ env.TEST_DB_PASSWORD }}
|
|
POSTGRES_DB: ${{ env.TEST_DB_NAME }}
|
|
networks:
|
|
- test_network
|
|
|
|
valkey:
|
|
image: valkey/valkey:8-alpine
|
|
networks:
|
|
- test_network
|
|
|
|
networks:
|
|
test_network:
|
|
driver: bridge
|
|
EOF
|
|
|
|
# Start current version
|
|
docker compose -f docker-compose.postgres-current.yml up -d pinepods_current
|
|
|
|
# Wait for current version to be ready
|
|
echo "⏳ Waiting for current version to initialize..."
|
|
sleep 60
|
|
|
|
# Check if current version is responding
|
|
timeout 120 bash -c 'while ! curl -f http://localhost:8040/api/pinepods_check; do echo "Waiting for current version..."; sleep 10; done'
|
|
echo "✅ Current version is ready"
|
|
|
|
- name: Build validator and validate upgraded database (PostgreSQL)
|
|
run: |
|
|
echo "🔨 Building PostgreSQL database validator"
|
|
docker build -f Dockerfile.validator.postgres -t pinepods-validator-postgres .
|
|
|
|
echo "🔍 Validating upgraded database schema"
|
|
docker run --rm --network pinepods_test_network \
|
|
-e DB_TYPE=postgresql \
|
|
-e DB_HOST=postgres \
|
|
-e DB_PORT=5432 \
|
|
-e DB_USER=postgres \
|
|
-e DB_PASSWORD=${{ env.TEST_DB_PASSWORD }} \
|
|
-e DB_NAME=${{ env.TEST_DB_NAME }} \
|
|
pinepods-validator-postgres
|
|
|
|
- name: Cleanup
|
|
if: always()
|
|
run: |
|
|
docker compose -f docker-compose.postgres-previous.yml down -v || true
|
|
docker compose -f docker-compose.postgres-current.yml down -v || true
|