Update testing infrastructure #153
Workflow file for this run
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: Testing CI | |
on: pull_request | |
jobs: | |
build: | |
runs-on: ${{ matrix.os }} | |
strategy: | |
matrix: | |
node: | |
- 18 | |
- 20 | |
os: | |
- ubuntu-latest | |
- windows-latest | |
- macos-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Setup (on MacOS) | |
if: runner.os == 'macOS' | |
run: | | |
# install and up | |
brew install redis | |
brew services start postgresql | |
brew services start redis | |
# wait for ready | |
until pg_isready -h localhost -p 5432 && redis-cli ping; do sleep 5; done | |
# setup db | |
createuser -s postgres | |
cd database | |
bash setup.sh | |
- name: Setup (on Windows) | |
if: runner.os == 'Windows' | |
run: | | |
# postgres | |
echo "unix_socket_directories = ''" >> "$PGDATA/postgresql.conf" | |
echo "port = 5432" >> "$PGDATA/postgresql.conf" | |
$PG_BIN = "C:\Program Files\PostgreSQL\14\bin" | |
$env:PATH = "$PG_BIN;$env:PATH" | |
Write-Host "PATH=$env:PATH" | |
# start and wait | |
pg_ctl start | |
# Start-Sleep -Seconds 15 | |
$timeout = 120 | |
$elapsedTime = 0 | |
Write-Host "Waiting for PostgreSQL to start" | |
while ($elapsedTime -lt $timeout) { | |
$pgIsReadyResult = & $PG_BIN\pg_isready.exe -h localhost -p 5432 -t 1 | |
echo $pgIsReadyResult | |
if ($pgIsReadyResult -eq 0) { | |
Write-Host "PostgreSQL is ready" | |
break | |
} | |
Start-Sleep -Seconds 5 | |
$elapsedTime += 5 | |
} | |
# setup db | |
cd database | |
bash setup.sh | |
# redis | |
$URL = "https://github.com/redis-windows/redis-windows/releases/download/7.0.14/Redis-7.0.14-Windows-x64-with-Service.tar.gz" | |
$outputFolder = "C:\redis" | |
if (-not (Test-Path $outputFolder)) { | |
New-Item -ItemType Directory -Path $outputFolder | Out-Null | |
} | |
Invoke-WebRequest -Uri $URL -OutFile "redis.tar.gz" | |
tar -xf "redis.tar.gz" -C $outputFolder | |
$innerFolder = Get-ChildItem -Path $outputFolder | Select-Object -First 1 | |
Move-Item -Path "$outputFolder\$($innerFolder.Name)\*" -Destination $outputFolder -Force | |
Remove-Item -Path "$outputFolder\$($innerFolder.Name)" -Force | |
# start redis | |
cd $outputFolder | |
sc.exe create Redis binpath=C:\redis\RedisService.exe start= auto | |
net start Redis | |
# wait for redis | |
Write-Host "Waiting for Redis to start" | |
while ($elapsedTime -lt $timeout) { | |
$redisPingResult = & redis-cli ping | |
echo $redisPingResult | |
if ($redisPingResult -eq "PONG") { | |
Write-Host "Redis is ready" | |
break | |
} | |
Start-Sleep -Seconds 5 | |
$elapsedTime += 5 | |
} | |
if ($elapsedTime -ge $timeout) { | |
Write-Host "Timeout waiting for services to start." | |
exit 1 | |
} | |
Write-Host "Services are ready" | |
- name: Setup (on Linux) | |
if: runner.os == 'Linux' | |
run: | | |
docker-compose -f test-docker-compose.yml up -d pg-example redis-example | |
while [[ "$(docker inspect --format='{{.State.Health.Status}}' pg-example)" != "healthy" ]]; do | |
echo "Waiting for PostgreSQL container to become healthy..." | |
sleep 5 | |
done | |
while [[ "$(docker inspect --format='{{.State.Health.Status}}' redis-example)" != "healthy" ]]; do | |
echo "Waiting for Redis container to become healthy..." | |
sleep 5 | |
done | |
- name: Use Node.js ${{ matrix.node }} | |
uses: actions/setup-node@v4 | |
with: | |
node-version: ${{ matrix.node }} | |
- uses: actions/cache@v4 | |
with: | |
path: ~/.npm | |
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} | |
restore-keys: | | |
${{ runner.os }}-node- | |
- run: npm ci | |
- run: npm run dotest | |
env: | |
MODE: test | |
- name: Stop containers for Linux | |
if: runner.os == 'Linux' | |
run: docker-compose down |