diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..19491ec --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,41 @@ +name: CI + +on: + push: + branches: [master] + tags: ['*'] + pull_request: + branches: [master] + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Build Docker image + run: docker compose build + + - name: Install dependencies + run: docker compose run --rm --user $(id -u) php-sniffs-cli composer install --no-interaction + + - name: Validate Composer configuration + run: docker compose run --rm --user $(id -u) php-sniffs-cli composer validate --no-interaction + + deploy: + needs: test + if: github.ref_type == 'tag' + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Deploy to Gemfury + env: + GEMFURY_USER: ${{ secrets.GEMFURY_USER }} + GEMFURY_PASSWORD: ${{ secrets.GEMFURY_PASSWORD }} + GEMFURY_REPO_SLUG: ${{ secrets.GEMFURY_REPO_SLUG }} + run: bash scripts/deploy.sh diff --git a/.gitignore b/.gitignore index 8346f5a..9584282 100644 --- a/.gitignore +++ b/.gitignore @@ -13,9 +13,7 @@ *.local.php *.local.ini *.env -composer.lock # packages vendor/ node_modules/ - diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 3e0eb06..0000000 --- a/.travis.yml +++ /dev/null @@ -1,26 +0,0 @@ -language: php - -matrix: - include: - - dist: focal - php: 8.2 - env: LIBONIG_INSTALL=1 - - fast_finish: true - -before_install: - - if [ -n "$LIBONIG_INSTALL" ]; then sudo apt-get install libonig5; fi - - travis_retry composer self-update - - travis_retry composer update --prefer-dist - -deploy: - provider: script - script: scripts/deploy.sh - skip_cleanup: false - on: - tags: true - condition: "$TRAVIS_PHP_VERSION = 8.2" - -cache: - directories: - - $HOME/.composer/cache diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..2784022 --- /dev/null +++ b/composer.lock @@ -0,0 +1,103 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "5c55074be1cf952b7f73495fa19640e7", + "packages": [ + { + "name": "squizlabs/php_codesniffer", + "version": "3.13.6", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "4c378e1a528ea066890fc2397cbdd2f94eb2fc91" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/4c378e1a528ea066890fc2397cbdd2f94eb2fc91", + "reference": "4c378e1a528ea066890fc2397cbdd2f94eb2fc91", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" + }, + "bin": [ + "bin/phpcbf", + "bin/phpcs" + ], + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "Former lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" + } + ], + "time": "2026-08-06T00:17:32+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=7.1" + }, + "platform-dev": {}, + "platform-overrides": { + "php": "8.2.3" + }, + "plugin-api-version": "2.9.0" +} diff --git a/docker-compose.yml b/docker-compose.yml index d0619cf..5588706 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,52 +1,8 @@ -version: '3.4' - services: - php-sniff-php-fpm: - container_name: php-sniff-php-fpm + php-sniffs-cli: + container_name: php-sniffs-cli build: context: ./ dockerfile: ./docker/php/Dockerfile - target: debugging - ports: - - "30112:80" volumes: - ./:/var/www/project - environment: - IN_DOCKER: 1 - - PHP_INI_UPLOAD_MAX_FILESIZE: 100M - PHP_INI_POST_MAX_SIZE: 108M - PHP_INI_MAX_FILE_UPLOADS: 200 - INI_EXPOSE_PHP: 0 - - INI_MAX_EXECUTION_TIME: 0 - INI_MEMORY_LIMIT: 2G - - INI_ERROR_LOG: .debug/php-errors.log - INI_LOG_ERRORS: 1 - INI_DISPLAY_ERRORS: "E_ALL & ~E_DEPRECATED & ~E_NOTICE" - INI_DISPLAY_STARTUP_ERRORS: 1 - INI_ERROR_REPORTING: 1 - INI_HTML_ERRORS: 0 - - # https://xdebug.org/docs/all_settings#mode - # INI_XDEBUG_MODE=off,debug,profile,trace - EG - Enables step debugger, profiling and tracing - INI_XDEBUG_MODE: "debug" - INI_XDEBUG_HOST: host.docker.internal - INI_XDEBUG_PORT: 9000 - INI_IDEKEY: PHPSTORM - INI_XDEBUG_OUTPUT_DIR: "/var/www/project/.debug" - INI_XDEBUG_DISCOVER_CLIENT_HOST: 1 - INI_XDEBUG_CLI_COLOR: 1 - INI_XDEBUG_START_WITH_REQUEST: 1 - - INI_XDEBUG_LOG: "/var/www/project/.debug/remote.log" - INI_XDEBUG_LOG_LEVEL: 7 - - INI_XDEBUG_TRACE_FORMAT: 0 - INI_XDEBUG_TRACE_OUTPUT_NAME: "trace.%t-%s" - - INI_XDEBUG_PROFILER_APPEND: 0 - INI_XDEBUG_PROFILER_OUTPUT_NAME: "cachegrind.out.%t-%s" - - PHP_IDE_CONFIG: "serverName=php-sniff-php-fpm" diff --git a/docker/php/Dockerfile b/docker/php/Dockerfile index 38b2c30..034306c 100644 --- a/docker/php/Dockerfile +++ b/docker/php/Dockerfile @@ -1,69 +1,41 @@ -# For why we separate so many docker layers by performing multiple RUN and COPY, please see -# https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ -# https://www.ginkgobioworks.com/2020/05/18/optimizing-your-dockerfile/ +FROM php:8.2.31-cli-alpine3.23 AS base -FROM base-php-fpm:php82 as base +RUN apk add --no-cache \ + bash \ + curl \ + git \ + libzip-dev \ + oniguruma-dev \ + unzip -COPY ./docker/php/www.conf /usr/local/etc/php-fpm.d/www.conf -RUN chmod 644 /usr/local/etc/php-fpm.d/www.conf +RUN docker-php-ext-install mbstring zip -FROM base as composer-install +COPY --from=composer:2 /usr/bin/composer /usr/bin/composer -COPY --chown=www-data:www-data ./composer.json /var/www/project/composer.json -COPY --chown=www-data:www-data ./composer.lock /var/www/project/composer.lock +WORKDIR /var/www/project -USER www-data -RUN COMPOSER_MEMORY_LIMIT=-1 composer install -USER root - -FROM base as copy-volume - -COPY --chown=www-data:www-data ./ /var/www/project - - -FROM base as env-file - -RUN mkdir -p shop-env-config -RUN touch shop-env-config/.env - -RUN chown www-data:www-data /var/www/project/shop-env-config/.env - - -# ---------------- Debug ----------------- # +FROM base AS composer-install -FROM base as debugging +COPY --chown=www-data:www-data ./composer.json composer.json +COPY --chown=www-data:www-data ./composer.lock composer.lock -RUN install-php-extensions xdebug +RUN mkdir -p vendor && chown www-data:www-data vendor -# debug settings -RUN mkdir -m 777 -p .debug -RUN chown www-data:www-data .debug - -# Travis should have the same ini setup as live prod -COPY ./docker/php/php-fpm-ini.ini /usr/local/etc/php/conf.d/999-overrides.ini - -COPY --from=composer-install /var/www/project . -COPY --from=env-file /var/www/project . -COPY --from=copy-volume /var/www/project . - -# Bind mount location -VOLUME ["/var/www/project"] +USER www-data +RUN COMPOSER_MEMORY_LIMIT=-1 composer install --no-interaction +USER root -CMD php-fpm +FROM base AS copy-volume +COPY --chown=www-data:www-data ./ /var/www/project # ---------------- CI ----------------- # -FROM base as image-ci-testing +FROM base AS image-ci-testing -# Travis should have the same ini setup as live prod -COPY ./docker/php/php-fpm-ini.ini /usr/local/etc/php/conf.d/999-overrides.ini +COPY ./docker/php/php-ini.ini /usr/local/etc/php/conf.d/999-overrides.ini COPY --from=composer-install /var/www/project . -COPY --from=env-file /var/www/project . COPY --from=copy-volume /var/www/project . -# Bind mount location VOLUME ["/var/www/project"] - -CMD php-fpm diff --git a/docker/php/php-fpm-ini.ini b/docker/php/php-fpm-ini.ini deleted file mode 100644 index 65cbbda..0000000 --- a/docker/php/php-fpm-ini.ini +++ /dev/null @@ -1,23 +0,0 @@ -memory_limit = -1 - -[xdebug] - -xdebug.mode=${INI_XDEBUG_MODE} -xdebug.client_host=${INI_XDEBUG_HOST} -xdebug.client_port=${INI_XDEBUG_PORT} -xdebug.idekey=${INI_IDEKEY} -xdebug.output_dir=${INI_XDEBUG_OUTPUT_DIR} -xdebug.discover_client_host = ${INI_XDEBUG_DISCOVER_CLIENT_HOST} -xdebug.cli_color = ${INI_XDEBUG_CLI_COLOR} -xdebug.start_with_request = ${INI_XDEBUG_START_WITH_REQUEST} - -xdebug.log = ${INI_XDEBUG_LOG} -xdebug.log_level = ${INI_XDEBUG_LOG_LEVEL} - -xdebug.trace_format = ${INI_XDEBUG_TRACE_FORMAT} -xdebug.trace_output_name = ${INI_XDEBUG_TRACE_OUTPUT_NAME} - -xdebug.profiler_append = ${INI_XDEBUG_PROFILER_APPEND} -xdebug.profiler_output_name = ${INI_XDEBUG_PROFILER_OUTPUT_NAME} - - diff --git a/docker/php/php-ini.ini b/docker/php/php-ini.ini new file mode 100644 index 0000000..7999e96 --- /dev/null +++ b/docker/php/php-ini.ini @@ -0,0 +1 @@ +memory_limit = -1 diff --git a/docker/php/www.conf b/docker/php/www.conf deleted file mode 100644 index 94e799c..0000000 --- a/docker/php/www.conf +++ /dev/null @@ -1,13 +0,0 @@ -[www] - -user = www-data -group = www-data - -pm = static -pm.max_children = 75 -pm.max_requests = 250 -pm.status_path = /status - -ping.path = /ping - -access.format = "%m %r %d %C %M %s %q" diff --git a/scripts/deploy.sh b/scripts/deploy.sh index c0e2d9e..656d32f 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -1,7 +1,22 @@ #!/bin/bash -if [ -n $TRAVIS_TAG ] -then - printf "machine git.fury.io\nlogin $GEMFURY_USER\npassword $GEMFURY_PASSWORD" > ~/.netrc - git remote add fury "https://git.fury.io/$TRAVIS_REPO_SLUG.git" - git push --tags fury HEAD:master -fi \ No newline at end of file + +if [[ "$GITHUB_REF_TYPE" != "tag" ]]; then + echo "Not a tag build, skipping deploy" + exit 0 +fi + +if [ -z "$GEMFURY_USER" ] || [ -z "$GEMFURY_PASSWORD" ] || [ -z "$GEMFURY_REPO_SLUG" ]; then + echo "Missing Gemfury credentials, cannot deploy" + exit 1 +fi + +echo "Deploying tag ${GITHUB_REF_NAME}..." + +printf "machine git.fury.io\nlogin $GEMFURY_USER\npassword $GEMFURY_PASSWORD" > ~/.netrc +chmod 600 ~/.netrc + +git remote add fury "https://git.fury.io/$GEMFURY_REPO_SLUG.git" +git fetch fury +git push fury "refs/tags/${GITHUB_REF_NAME}" +sleep 5 +git push fury HEAD:master