diff options
Diffstat (limited to '.github')
-rw-r--r-- | .github/workflows/build.yml | 154 | ||||
-rwxr-xr-x | .github/workflows/ci-build.yml | 119 | ||||
-rw-r--r-- | .github/workflows/codeql-analysis.yml | 2 | ||||
-rw-r--r-- | .github/workflows/release.yml | 139 |
4 files changed, 294 insertions, 120 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 100755 index 8ec3eec9..00000000 --- a/.github/workflows/ci-build.yml +++ /dev/null @@ -1,119 +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.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@v2 - 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 - - # - name: Analyze PHP sources - # run: composer analyze - - - name: Install Go dependencies - run: go mod download - - - name: Run golang tests - run: | - mkdir ./coverage-ci - go test -v -race -cover -tags=debug -coverprofile=./coverage-ci/lib.txt -covermode=atomic . - go test -v -race -cover -tags=debug -coverprofile=./coverage-ci/rpc_config.txt -covermode=atomic ./plugins/rpc - go test -v -race -cover -tags=debug -coverprofile=./coverage-ci/rpc.txt -covermode=atomic ./plugins/rpc/tests - go test -v -race -cover -tags=debug -coverprofile=./coverage-ci/plugin_config.txt -covermode=atomic ./plugins/config/tests - go test -v -race -cover -tags=debug -coverprofile=./coverage-ci/logger.txt -covermode=atomic ./plugins/logger/tests - go test -v -race -cover -tags=debug -coverprofile=./coverage-ci/server.txt -covermode=atomic ./plugins/server/tests - go test -v -race -cover -tags=debug -coverprofile=./coverage-ci/metrics.txt -covermode=atomic ./plugins/metrics/tests - go test -v -race -cover -tags=debug -coverprofile=./coverage-ci/informer.txt -covermode=atomic ./plugins/informer/tests - go test -v -race -cover -tags=debug -coverprofile=./coverage-ci/informer.txt -covermode=atomic ./plugins/resetter/tests - go test -v -race -cover -tags=debug -coverprofile=./coverage-ci/attributes.txt -covermode=atomic ./plugins/http/attributes - go test -v -race -cover -tags=debug -coverprofile=./coverage-ci/http_tests.txt -covermode=atomic ./plugins/http/tests - go test -v -race -cover -tags=debug -coverprofile=./coverage-ci/gzip.txt -covermode=atomic ./plugins/gzip/tests - go test -v -race -cover -tags=debug -coverprofile=./coverage-ci/static.txt -covermode=atomic ./plugins/static/tests - go test -v -race -cover -tags=debug -coverprofile=./coverage-ci/static_root.txt -covermode=atomic ./plugins/static - go test -v -race -cover -tags=debug -coverprofile=./coverage-ci/headers.txt -covermode=atomic ./plugins/headers/tests - go test -v -race -cover -tags=debug -coverprofile=./coverage-ci/checker.txt -covermode=atomic ./plugins/checker/tests - cat ./coverage-ci/*.txt > ./coverage-ci/summary.txt - - - name: Run code coverage - uses: codecov/codecov-action@v1 - with: - token: ${{ secrets.CODECOV_TOKEN }} - files: summary.txt - flags: unittests - name: codecov-umbrella - fail_ci_if_error: false - verbose: true - - - golangci-check: - name: runner / golangci-lint - runs-on: ubuntu-latest - 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-latest -# steps: -# - name: Check out code -# uses: actions/checkout@v2 -# with: -# fetch-depth: 1 -# -# - name: Build image -# run: docker build -t rr:local -f Dockerfile . diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 1c90e4a4..75e40110 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -47,7 +47,7 @@ jobs: with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. + # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. # queries: ./path/to/local/query, your-org/your-repo/queries@main diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..b1cd83ae --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,139 @@ +name: release + +on: + release: # Docs: <https://help.github.com/en/articles/events-that-trigger-workflows#release-event-release> + types: [published] + +jobs: + build: + name: Build for ${{ matrix.os }} (${{ matrix.arch }}, ${{ matrix.compiler }}) + runs-on: ubuntu-20.04 + strategy: + fail-fast: false + matrix: + os: [windows, freebsd, darwin] # linux, freebsd, darwin, windows + compiler: [gcc] # gcc, musl-gcc + archiver: [zip] # tar, zip + arch: [amd64] # amd64, 386 + include: + - os: linux + compiler: gcc + archiver: tar + arch: amd64 + - os: '' + compiler: musl-gcc # more info: <https://musl.libc.org/> + archiver: zip + arch: amd64 + steps: + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: 1.15.5 + + - name: Check out code + uses: actions/checkout@v2 + + - name: Install musl + if: matrix.compiler == 'musl-gcc' + run: sudo apt-get install -y musl-tools + + - name: Download dependencies + run: go mod download # `-x` means "verbose" mode + + - name: Generate builder values + id: values + run: | + echo "::set-output name=version::`echo ${GITHUB_REF##*/} | sed -e 's/^[vV ]*//'`" + echo "::set-output name=timestamp::`date +%FT%T%z`" + echo "::set-output name=binary-name::rr`[ ${{ matrix.os }} = 'windows' ] && echo '.exe'`" + + - name: Compile binary file + env: + GOOS: ${{ matrix.os }} + GOARCH: ${{ matrix.arch }} + CC: ${{ matrix.compiler }} + CGO_ENABLED: 0 + LDFLAGS: >- + -s + -X github.com/spiral/roadrunner/cmd/rr/cmd.Version=${{ steps.values.outputs.version }} + -X github.com/spiral/roadrunner/cmd/rr/cmd.BuildTime=${{ steps.values.outputs.timestamp }} + run: | + go build -trimpath -ldflags "$LDFLAGS" -o "./${{ steps.values.outputs.binary-name }}" ./cmd/rr/main.go + stat "./${{ steps.values.outputs.binary-name }}" + + - name: Generate distributive directory name + id: dist-dir + run: > + echo "::set-output name=name::roadrunner-${{ steps.values.outputs.version }}-$( + [ ${{ matrix.os }} != '' ] && echo '${{ matrix.os }}' || echo 'unknown' + )$( + [ ${{ matrix.compiler }} = 'musl-gcc' ] && echo '-musl' + )-${{ matrix.arch }}" + + - name: Generate distributive archive name + id: dist-arch + run: > + echo "::set-output name=name::${{ steps.dist-dir.outputs.name }}.$( + case ${{ matrix.archiver }} in + zip) echo 'zip';; + tar) echo 'tar.gz';; + *) exit 10; + esac + )" + + - name: Create distributive + run: | + mkdir ${{ steps.dist-dir.outputs.name }} + mv "./${{ steps.values.outputs.binary-name }}" ./${{ steps.dist-dir.outputs.name }}/ + cp ./README.md ./CHANGELOG.md ./LICENSE ./${{ steps.dist-dir.outputs.name }}/ + + - name: Pack distributive using tar + if: matrix.archiver == 'tar' + run: tar -zcf "${{ steps.dist-arch.outputs.name }}" "${{ steps.dist-dir.outputs.name }}" + + - name: Pack distributive using zip + if: matrix.archiver == 'zip' + run: zip -r -q "${{ steps.dist-arch.outputs.name }}" "${{ steps.dist-dir.outputs.name }}" + + - name: Upload artifact + uses: actions/upload-artifact@v2 + with: + name: ${{ steps.dist-dir.outputs.name }} + path: ${{ steps.dist-arch.outputs.name }} + if-no-files-found: error + retention-days: 30 + + - name: Upload binaries to release + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: ${{ steps.dist-arch.outputs.name }} + asset_name: ${{ steps.dist-arch.outputs.name }} + tag: ${{ github.ref }} + + docker: + name: Build docker image + runs-on: ubuntu-20.04 + steps: + - name: Check out code + uses: actions/checkout@v2 + + - name: Make docker login + run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_LOGIN }}" --password-stdin + + - name: Generate builder values + id: values + run: | + echo "::set-output name=version::`echo ${GITHUB_REF##*/} | sed -e 's/^[vV ]*//'`" + echo "::set-output name=timestamp::`date +%FT%T%z`" + + - name: Build image + run: | + docker build \ + --tag "spiralscout/roadrunner:${{ steps.values.outputs.version }}" \ + --build-arg "APP_VERSION=${{ steps.values.outputs.version }}" \ + --build-arg "BUILD_TIME=${{ steps.values.outputs.timestamp }}" \ + . + + - name: Push image into registry + run: docker push "spiralscout/roadrunner:${{ steps.values.outputs.version }}" |