phpvms/.github/workflows/build.yml
2026-05-28 13:06:04 -05:00

243 lines
7.3 KiB
YAML

name: "Build"
on:
pull_request:
push:
branches:
- main
- dev
- "feature/**"
- "release/**"
- "hotfix/**"
workflow_dispatch:
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
build:
runs-on: ubuntu-latest
strategy:
fail-fast: true
matrix:
php-versions: ["8.3", "8.4", "8.5"]
name: PHP ${{ matrix.php-versions }}
env:
extensions: intl, pcov, mbstring
key: cache-v1
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: oven-sh/setup-bun@v2
# Configure Caching
- name: Setup cache environment
id: cache-env
uses: shivammathur/cache-extensions@v1
with:
php-version: ${{ matrix.php-versions }}
extensions: ${{ env.extensions }}
key: ${{ env.key }}
- name: Cache extensions
uses: actions/cache@v4
with:
path: ${{ steps.cache-env.outputs.dir }}
key: ${{ steps.cache-env.outputs.key }}
restore-keys: ${{ steps.cache-env.outputs.key }}
- name: Get composer cache directory
id: composer-cache
run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
- name: Cache dependencies
uses: actions/cache@v4
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
# Configure PHP
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
extensions: ${{ env.extensions }}
ini-values: post_max_size=256M, short_open_tag=On
coverage: xdebug
tools: php-cs-fixer, phpunit
# Bootstrap order has to thread a needle:
# 1. composer install --no-scripts: pulls vendor/ (needed by Vite
# because theme.css @imports vendor/filament/filament/resources/css)
# WITHOUT firing post-autoload-dump (which boots service providers
# that read the Vite manifest + dist files we haven't built yet).
# 2. npm install + npm run build: produces public/build/manifest.json
# and (re)writes resources/js/dist/admin/components/*.js.
# 3. composer dump-autoload: re-fires post-autoload-dump now that the
# frontend artifacts exist; package:discover and filament:upgrade
# boot providers cleanly.
- name: Install Composer dependencies (no scripts)
run: |
php --version
composer install --dev --no-interaction --no-scripts --verbose
composer global require laravel/pint
- name: Install NPM dependencies
run: |
bun install
bun run fmt config/version.yml
- name: Lint & Format Check
run: bun run lint && bun run fmt:check
- name: Compile assets
run: bun run build
- name: Run Composer post-autoload scripts
run: |
composer dump-autoload -o
cp .github/scripts/env.test .env
cp .github/scripts/phpunit.xml phpunit.xml
.github/scripts/version.sh
- name: Run Pint
run: pint --test --parallel
- name: Run Tests
run: |
export PHP_CS_FIXER_IGNORE_ENV=1
vendor/bin/pest --parallel --ci
- name: Run PHPStan
run: vendor/bin/phpstan analyse --memory-limit=2G
# This runs after all of the tests, run have run. Creates a cleaned up version of the
# distro, and then creates the artifact to push up to S3 or wherever
artifacts:
name: "Create release package"
permissions:
contents: write
packages: write
attestations: write
id-token: write
needs: [build]
runs-on: ubuntu-latest
if: github.repository == 'phpvms/phpvms' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev')
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: oven-sh/setup-bun@v2
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: "8.3"
- uses: olegtarasov/get-tag@v2.1.2
id: tagName
# Configure Caching
- name: Get composer cache directory
id: composer-cache
run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
- name: Cache dependencies
uses: actions/cache@v4
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: ${{ runner.os }}-composer-
# Three-step bootstrap (see `build` job comment for full rationale):
# 1. composer install --no-scripts: vendor/ for Vite CSS @imports
# 2. npm build: writes public/build manifest + dist files
# 3. composer dump-autoload: re-fires post-autoload-dump cleanly
- name: "Install Release Dependencies (no scripts)"
run: |
rm -rf vendor
composer install --no-dev --prefer-dist --no-interaction --no-scripts --verbose
sudo chmod +x ./.github/scripts/*
- name: Install NPM dependencies
run: bun install
- name: Compile assets
run: bun run build
- name: Run Composer post-autoload scripts
run: composer dump-autoload
- id: version
name: Get version
run: .github/scripts/version.sh
- name: Build Distro
run: .github/scripts/build.sh
- uses: BetaHuhn/do-spaces-action@v2
id: spaces
with:
access_key: ${{ secrets.SPACE_ACCESS_KEY}}
secret_key: ${{ secrets.SPACE_SECRET_KEY }}
space_name: ${{ secrets.SPACE_NAME }}
space_region: ${{ secrets.SPACE_REGION }}
source: dist
cdn_domain: phpvms.cdn.vmslabs.net
permission: public-read
- name: Discord notification
uses: Ilshidur/action-discord@0.3.2
env:
DISCORD_WEBHOOK: ${{ secrets.V8_DISCORD_WEBHOOK }}
with:
args: ${{ steps.version.outputs.discord_msg }}
- name: Upload artifact for deployment job
uses: actions/upload-artifact@v4
with:
name: phpvms-package
path: "dist/*"
docker:
name: "Create docker image"
permissions:
contents: write
packages: write
attestations: write
id-token: write
runs-on: ubuntu-latest
needs: [build]
if: github.repository == 'phpvms/phpvms' && github.event_name != 'pull_request' && (github.ref == 'refs/heads/main')
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push Docker images
uses: iloveitaly/github-action-railpack@master
with:
push: false
tags: |
${{ env.IMAGE_NAME }}:latest
# - name: Generate artifact attestation
# uses: actions/attest-build-provenance@v2
# with:
# subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}}
# subject-digest: ${{ steps.push.outputs.digest }}
# push-to-registry: true