Skip to content

Phalcon CI

Phalcon CI #2173

Workflow file for this run

# This file is part of Phalcon.
#
# (c) Phalcon Team <[email protected]>
#
# For the full copyright and license information, please view
# the LICENSE file that was distributed with this source code.
name: Phalcon CI
on:
schedule:
- cron: '0 2 * * *' # Daily at 02:00 runs only on default branch
push:
paths-ignore:
- '**.md'
- '**.txt'
pull_request:
workflow_dispatch:
env:
# All versions should be declared here
PHALCON_VERSION: 5.7.0
ZEPHIR_PARSER_VERSION: 1.6.0
# For tests
LANG: en_US.UTF-8
LANGUAGE: en_US.UTF-8
LC_ALL: en_US.UTF-8
# Windows specific
TOOLS_DIR: 'C:\tools'
# PHP extensions required by Composer
EXTENSIONS: apcu, gettext, gd, igbinary, imagick, intl, json, mbstring, msgpack, memcached, sqlite3, yaml, redis, :memcache, openssl
permissions: {}
jobs:
# Configure Workflow for correct run reusable workflow
# This is required step. It's workaround for non-initialized ENVs when trying to pass input variables from ENVs.
# https://docs.github.com/en/actions/learn-github-actions/reusing-workflows#limitations
setup_workflow:
name: Setup workflow
runs-on: ubuntu-latest
outputs:
zephir_extensions: ${{ steps.setup-zephir-ext.outputs.extensions }}
steps:
- id: setup-zephir-ext
name: Setup Zephir Extensions
run: |
echo "extensions=zephir_parser-${{ env.ZEPHIR_PARSER_VERSION }}" >> "$GITHUB_OUTPUT"
# PHP CodeSniffer inspection
phpcs:
permissions:
contents: read
uses: zephir-lang/templates/.github/workflows/phpcs.yml@main
with:
standard: ./phpcs.xml
# Generate stubs and validates with PSALM
stubs:
needs: setup_workflow
uses: zephir-lang/templates/.github/workflows/phalcon-stubs-zephir-composer.yml@main
with:
extensions: ${{ needs.setup_workflow.outputs.zephir_extensions }}
generate:
needs: setup_workflow
uses: zephir-lang/templates/.github/workflows/phalcon-pecl-zephir-composer.yml@main
with:
extensions: ${{ needs.setup_workflow.outputs.zephir_extensions }}
php_version: '8.3'
secrets:
composer-token: ${{ secrets.GITHUB_TOKEN }}
build-and-test:
permissions:
contents: read # to fetch code (actions/checkout)
name: tests / PHP-${{ matrix.php }}-${{ matrix.ts }}-${{ matrix.name }}-${{ matrix.arch }}
needs: [generate]
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
php: [ '8.0', '8.1', '8.2', '8.3' ]
ts: [ 'nts', 'ts' ]
arch: [ 'x64' ]
name:
- ubuntu-gcc
# Removing temporarily macos builds since it fails due to the container setup
# - macos-clang
# matrix names should be in next format:
# {php}-{ts}-{os.name}-{compiler}-{arch}
include:
# Linux
- { name: ubuntu-gcc, os: ubuntu-20.04, compiler: gcc }
# macOS
- { name: macos-clang, os: macos-12, compiler: clang }
# Windows
- { php: '8.0', ts: 'ts', arch: 'x64', name: 'windows2019-vs16', os: 'windows-2019', compiler: 'vs16' }
- { php: '8.0', ts: 'nts', arch: 'x64', name: 'windows2019-vs16', os: 'windows-2019', compiler: 'vs16' }
#- { php: '8.1', ts: 'ts', arch: 'x64', name: 'windows2019-vs16', os: 'windows-2019', compiler: 'vs16' }
#- { php: '8.1', ts: 'nts', arch: 'x64', name: 'windows2019-vs16', os: 'windows-2019', compiler: 'vs16' }
# Most of the extensions wasn't compiled for PHP 8.2.
# So it is not possible to test in this version, inside Windows OS.
# List of .dlls - https://windows.php.net/downloads/pecl/releases/
#- { php: '8.2', ts: 'ts', arch: 'x64', name: 'windows2019-vs16', os: 'windows-2019', compiler: 'vs16' }
#- { php: '8.2', ts: 'nts', arch: 'x64', name: 'windows2019-vs16', os: 'windows-2019', compiler: 'vs16' }
steps:
- uses: actions/checkout@v4
- name: Setup platform specific environment
shell: pwsh
run: |
git config --global core.autocrlf false
$SessionSavePath = if ("${{ runner.os }}" -eq "Windows") { 'C:\temp' } else { '/tmp' }
Write-Output "SESSION_SAVE_PATH=$SessionSavePath" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
extensions: ${{ env.EXTENSIONS }}
ini-values: apc.enable_cli=on, session.save_path=${{ env.SESSION_SAVE_PATH }}
tools: pecl, phpize, php-config
coverage: xdebug
env:
PHPTS: ${{ matrix.ts }}
COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Download Phalcon Pecl Package
uses: actions/download-artifact@v4
with:
name: phalcon-pecl
path: ./phalcon-pecl
- name: Build Phalcon Extension (Linux)
uses: ./.github/actions/build-phalcon-linux
if: runner.os == 'Linux'
with:
pecl: ./phalcon-pecl/phalcon-pecl.tgz
php-version: ${{ matrix.php }}
- name: Build Phalcon Extension (macOS)
uses: ./.github/actions/build-phalcon-mac
if: runner.os == 'macOS'
with:
pecl: ./phalcon-pecl/phalcon-pecl.tgz
- name: Build Phalcon Extension (Windows)
uses: ./.github/actions/build-phalcon-win
if: runner.os == 'Windows'
with:
pecl: 'phalcon-pecl\phalcon-pecl.tgz'
php_version: ${{ matrix.php }}
ts: ${{ matrix.ts }}
msvc: ${{ matrix.compiler }}
arch: ${{ matrix.arch }}
env:
CACHE_DIR: 'C:\Downloads'
TOOLS_DIR: ${{ env.TOOLS_DIR }}
- name: Get Phalcon Extension path
id: phalcon-ext-path
shell: pwsh
run: |
if ( "${{ runner.os }}" -eq 'Windows' ) {
$ReleaseFolder = if ("${{ matrix.ts }}" -eq "ts") { "Release_TS" } else { "Release" }
$ReleaseFolder = if ("${{ matrix.arch }}" -eq "x64") { "x64\${ReleaseFolder}" } else { "${ReleaseFolder}" }
$PhalconExtPath = "${{ env.TOOLS_DIR }}\pecl\phalcon\phalcon-${{ env.PHALCON_VERSION }}\${ReleaseFolder}\php_phalcon.dll"
} else {
$PhalconExtPath = "$(php-config --extension-dir)/phalcon.so"
}
echo "::set-output name=extension-path::$PhalconExtPath"
# echo "extension-path=$PhalconExtPath" >> "$GITHUB_OUTPUT"
- name: Creates build artifact with Phalcon extension
uses: ./.github/actions/pack-phalcon-ext
with:
target-name: phalcon-php${{ matrix.php }}-${{ matrix.ts }}-${{ matrix.name }}-${{ matrix.arch }}
ext-path: ${{ steps.phalcon-ext-path.outputs.extension-path }}
- name: "Validate composer"
run: composer validate --no-check-all --no-check-publish
- name: "Install development dependencies with Composer"
uses: "ramsey/composer-install@v2"
with:
composer-options: "--prefer-dist"
- name: Setup Tests
shell: bash
run: |
if [ "${{ runner.os }}" = "Linux" ]; then
./.ci/linux-setup-locales.sh
fi
cp tests/_config/.env.default .env
php tests/_config/generate-db-schemas.php
vendor/bin/codecept build
- name: Run Unit Tests
if: always()
run: vendor/bin/codecept run --coverage-xml=coverage-${{ matrix.php }}.xml --ext DotReporter unit
- name: Run CLI Tests
if: always()
run: vendor/bin/codecept run --coverage-xml=coverage-${{ matrix.php }}.xml --ext DotReporter cli
- name: Check Release notes parser
if: runner.os == 'Linux'
shell: bash
run: |
echo "-- Creating Release Notes"
./.ci/release-notes.sh ./CHANGELOG-5.0.md
install:
needs: setup_workflow
uses: zephir-lang/templates/.github/workflows/phalcon-install-from-build.yml@main
with:
extensions: ${{ needs.setup_workflow.outputs.zephir_extensions }}
integration-test:
permissions:
contents: read # to fetch code (actions/checkout)
needs: [generate]
runs-on: ubuntu-latest
services:
mysql:
image: mysql:5.7
ports:
- "3306:3306"
env:
MYSQL_ROOT_PASSWORD: secret
MYSQL_USER: phalcon
MYSQL_DATABASE: phalcon
MYSQL_PASSWORD: secret
postgres:
image: postgres:12-alpine
ports:
- "5432:5432"
env:
POSTGRES_USER: phalcon
POSTGRES_PASSWORD: secret
POSTGRES_DB: phalcon
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
redis:
image: redis:5-alpine
ports:
- "6379:6379"
memcached:
image: memcached:1.5-alpine
ports:
- "11211:11211"
strategy:
fail-fast: false
matrix:
php: [ '8.0', '8.1', '8.2', '8.3' ]
steps:
- uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
extensions: ${{ env.EXTENSIONS }}
ini-values: apc.enable_cli=on, session.save_path=/tmp
tools: pecl
env:
COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Download Phalcon Pecl Package
uses: actions/download-artifact@v4
with:
name: phalcon-pecl
path: ./phalcon-pecl
- name: Build Phalcon Extension from Pecl
uses: ./.github/actions/build-phalcon-linux
with:
pecl: ./phalcon-pecl/phalcon-pecl.tgz
php-version: ${{ matrix.php }}
- name: Prepare test Environment
run: |
echo "::group::Set up locales"
./.ci/linux-setup-locales.sh
echo "::endgroup::"
- name: "Validate composer"
run: composer validate --no-check-all --no-check-publish
- name: "Install development dependencies with Composer"
uses: ramsey/composer-install@v2
with:
composer-options: "--prefer-dist"
- name: Setup Tests
run: |
cp tests/_config/.env.default .env
php tests/_config/generate-db-schemas.php
vendor/bin/codecept build
- name: Run Unit Tests
if: always()
run: vendor/bin/codecept run --coverage-xml=coverage-${{ matrix.php }}.xml --ext DotReporter unit
- name: Run CLI Tests
if: always()
run: vendor/bin/codecept run --coverage-xml=coverage-${{ matrix.php }}.xml --ext DotReporter cli
- name: Run Integration Tests
env:
DATA_REDIS_PORT: ${{ job.services.redis.ports['6379'] }}
DATA_MEMCACHED_PORT: ${{ job.services.memcached.ports['11211'] }}
if: always()
run: vendor/bin/codecept run --coverage-xml=coverage-${{ matrix.php }}.xml --ext DotReporter integration
- name: Run Database Tests (Common)
env:
DATA_REDIS_PORT: ${{ job.services.redis.ports['6379'] }}
DATA_MEMCACHED_PORT: ${{ job.services.memcached.ports['11211'] }}
DATA_MYSQL_USER: root
if: always()
run: vendor/bin/codecept run --coverage-xml=coverage-${{ matrix.php }}.xml --ext DotReporter database -g common
- name: Run Database Tests (MySQL)
env:
DATA_MYSQL_PORT: ${{ job.services.mysql.ports['3306'] }}
DATA_REDIS_PORT: ${{ job.services.redis.ports['6379'] }}
DATA_MEMCACHED_PORT: ${{ job.services.memcached.ports['11211'] }}
DATA_MYSQL_USER: root
if: always()
run: vendor/bin/codecept run --coverage-xml=coverage-${{ matrix.php }}.xml --ext DotReporter database --env mysql -g mysql
- name: Run Database Tests (Sqlite)
env:
DATA_REDIS_PORT: ${{ job.services.redis.ports['6379'] }}
DATA_MEMCACHED_PORT: ${{ job.services.memcached.ports['11211'] }}
if: always()
run: vendor/bin/codecept run --coverage-xml=coverage-${{ matrix.php }}.xml --ext DotReporter database --env sqlite -g sqlite
- name: Run Database Tests (Postgres)
env:
DATA_POSTGRES_USER: phalcon
DATA_POSTGRES_PASS: secret
DATA_POSTGRES_PORT: ${{ job.services.postgres.ports['5432'] }}
DATA_REDIS_PORT: ${{ job.services.redis.ports['6379'] }}
DATA_MEMCACHED_PORT: ${{ job.services.memcached.ports['11211'] }}
if: always()
run: vendor/bin/codecept run --coverage-xml=coverage-${{ matrix.php }}.xml --ext DotReporter database --env pgsql -g pgsql
# - name: Run Database Tests (SQL Server)
# env:
# DATA_REDIS_PORT: ${{ job.services.redis.ports['6379'] }}
# DATA_MEMCACHED_PORT: ${{ job.services.memcached.ports['11211'] }}
# run: vendor/bin/codecept run --ext DotReporter database --env sqlsrv
release:
permissions:
contents: write # to create a release (ncipollo/release-action)
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
needs: [generate, install, build-and-test, integration-test]
name: Create Release
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Get the release version
id: get-version
run: |
echo "version=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
# echo ::set-output name=version::${GITHUB_REF#refs/tags/}
# echo "version=${GITHUB_REF#refs/tags/}" >> "$GITHUB_ENV" # This needs to be checked
- name: Download Phalcon build artifacts
id: download
uses: actions/download-artifact@v4
with:
path: ./build-artifacts
- name: Prepare Release assets
run: |
mkdir -p ./build-artifacts/release
find ./build-artifacts -type f -name phalcon*.zip -exec cp {} ./build-artifacts/release/ ";"
find ./build-artifacts -type f -name phalcon*.tgz -exec cp {} ./build-artifacts/release/ ";"
echo "-- Creating Release Notes"
./.ci/release-notes.sh ./CHANGELOG-5.0.md > ./build-artifacts/release/release-notes.md
- name: Create Release
uses: ncipollo/release-action@v1
with:
token: ${{ secrets.GITHUB_TOKEN }}
name: ${{ env.version }}
tag: ${{ env.version }}
bodyFile: "./build-artifacts/release/release-notes.md"
allowUpdates: true
artifacts: "./build-artifacts/release/*.zip,./build-artifacts/release/*.tgz"
artifactContentType: application/octet-stream