fix: handle already installed libaio1t64 package in Oracle CI #289
This file contains hidden or 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: Tests | |
| on: | |
| push: | |
| pull_request: | |
| jobs: | |
| phpstan: | |
| name: PHPStan Static Analysis | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: shivammathur/setup-php@v2 | |
| with: | |
| php-version: '8.4' | |
| extensions: pdo, pdo_mysql, pdo_pgsql, pdo_sqlite, pdo_oci | |
| coverage: none | |
| - run: composer install --no-interaction --prefer-dist | |
| - run: composer pdodb:phpstan | |
| mysql: | |
| name: MySQL Tests | |
| runs-on: ubuntu-latest | |
| services: | |
| mysql: | |
| image: mysql:8.0 | |
| env: | |
| MYSQL_DATABASE: testdb | |
| MYSQL_USER: testuser | |
| MYSQL_PASSWORD: testpass | |
| MYSQL_ROOT_PASSWORD: root | |
| ports: | |
| - 3306:3306 | |
| options: >- | |
| --health-cmd="mysqladmin ping -h 127.0.0.1 -uroot -proot" | |
| --health-interval=10s | |
| --health-timeout=5s | |
| --health-retries=3 | |
| redis: | |
| image: redis:7-alpine | |
| ports: | |
| - 6379:6379 | |
| options: >- | |
| --health-cmd "redis-cli ping" | |
| --health-interval 10s | |
| --health-timeout 5s | |
| --health-retries 5 | |
| memcached: | |
| image: memcached:1.6-alpine | |
| ports: | |
| - 11211:11211 | |
| options: >- | |
| --health-cmd "echo 'stats' | nc localhost 11211" | |
| --health-interval 10s | |
| --health-timeout 5s | |
| --health-retries 5 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: shivammathur/setup-php@v2 | |
| with: | |
| php-version: '8.4' | |
| extensions: pdo_mysql, simplexml, xmlreader, redis, memcached, apcu | |
| coverage: xdebug | |
| - run: composer install --no-interaction --prefer-dist | |
| - name: Enable MySQL local_infile | |
| run: | | |
| mysql -h 127.0.0.1 -uroot -proot -e "SET GLOBAL local_infile=1;" | |
| - run: | | |
| PDODB_DSN="mysql:host=127.0.0.1;port=3306;dbname=testdb;charset=utf8mb4" \ | |
| PDODB_USERNAME="testuser" \ | |
| PDODB_PASSWORD="testpass" \ | |
| vendor/bin/phpunit --testsuite="MySQL Tests" --coverage-clover coverage-mysql.xml | |
| - name: Test MySQL Examples | |
| run: ./scripts/test-examples.sh --verbose | |
| - name: Upload MySQL coverage to Codecov | |
| uses: codecov/codecov-action@v4 | |
| with: | |
| token: ${{ secrets.CODECOV_TOKEN }} | |
| files: ./coverage-mysql.xml | |
| flags: mysql | |
| name: mysql-coverage | |
| mariadb: | |
| name: MariaDB Tests | |
| runs-on: ubuntu-latest | |
| services: | |
| mariadb: | |
| image: mariadb:11.2 | |
| env: | |
| MYSQL_DATABASE: testdb | |
| MYSQL_USER: testuser | |
| MYSQL_PASSWORD: testpass | |
| MYSQL_ROOT_PASSWORD: root | |
| ports: | |
| - 3305:3306 | |
| options: >- | |
| --health-cmd="healthcheck.sh --connect --innodb_initialized" | |
| --health-interval=5s | |
| --health-timeout=10s | |
| --health-retries=20 | |
| --health-start-period=40s | |
| redis: | |
| image: redis:7-alpine | |
| ports: | |
| - 6379:6379 | |
| options: >- | |
| --health-cmd "redis-cli ping" | |
| --health-interval 10s | |
| --health-timeout 5s | |
| --health-retries 5 | |
| memcached: | |
| image: memcached:1.6-alpine | |
| ports: | |
| - 11211:11211 | |
| options: >- | |
| --health-cmd "echo 'stats' | nc localhost 11211" | |
| --health-interval 10s | |
| --health-timeout 5s | |
| --health-retries 5 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: shivammathur/setup-php@v2 | |
| with: | |
| php-version: '8.4' | |
| extensions: pdo_mysql, simplexml, xmlreader, redis, memcached, apcu | |
| coverage: xdebug | |
| - run: composer install --no-interaction --prefer-dist | |
| - run: | | |
| PDODB_DSN="mariadb:host=127.0.0.1;port=3305;dbname=testdb;charset=utf8mb4" \ | |
| PDODB_USERNAME="testuser" \ | |
| PDODB_PASSWORD="testpass" \ | |
| vendor/bin/phpunit --testsuite="MariaDB Tests" --coverage-clover coverage-mariadb.xml | |
| - name: Test MariaDB Examples | |
| run: | | |
| export PDODB_DRIVER=mariadb | |
| export PDODB_USERNAME="testuser" | |
| export PDODB_PASSWORD="testpass" | |
| export PDODB_HOST="127.0.0.1" | |
| export PDODB_PORT="3305" | |
| export PDODB_DATABASE="testdb" | |
| ./scripts/test-examples.sh --verbose | |
| - name: Upload MariaDB coverage to Codecov | |
| uses: codecov/codecov-action@v4 | |
| with: | |
| token: ${{ secrets.CODECOV_TOKEN }} | |
| files: ./coverage-mariadb.xml | |
| flags: mariadb | |
| name: mariadb-coverage | |
| postgres: | |
| name: PostgreSQL Tests | |
| runs-on: ubuntu-latest | |
| services: | |
| postgres: | |
| image: postgres:16 | |
| env: | |
| POSTGRES_DB: testdb | |
| POSTGRES_USER: postgres | |
| POSTGRES_PASSWORD: postgres | |
| ports: | |
| - 5433:5432 | |
| options: >- | |
| --health-cmd="pg_isready -U postgres -d testdb" | |
| --health-interval=10s | |
| --health-timeout=5s | |
| --health-retries=5 | |
| redis: | |
| image: redis:7-alpine | |
| ports: | |
| - 6379:6379 | |
| options: >- | |
| --health-cmd "redis-cli ping" | |
| --health-interval 10s | |
| --health-timeout 5s | |
| --health-retries 5 | |
| memcached: | |
| image: memcached:1.6-alpine | |
| ports: | |
| - 11211:11211 | |
| options: >- | |
| --health-cmd "echo 'stats' | nc localhost 11211" | |
| --health-interval 10s | |
| --health-timeout 5s | |
| --health-retries 5 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: shivammathur/setup-php@v2 | |
| with: | |
| php-version: '8.4' | |
| extensions: pdo_pgsql, simplexml, xmlreader, redis, memcached, apcu | |
| coverage: xdebug | |
| - run: composer install --no-interaction --prefer-dist | |
| - name: Setup PostgreSQL test user | |
| run: | | |
| PGPASSWORD=postgres psql -h localhost -p 5433 -U postgres -d testdb -c "CREATE USER testuser WITH PASSWORD 'testpass';" | |
| PGPASSWORD=postgres psql -h localhost -p 5433 -U postgres -d testdb -c "GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser;" | |
| PGPASSWORD=postgres psql -h localhost -p 5433 -U postgres -d testdb -c "GRANT ALL ON SCHEMA public TO testuser;" | |
| - run: | | |
| PDODB_DSN="pgsql:host=localhost;port=5433;dbname=testdb" \ | |
| PDODB_USERNAME="testuser" \ | |
| PDODB_PASSWORD="testpass" \ | |
| vendor/bin/phpunit --testsuite="PostgreSQL Tests" --coverage-clover coverage-postgres.xml | |
| - name: Test PostgreSQL Examples | |
| run: ./scripts/test-examples.sh --verbose | |
| - name: Upload PostgreSQL coverage to Codecov | |
| uses: codecov/codecov-action@v4 | |
| with: | |
| token: ${{ secrets.CODECOV_TOKEN }} | |
| files: ./coverage-postgres.xml | |
| flags: postgres | |
| name: postgres-coverage | |
| sqlite: | |
| name: SQLite Tests | |
| runs-on: ubuntu-latest | |
| services: | |
| redis: | |
| image: redis:7-alpine | |
| ports: | |
| - 6379:6379 | |
| options: >- | |
| --health-cmd "redis-cli ping" | |
| --health-interval 10s | |
| --health-timeout 5s | |
| --health-retries 5 | |
| memcached: | |
| image: memcached:1.6-alpine | |
| ports: | |
| - 11211:11211 | |
| options: >- | |
| --health-cmd "echo 'stats' | nc localhost 11211" | |
| --health-interval 10s | |
| --health-timeout 5s | |
| --health-retries 5 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: shivammathur/setup-php@v2 | |
| with: | |
| php-version: '8.4' | |
| extensions: pdo_sqlite, redis, memcached, apcu | |
| coverage: xdebug | |
| - run: composer install --no-interaction --prefer-dist | |
| - run: | | |
| PDODB_DSN="sqlite::memory:" \ | |
| vendor/bin/phpunit --testsuite="SQLite Tests" --coverage-clover coverage-sqlite.xml | |
| - name: Test SQLite Examples | |
| run: ./scripts/test-examples.sh --verbose | |
| - name: Upload SQLite coverage to Codecov | |
| uses: codecov/codecov-action@v4 | |
| with: | |
| token: ${{ secrets.CODECOV_TOKEN }} | |
| files: ./coverage-sqlite.xml | |
| flags: sqlite | |
| name: sqlite-coverage | |
| mssql: | |
| name: MSSQL Tests | |
| runs-on: ubuntu-latest | |
| services: | |
| mssql: | |
| image: mcr.microsoft.com/mssql/server:2022-latest | |
| env: | |
| ACCEPT_EULA: Y | |
| MSSQL_SA_PASSWORD: Test123!@# | |
| MSSQL_PID: Developer | |
| ports: | |
| - 1433:1433 | |
| redis: | |
| image: redis:7-alpine | |
| ports: | |
| - 6379:6379 | |
| options: >- | |
| --health-cmd "redis-cli ping" | |
| --health-interval 10s | |
| --health-timeout 5s | |
| --health-retries 5 | |
| memcached: | |
| image: memcached:1.6-alpine | |
| ports: | |
| - 11211:11211 | |
| options: >- | |
| --health-cmd "echo 'stats' | nc localhost 11211" | |
| --health-interval 10s | |
| --health-timeout 5s | |
| --health-retries 5 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: shivammathur/setup-php@v2 | |
| with: | |
| php-version: '8.4' | |
| extensions: pdo, pdo_odbc, odbc, redis, memcached, apcu | |
| coverage: xdebug | |
| - name: Install Microsoft ODBC Driver and SQL Server Tools | |
| run: | | |
| curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - | |
| curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list | |
| sudo apt-get update | |
| sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18 unixodbc-dev mssql-tools18 | |
| echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc | |
| export PATH="$PATH:/opt/mssql-tools18/bin" | |
| - name: Install pdo_sqlsrv extension | |
| run: | | |
| if ! php -m | grep -q pdo_sqlsrv; then | |
| sudo pecl install pdo_sqlsrv-5.11.1 || sudo pecl install -f pdo_sqlsrv-5.11.1 | |
| echo "extension=pdo_sqlsrv.so" | sudo tee $(php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||")/conf.d/pdo_sqlsrv.ini | |
| fi | |
| php -m | grep pdo_sqlsrv || echo "Warning: pdo_sqlsrv extension not loaded" | |
| - name: Wait for MSSQL to be ready | |
| run: | | |
| export PATH="$PATH:/opt/mssql-tools18/bin" | |
| echo "Waiting for MSSQL to be ready..." | |
| for i in {1..120}; do | |
| if sqlcmd -S localhost -U sa -P 'Test123!@#' -C -Q 'SELECT 1' -b > /dev/null 2>&1; then | |
| echo "MSSQL is ready!" | |
| sqlcmd -S localhost -U sa -P 'Test123!@#' -C -Q 'SELECT @@VERSION' -b | |
| break | |
| fi | |
| if [ $i -eq 120 ]; then | |
| echo "MSSQL failed to start after 240 seconds" | |
| exit 1 | |
| fi | |
| echo "Waiting for MSSQL... ($i/120)" | |
| sleep 2 | |
| done | |
| - name: Create database | |
| run: | | |
| export PATH="$PATH:/opt/mssql-tools18/bin" | |
| # Create database (ignore error if exists) | |
| sqlcmd -S localhost -U sa -P 'Test123!@#' -C -Q "IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = 'testdb') CREATE DATABASE testdb;" || true | |
| echo "Database 'testdb' ready" | |
| - run: composer install --no-interaction --prefer-dist | |
| - run: | | |
| PDODB_DSN="sqlsrv:Server=localhost,1433;Database=testdb;TrustServerCertificate=yes" \ | |
| PDODB_USERNAME="sa" \ | |
| PDODB_PASSWORD="Test123!@#" \ | |
| vendor/bin/phpunit --testsuite="MSSQL Tests" --coverage-clover coverage-mssql.xml | |
| - name: Test MSSQL Examples | |
| run: | | |
| export PDODB_DRIVER=sqlsrv | |
| export PDODB_USERNAME="sa" | |
| export PDODB_PASSWORD="Test123!@#" | |
| export PDODB_HOST="localhost" | |
| export PDODB_PORT="1433" | |
| export PDODB_DATABASE="testdb" | |
| ./scripts/test-examples.sh --verbose | |
| - name: Upload MSSQL coverage to Codecov | |
| uses: codecov/codecov-action@v4 | |
| with: | |
| token: ${{ secrets.CODECOV_TOKEN }} | |
| files: ./coverage-mssql.xml | |
| flags: mssql | |
| name: mssql-coverage | |
| oracle: | |
| name: Oracle Tests | |
| runs-on: ubuntu-latest | |
| services: | |
| oracle: | |
| image: gvenzl/oracle-xe:21-slim | |
| env: | |
| ORACLE_PASSWORD: System123456 | |
| ports: | |
| - 1521:1521 | |
| - 5500:5500 | |
| options: >- | |
| --health-cmd="healthcheck.sh" | |
| --health-interval=30s | |
| --health-timeout=10s | |
| --health-retries=10 | |
| --health-start-period=5m | |
| redis: | |
| image: redis:7-alpine | |
| ports: | |
| - 6379:6379 | |
| options: >- | |
| --health-cmd "redis-cli ping" | |
| --health-interval 10s | |
| --health-timeout 5s | |
| --health-retries 5 | |
| memcached: | |
| image: memcached:1.6-alpine | |
| ports: | |
| - 11211:11211 | |
| options: >- | |
| --health-cmd "echo 'stats' | nc localhost 11211" | |
| --health-interval 10s | |
| --health-timeout 5s | |
| --health-retries 5 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: shivammathur/setup-php@v2 | |
| with: | |
| php-version: '8.4' | |
| extensions: pdo, redis, memcached, apcu, bz2 | |
| coverage: xdebug | |
| - name: Install Oracle Instant Client | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y wget unzip | |
| # Install libaio (required for Oracle Instant Client) | |
| # In Ubuntu 24.04+, libaio1 is replaced with libaio1t64 | |
| # Try to install libaio1t64 (ignore error if already installed) | |
| sudo apt-get install -y libaio1t64 || true | |
| # Check if libaio1t64 is installed or try libaio1 | |
| if dpkg -l | grep -q libaio1t64 || [ -f /usr/lib/x86_64-linux-gnu/libaio.so.1t64 ]; then | |
| # Create symlink for compatibility with Oracle Instant Client | |
| if [ -f /usr/lib/x86_64-linux-gnu/libaio.so.1t64 ]; then | |
| sudo ln -sf /usr/lib/x86_64-linux-gnu/libaio.so.1t64 /usr/lib/x86_64-linux-gnu/libaio.so.1 | |
| fi | |
| elif sudo apt-get install -y libaio1 2>/dev/null; then | |
| echo "libaio1 installed successfully" | |
| else | |
| echo "Warning: libaio package not found, continuing anyway" | |
| fi | |
| cd /tmp | |
| wget -q https://download.oracle.com/otn_software/linux/instantclient/instantclient-basic-linux.x64-21.1.0.0.0.zip | |
| unzip -q instantclient-basic-linux.x64-21.1.0.0.0.zip | |
| sudo mkdir -p /usr/lib/oracle/21/client64/lib | |
| sudo mv instantclient_21_1/* /usr/lib/oracle/21/client64/lib/ | |
| echo '/usr/lib/oracle/21/client64/lib' | sudo tee /etc/ld.so.conf.d/oracle-instantclient.conf | |
| sudo ldconfig | |
| - name: Install pdo_oci extension | |
| run: | | |
| export ORACLE_HOME=/usr/lib/oracle/21/client64 | |
| export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH | |
| if ! php -m | grep -q pdo_oci; then | |
| echo "Installing pdo_oci extension..." | |
| sudo pecl install pdo_oci <<< "" || sudo pecl install -f pdo_oci <<< "" | |
| echo "extension=pdo_oci.so" | sudo tee $(php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||")/conf.d/pdo_oci.ini | |
| sudo ldconfig | |
| fi | |
| php -m | grep pdo_oci || echo "Warning: pdo_oci extension not loaded" | |
| - name: Wait for Oracle to be ready | |
| run: | | |
| export ORACLE_HOME=/usr/lib/oracle/21/client64 | |
| export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH | |
| export PATH=$ORACLE_HOME/bin:$PATH | |
| echo "Waiting for Oracle to be ready..." | |
| # Install sqlplus for health check | |
| cd /tmp | |
| wget -q https://download.oracle.com/otn_software/linux/instantclient/instantclient-sqlplus-linux.x64-21.1.0.0.0.zip | |
| unzip -q instantclient-sqlplus-linux.x64-21.1.0.0.0.zip | |
| sudo mv instantclient_21_1/sqlplus /usr/local/bin/ | |
| sudo mv instantclient_21_1/* /usr/lib/oracle/21/client64/lib/ | |
| sudo ldconfig | |
| for i in {1..120}; do | |
| if echo "SELECT 1 FROM DUAL;" | sqlplus -S system/System123456@localhost:1521/XEPDB1 2>&1 | grep -q "1"; then | |
| echo "Oracle is ready!" | |
| echo "SELECT * FROM v\$version;" | sqlplus -S system/System123456@localhost:1521/XEPDB1 2>&1 | head -5 | |
| break | |
| fi | |
| if [ $i -eq 120 ]; then | |
| echo "Oracle failed to start after 240 seconds" | |
| exit 1 | |
| fi | |
| echo "Waiting for Oracle... ($i/120)" | |
| sleep 2 | |
| done | |
| - name: Setup Oracle test user | |
| run: | | |
| export ORACLE_HOME=/usr/lib/oracle/21/client64 | |
| export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH | |
| export PATH=$ORACLE_HOME/bin:$PATH | |
| # Connect to XEPDB1 PDB and create testuser | |
| sqlplus -S system/System123456@localhost:1521/XEPDB1 <<EOF | |
| ALTER SESSION SET CONTAINER=XEPDB1; | |
| -- Drop user if exists (ignore errors) | |
| BEGIN | |
| EXECUTE IMMEDIATE 'DROP USER testuser CASCADE'; | |
| EXCEPTION | |
| WHEN OTHERS THEN NULL; | |
| END; | |
| / | |
| -- Create user | |
| CREATE USER testuser IDENTIFIED BY testpass; | |
| GRANT CONNECT, RESOURCE TO testuser; | |
| ALTER USER testuser QUOTA UNLIMITED ON USERS; | |
| EXIT; | |
| EOF | |
| echo "Oracle user 'testuser' created successfully" | |
| - run: composer install --no-interaction --prefer-dist | |
| - run: | | |
| export ORACLE_HOME=/usr/lib/oracle/21/client64 | |
| export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH | |
| export PDODB_DRIVER=oci | |
| export PDODB_HOST=localhost | |
| export PDODB_PORT=1521 | |
| export PDODB_USERNAME=testuser | |
| export PDODB_PASSWORD=testpass | |
| export PDODB_SERVICE_NAME=XEPDB1 | |
| vendor/bin/phpunit --testsuite="Oracle Tests" --coverage-clover coverage-oracle.xml | |
| - name: Test Oracle Examples | |
| run: | | |
| export ORACLE_HOME=/usr/lib/oracle/21/client64 | |
| export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH | |
| export PDODB_DRIVER=oci | |
| export PDODB_USERNAME="testuser" | |
| export PDODB_PASSWORD="testpass" | |
| export PDODB_HOST="localhost" | |
| export PDODB_PORT="1521" | |
| export PDODB_SERVICE_NAME="XEPDB1" | |
| ./scripts/test-examples.sh --verbose | |
| - name: Upload Oracle coverage to Codecov | |
| uses: codecov/codecov-action@v4 | |
| with: | |
| token: ${{ secrets.CODECOV_TOKEN }} | |
| files: ./coverage-oracle.xml | |
| flags: oracle | |
| name: oracle-coverage | |
| shared-coverage: | |
| name: Shared Coverage Tests | |
| runs-on: ubuntu-latest | |
| services: | |
| redis: | |
| image: redis:7-alpine | |
| ports: | |
| - 6379:6379 | |
| options: >- | |
| --health-cmd "redis-cli ping" | |
| --health-interval 10s | |
| --health-timeout 5s | |
| --health-retries 5 | |
| memcached: | |
| image: memcached:1.6-alpine | |
| ports: | |
| - 11211:11211 | |
| options: >- | |
| --health-cmd "echo 'stats' | nc localhost 11211" | |
| --health-interval 10s | |
| --health-timeout 5s | |
| --health-retries 5 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: shivammathur/setup-php@v2 | |
| with: | |
| php-version: '8.4' | |
| extensions: pdo_sqlite, redis, memcached, apcu | |
| coverage: xdebug | |
| - run: composer install --no-interaction --prefer-dist | |
| - run: vendor/bin/phpunit --testsuite="Shared Tests" --coverage-clover coverage-shared.xml | |
| - name: Upload Shared coverage to Codecov | |
| uses: codecov/codecov-action@v4 | |
| with: | |
| token: ${{ secrets.CODECOV_TOKEN }} | |
| files: ./coverage-shared.xml | |
| flags: shared | |
| name: shared-coverage |