diff options
-rw-r--r-- | .github/workflows/build.yml | 154 | ||||
-rw-r--r-- | .github/workflows/ci-build.yml | 122 | ||||
-rw-r--r-- | .gitignore | 2 | ||||
-rwxr-xr-x | Makefile | 1 | ||||
-rw-r--r-- | bors.toml | 24 | ||||
-rw-r--r-- | composer.json | 8 | ||||
-rw-r--r-- | phpstan.neon.dist | 1 | ||||
-rw-r--r-- | src/Diactoros/ServerRequestFactory.php | 4 | ||||
-rw-r--r-- | src/Diactoros/StreamFactory.php | 2 | ||||
-rw-r--r-- | src/Diactoros/UploadedFileFactory.php | 2 | ||||
-rw-r--r-- | src/HttpClient.php | 9 |
11 files changed, 183 insertions, 146 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..92b55666 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,154 @@ +name: build + +on: + push: + pull_request: + +jobs: + php: + name: Build (PHP ${{ matrix.php }}, ${{ matrix.setup }} setup) + runs-on: ubuntu-20.04 + timeout-minutes: 6 + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4', '8.0'] + setup: [basic, lowest] + steps: + - name: Set up PHP ${{ matrix.php }} + uses: shivammathur/setup-php@v2 # action page: <https://github.com/shivammathur/setup-php> + with: + php-version: ${{ matrix.php }} + + - name: Check out code + uses: actions/checkout@v2 + + - name: Syntax check only (lint) + run: find ./src/ ./tests/ -name "*.php" -print0 | xargs -0 -n1 -P8 php -l + + - name: Get Composer Cache Directory + id: composer-cache + run: echo "::set-output name=dir::$(composer config cache-files-dir)" + + - name: Init Composer Cache # Docs: <https://git.io/JfAKn#php---composer> + uses: actions/cache@v2 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ matrix.setup }}-${{ hashFiles('**/composer.json') }} + restore-keys: ${{ runner.os }}-composer- + + - name: Install lowest Composer dependencies + if: matrix.setup == 'lowest' + run: composer update --prefer-dist --no-progress --prefer-lowest --ansi + + - name: Install basic Composer dependencies + if: matrix.setup == 'basic' + run: composer update --prefer-dist --no-progress --ansi + + - name: Analyze PHP sources + run: composer analyze + + # TODO write phpunit tests + #- name: Analyze PHP sources + # run: composer test + + golang: + name: Build (Go ${{ matrix.go }}, PHP ${{ matrix.php }}) + runs-on: ubuntu-20.04 + timeout-minutes: 10 + strategy: + fail-fast: false + matrix: + php: ['7.3', '7.4', '8.0'] + go: ['1.14', '1.15'] + steps: + - name: Set up Go ${{ matrix.go }} + uses: actions/setup-go@v2 # action page: <https://github.com/actions/setup-go> + with: + go-version: ${{ matrix.go }} + + - name: Set up PHP ${{ matrix.php }} + uses: shivammathur/setup-php@v2 # action page: <https://github.com/shivammathur/setup-php> + with: + php-version: ${{ matrix.php }} + + - name: Check out code + uses: actions/checkout@v2 + + - name: Get Composer Cache Directory + id: composer-cache + run: echo "::set-output name=dir::$(composer config cache-files-dir)" + + - name: Init Composer Cache # Docs: <https://git.io/JfAKn#php---composer> + uses: actions/cache@v2 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ matrix.php }}-${{ hashFiles('**/composer.json') }} + restore-keys: ${{ runner.os }}-composer- + + - name: Install Composer dependencies + run: composer update --prefer-dist --no-progress --ansi + + - name: Init Go modules Cache # Docs: <https://git.io/JfAKn#go---modules> + uses: actions/cache@v2 + with: + path: ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: ${{ runner.os }}-go- + + - name: Install Go dependencies + run: go mod download + + - name: Run golang tests + run: | + mkdir ./coverage-ci + go test -race -v -covermode=atomic -coverprofile=./coverage-ci/lib.txt + go test ./util -race -v -covermode=atomic -coverprofile=./coverage-ci/util.txt + go test ./service -race -v -covermode=atomic -coverprofile=./coverage-ci/service.txt + go test ./service/env -race -v -covermode=atomic -coverprofile=./coverage-ci/env.txt + go test ./service/rpc -race -v -covermode=atomic -coverprofile=./coverage-ci/rpc.txt + go test ./service/http -race -v -covermode=atomic -coverprofile=./coverage-ci/http.txt + go test ./service/static -race -v -covermode=atomic -coverprofile=./coverage-ci/static.txt + go test ./service/limit -race -v -covermode=atomic -coverprofile=./coverage-ci/limit.txt + go test ./service/headers -race -v -covermode=atomic -coverprofile=./coverage-ci/headers.txt + go test ./service/metrics -race -v -covermode=atomic -coverprofile=./coverage-ci/metrics.txt + go test ./service/health -race -v -covermode=atomic -coverprofile=./coverage-ci/health.txt + go test ./service/gzip -race -v -covermode=atomic -coverprofile=./coverage-ci/gzip.txt + go test ./service/reload -race -v -covermode=atomic -coverprofile=./coverage-ci/reload.txt + cat ./coverage-ci/*.txt > ./coverage-ci/summary.txt + + - uses: codecov/codecov-action@v1 # Docs: <https://github.com/codecov/codecov-action> + with: + token: ${{ secrets.CODECOV_TOKEN }} + file: ./coverage-ci/summary.txt + fail_ci_if_error: false + + golangci-check: + name: Golang-CI (lint) + runs-on: ubuntu-20.04 + steps: + - name: Check out code + uses: actions/checkout@v1 + + - name: golangci-lint + uses: reviewdog/action-golangci-lint@v1 # action page: <https://github.com/reviewdog/action-golangci-lint> + with: + github_token: ${{ secrets.github_token }} + + image: + name: Build docker image + runs-on: ubuntu-20.04 + timeout-minutes: 10 + steps: + - name: Check out code + uses: actions/checkout@v2 + + - name: Build image + run: docker build -t roadrunner:local -f Dockerfile . + + - name: Scan image + uses: anchore/scan-action@v2 # action page: <https://github.com/anchore/scan-action> + with: + image: roadrunner:local + fail-build: true + severity-cutoff: low # negligible, low, medium, high or critical diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml deleted file mode 100644 index ded84778..00000000 --- a/.github/workflows/ci-build.yml +++ /dev/null @@ -1,122 +0,0 @@ -name: CI - -on: [ push, pull_request ] - -jobs: - build: - name: Build (PHP ${{ matrix.php }}, Go ${{ matrix.go }}, OS ${{ matrix.os }}) - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - php: [ 7.3, 7.4, 8.0 ] - go: [ 1.14, 1.15 ] - os: [ ubuntu-20.04 ] - env: - GO111MODULE: on - steps: - - name: Set up Go ${{ matrix.go }} - uses: actions/setup-go@v1 - with: - go-version: ${{ matrix.go }} - - - name: Set up PHP ${{ matrix.php }} - uses: shivammathur/setup-php@v1 - with: - php-version: ${{ matrix.php }} - extensions: dom - coverage: xdebug - - - name: Check out code - uses: actions/checkout@v2 - with: - fetch-depth: 1 - - - name: Show versions - run: php -v ; composer -V ; go version - - - name: Debug if needed - env: - DEBUG: ${{ secrets.DEBUG }} - run: if [[ "$DEBUG" == "true" ]]; then env && go env; fi - - - name: Syntax check only (lint) - run: find ./src/ -name "*.php" -print0 | xargs -0 -n1 -P8 php -l - - - name: Get Composer Cache Directory # Docs: <https://github.com/actions/cache/blob/master/examples.md#php---composer> - id: composer-cache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" - - - name: Cache dependencies # Docs: <https://github.com/actions/cache/blob/master/examples.md#php---composer> - uses: actions/cache@v1 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} - restore-keys: ${{ runner.os }}-composer- - - - name: Install Composer dependencies - run: composer install --prefer-dist --no-interaction --no-suggest # --prefer-source - - - name: Analyze PHP sources - run: composer analyze - - - name: Install Go dependencies - run: go mod download - - - name: Run golang tests - run: | - composer update - go test -race -v -coverprofile=lib.txt -covermode=atomic - go test ./util -race -v -coverprofile=util.txt -covermode=atomic - go test ./service -race -v -coverprofile=service.txt -covermode=atomic - go test ./service/env -race -v -coverprofile=env.txt -covermode=atomic - go test ./service/rpc -race -v -coverprofile=rpc.txt -covermode=atomic - go test ./service/http -race -v -coverprofile=http.txt -covermode=atomic - go test ./service/static -race -v -coverprofile=static.txt -covermode=atomic - go test ./service/limit -race -v -coverprofile=limit.txt -covermode=atomic - go test ./service/headers -race -v -coverprofile=headers.txt -covermode=atomic - go test ./service/metrics -race -v -coverprofile=metrics.txt -covermode=atomic - go test ./service/health -race -v -coverprofile=health.txt -covermode=atomic - - - name: Run code coverage - env: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} - run: | - if [[ "$CODECOV_TOKEN" != "" ]]; then - curl https://codecov.io/bash -o codecov-bash - chmod +x codecov-bash - ./codecov-bash -f lib.txt - ./codecov-bash -f util.txt - ./codecov-bash -f service.txt - ./codecov-bash -f env.txt - ./codecov-bash -f rpc.txt - ./codecov-bash -f http.txt - ./codecov-bash -f static.txt - ./codecov-bash -f limit.txt - ./codecov-bash -f headers.txt - ./codecov-bash -f metrics.txt - ./codecov-bash -f health.txt - fi - - golangci-check: - name: runner / golangci-lint - runs-on: ubuntu-20.04 - steps: - - name: Check out code into the Go module directory - uses: actions/checkout@v1 - - name: golangci-lint - uses: reviewdog/action-golangci-lint@v1 - with: - github_token: ${{ secrets.github_token }} - - image: - name: Build docker image - runs-on: ubuntu-20.04 - steps: - - name: Check out code - uses: actions/checkout@v2 - with: - fetch-depth: 1 - - - name: Build image - run: docker build -t rr:local -f Dockerfile . @@ -5,4 +5,4 @@ vendor_php builds/ tests/vendor/ .rr-sample.yaml -psr-worker.php
\ No newline at end of file +psr-worker.php @@ -24,6 +24,7 @@ uninstall: ## Uninstall locally installed RR rm -f /usr/local/bin/rr test: ## Run application tests + test -d ./vendor_php || composer update --prefer-dist --ansi go test -v -race -cover go test -v -race -cover ./util go test -v -race -cover ./service @@ -1,14 +1,18 @@ status = [ -'Build (PHP 7.3, Go 1.15, OS ubuntu-20.04)', -'Build (PHP 7.3, Go 1.14, OS ubuntu-20.04)', -'Build (PHP 7.4, Go 1.15, OS ubuntu-20.04)', -'Build (PHP 7.4, Go 1.14, OS ubuntu-20.04)', -'Build (PHP 8, Go 1.15, OS ubuntu-20.04)', -'Build (PHP 8, Go 1.14, OS ubuntu-20.04)', -'runner / golangci-lint', -'Build docker image',] - +'Build (PHP 7.3, basic setup)', +'Build (PHP 7.3, lowest setup)', +'Build (PHP 8.0, basic setup)', +'Build (PHP 8.0, lowest setup)', +'Build (Go 1.14, PHP 7.3)', +'Build (Go 1.15, PHP 7.3)', +'Build (Go 1.14, PHP 7.4)', +'Build (Go 1.15, PHP 7.4)', +'Build (Go 1.14, PHP 8.0)', +'Build (Go 1.15, PHP 8.0)', +'Golang-CI (lint)', +'Build docker image', +] required_approvals = 1 delete_merged_branches = true -timeout-sec = 1800
\ No newline at end of file +timeout-sec = 1800 diff --git a/composer.json b/composer.json index 383ac2d1..3d6b3d22 100644 --- a/composer.json +++ b/composer.json @@ -18,17 +18,17 @@ "ext-json": "*", "ext-curl": "*", "spiral/goridge": "^2.4.2", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.0", + "psr/http-factory": "^1.0.1", + "psr/http-message": "^1.0.1", "symfony/console": "^2.5.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", - "laminas/laminas-diactoros": "^1.3 || ^2.0", + "laminas/laminas-diactoros": "^1.3.6 || ^2.0", "composer/package-versions-deprecated": "^1.8" }, "config": { "vendor-dir": "vendor_php" }, "require-dev": { - "phpstan/phpstan": "~0.12" + "phpstan/phpstan": "~0.12.34" }, "scripts": { "analyze": "phpstan analyze -c ./phpstan.neon.dist --no-progress --ansi" diff --git a/phpstan.neon.dist b/phpstan.neon.dist index c9ffb648..a6ef3b8a 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -1,5 +1,4 @@ parameters: level: 'max' - checkMissingIterableValueType: false paths: - src diff --git a/src/Diactoros/ServerRequestFactory.php b/src/Diactoros/ServerRequestFactory.php index 3fcf8e29..6a42f207 100644 --- a/src/Diactoros/ServerRequestFactory.php +++ b/src/Diactoros/ServerRequestFactory.php @@ -11,12 +11,14 @@ namespace Spiral\RoadRunner\Diactoros; use Psr\Http\Message\ServerRequestFactoryInterface; use Psr\Http\Message\ServerRequestInterface; -use Zend\Diactoros\ServerRequest; +use Laminas\Diactoros\ServerRequest; final class ServerRequestFactory implements ServerRequestFactoryInterface { /** * @inheritdoc + * + * @param array<mixed> $serverParams Array of SAPI parameters with which to seed the generated request instance. */ public function createServerRequest(string $method, $uri, array $serverParams = []): ServerRequestInterface { diff --git a/src/Diactoros/StreamFactory.php b/src/Diactoros/StreamFactory.php index cc0a5306..68a77e92 100644 --- a/src/Diactoros/StreamFactory.php +++ b/src/Diactoros/StreamFactory.php @@ -12,7 +12,7 @@ namespace Spiral\RoadRunner\Diactoros; use RuntimeException; use Psr\Http\Message\StreamFactoryInterface; use Psr\Http\Message\StreamInterface; -use Zend\Diactoros\Stream; +use Laminas\Diactoros\Stream; final class StreamFactory implements StreamFactoryInterface { diff --git a/src/Diactoros/UploadedFileFactory.php b/src/Diactoros/UploadedFileFactory.php index 45773287..daa475c1 100644 --- a/src/Diactoros/UploadedFileFactory.php +++ b/src/Diactoros/UploadedFileFactory.php @@ -12,7 +12,7 @@ namespace Spiral\RoadRunner\Diactoros; use Psr\Http\Message\StreamInterface; use Psr\Http\Message\UploadedFileFactoryInterface; use Psr\Http\Message\UploadedFileInterface; -use Zend\Diactoros\UploadedFile; +use Laminas\Diactoros\UploadedFile; final class UploadedFileFactory implements UploadedFileFactoryInterface { diff --git a/src/HttpClient.php b/src/HttpClient.php index 4ca152c8..9b9048ca 100644 --- a/src/HttpClient.php +++ b/src/HttpClient.php @@ -62,14 +62,13 @@ final class HttpClient */ public function respond(int $status, string $body, array $headers = []): void { - if (empty($headers)) { - // this is required to represent empty header set as map and not as array - $headers = new \stdClass(); - } + $sendHeaders = empty($headers) + ? new \stdClass() // this is required to represent empty header set as map and not as array + : $headers; $this->getWorker()->send( $body, - (string) json_encode(['status' => $status, 'headers' => $headers]) + (string) json_encode(['status' => $status, 'headers' => $sendHeaders]) ); } } |