diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml index fada4116..1f16d305 100644 --- a/.forgejo/workflows/ci.yml +++ b/.forgejo/workflows/ci.yml @@ -4,27 +4,20 @@ on: push: branches: ['release/*'] pull_request: - branches: [main] + branches: [main, 'release/*'] jobs: ci: runs-on: docker container: - image: catthehacker/ubuntu:act-latest + image: forge.lvl0.xyz/lvl0/fedi-feed-router-ci:php8.3-2 steps: - uses: https://data.forgejo.org/actions/checkout@v4 - - name: Set up PHP - uses: https://github.com/shivammathur/setup-php@v2 - with: - php-version: '8.3' - extensions: pdo_sqlite, mbstring, xml, dom - coverage: pcov - - name: Cache Composer dependencies uses: https://data.forgejo.org/actions/cache@v4 with: - path: ~/.composer/cache + path: ~/.cache/composer key: composer-${{ hashFiles('composer.lock') }} restore-keys: composer- @@ -41,4 +34,4 @@ jobs: run: vendor/bin/phpstan analyse --memory-limit=1G - name: Tests - run: php artisan test --coverage-clover coverage.xml --coverage-text + run: php -d memory_limit=512M vendor/bin/phpunit diff --git a/.forgejo/workflows/images.yml b/.forgejo/workflows/images.yml new file mode 100644 index 00000000..ba694bfd --- /dev/null +++ b/.forgejo/workflows/images.yml @@ -0,0 +1,47 @@ +name: Build and Push Base Images + +on: + push: + branches: [main] + paths: + - 'docker/build/**' + - '.forgejo/workflows/images.yml' + workflow_dispatch: + +jobs: + images: + runs-on: docker + container: + image: catthehacker/ubuntu:act-latest + strategy: + matrix: + include: + - name: fedi-feed-router-base + file: docker/build/Dockerfile.base + version: php8.3-1 + - name: fedi-feed-router-ci + file: docker/build/Dockerfile.ci + version: php8.3-2 + steps: + - uses: https://data.forgejo.org/actions/checkout@v4 + + - name: Set up Docker Buildx + uses: https://data.forgejo.org/docker/setup-buildx-action@v3 + + - name: Login to Forgejo Registry + uses: https://data.forgejo.org/docker/login-action@v3 + with: + registry: forge.lvl0.xyz + username: ${{ github.actor }} + password: ${{ secrets.REGISTRY_TOKEN }} + + - name: Build and push + uses: https://data.forgejo.org/docker/build-push-action@v5 + with: + context: . + file: ${{ matrix.file }} + push: true + tags: | + forge.lvl0.xyz/lvl0/${{ matrix.name }}:${{ matrix.version }} + forge.lvl0.xyz/lvl0/${{ matrix.name }}:latest + forge.lvl0.xyz/lvl0/${{ matrix.name }}:${{ github.sha }} diff --git a/composer.json b/composer.json index 0254fbae..99b45229 100644 --- a/composer.json +++ b/composer.json @@ -14,6 +14,7 @@ "license": "AGPL-3.0-only", "require": { "php": "^8.2", + "ext-gd": "*", "blade-ui-kit/blade-heroicons": "^2.6", "laravel/framework": "^12.0", "laravel/horizon": "^5.29", diff --git a/composer.lock b/composer.lock index 665abac6..fabaf870 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e6ce5effb7f8c4d5a3f6d8cd04b6e299", + "content-hash": "67923d1e9e79798f3ebe2e79954f4795", "packages": [ { "name": "blade-ui-kit/blade-heroicons", @@ -8747,7 +8747,8 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^8.2" + "php": "^8.2", + "ext-gd": "*" }, "platform-dev": {}, "plugin-api-version": "2.6.0" diff --git a/docker/build/Dockerfile.ci b/docker/build/Dockerfile.ci new file mode 100644 index 00000000..50857a02 --- /dev/null +++ b/docker/build/Dockerfile.ci @@ -0,0 +1,32 @@ +# Image for CI: PHP and Composer only, no runtime server or frontend toolchain. +# Tests run against sqlite in memory (see .env.testing), so no database client +# or cache extension is needed. +# +# Published as fedi-feed-router-ci:php-, not :latest. Runners +# cache mutable tags and will not re-pull them, so bump the revision in the tag +# and in ci.yml whenever this file changes. +# +# Debian-based rather than alpine: the alpine build hit repeated DNS resolution +# timeouts against codeload.github.com during composer install. +# +# gd is not declared in composer.lock but ThumbnailUploader calls it directly. +FROM php:8.3-cli + +COPY --from=mlocati/php-extension-installer:2 /usr/bin/install-php-extensions /usr/local/bin/ + +RUN install-php-extensions \ + pdo_sqlite \ + mbstring \ + dom \ + xml \ + fileinfo \ + pcntl \ + gd + +# nodejs is not used by the app's tests; the Forgejo/GitHub JavaScript actions +# (checkout, cache) are executed with it inside this container. +RUN apt-get update \ + && apt-get install -y --no-install-recommends git unzip nodejs \ + && rm -rf /var/lib/apt/lists/* + +COPY --from=composer:2 /usr/bin/composer /usr/bin/composer