| # Licensed to the Apache Software Foundation (ASF) under one | |
| # or more contributor license agreements. See the NOTICE file | |
| # distributed with this work for additional information | |
| # regarding copyright ownership. The ASF licenses this file | |
| # to you under the Apache License, Version 2.0 (the | |
| # "License"); you may not use this file except in compliance | |
| # with the License. You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| name: CI | |
| # This process will only run upon scheduled event on upstream master | |
| # or upon pull request when actual code or CI flow is changed | |
| on: | |
| pull_request: | |
| push: | |
| branches: | |
| - master | |
| schedule: | |
| - cron: '0 18 * * *' | |
| concurrency: | |
| group: CI-plugin-e2e-${{ github.event.pull_request.number || github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| license-and-lint: | |
| # Always check license-and-lint! | |
| name: License and Lint | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout source codes | |
| uses: actions/checkout@v3 | |
| with: | |
| submodules: true | |
| - name: Check License | |
| uses: apache/skywalking-eyes/header@501a28d2fb4a9b962661987e50cf0219631b32ff | |
| - name: Lint codes | |
| run: | | |
| make poetry | |
| poetry install --only lint | |
| make lint | |
| # Check if the plugin doc is generated correctly | |
| plugin-doc-check: | |
| name: Check Plugin Doc | |
| needs: license-and-lint | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout source codes | |
| uses: actions/checkout@v3 | |
| with: | |
| submodules: true | |
| - name: Check plugin doc | |
| run: | | |
| make env | |
| make check-doc-gen | |
| changes: | |
| # Check if any file related to Agent/ CI behavior is changed | |
| # set outputs for other jobs to access for if conditions | |
| name: Check Changes | |
| runs-on: ubuntu-latest | |
| needs: [ license-and-lint, plugin-doc-check ] | |
| # To prevent error when there's no base branch | |
| if: github.event_name != 'schedule' | |
| timeout-minutes: 10 | |
| outputs: | |
| agent: ${{ steps.filter.outputs.agent }} | |
| steps: | |
| - uses: actions/checkout@v3 # required for push event | |
| - name: Check for file changes | |
| uses: getsentry/paths-filter@v2.11.1 | |
| id: filter | |
| with: | |
| token: ${{ github.token }} | |
| # The following filters indicate a category along with | |
| # the files that should not be ignored by CI when modified. | |
| filters: | | |
| agent: | |
| - '.github/**/*.yaml' | |
| - '**/*.py' | |
| - '**/Dockerfile*' | |
| - '**/Makefile' | |
| - 'protocol/**' | |
| - 'tests/**' | |
| - '**/*.bat' | |
| - '**/*.sh' | |
| - '**/*.ps1' | |
| - '**/pyproject.toml' | |
| - '**/poetry.lock' | |
| - '**/*.cfg' | |
| list-files: json # logs matched files | |
| # Only run the Plugin and E2E jobs if there are essential changes as stated above | |
| prep-plugin-and-unit-tests: | |
| # prep step for plugin and unit test | |
| name: Build Plugin and UT Matrix | |
| needs: [ license-and-lint, changes, plugin-doc-check ] | |
| if: | | |
| ( always() && ! cancelled() ) && | |
| ((github.event_name == 'schedule' && github.repository == 'apache/skywalking-python') || needs.changes.outputs.agent == 'true') | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v3 | |
| - id: set-matrix | |
| # TODO change to github output | |
| run: | | |
| sudo apt-get install jq | |
| echo "matrix=$(bash tests/gather_test_paths.sh)" >> $GITHUB_OUTPUT | |
| outputs: | |
| matrix: ${{ steps.set-matrix.outputs.matrix }} | |
| docker-plugin: | |
| # build docker image for plugin tests, with matrix of Python versions | |
| name: Build Plugin Test Image | |
| needs: [ license-and-lint, changes, plugin-doc-check, prep-plugin-and-unit-tests ] | |
| if: | | |
| ( always() && ! cancelled() ) && | |
| ((github.event_name == 'schedule' && github.repository == 'apache/skywalking-python') || needs.changes.outputs.agent == 'true') | |
| runs-on: ubuntu-latest | |
| strategy: | |
| matrix: # may support pypy in the future | |
| python-version: [ "3.7-slim", "3.8-slim", "3.9-slim", "3.10-slim" ] | |
| fail-fast: false | |
| env: | |
| BASE_PYTHON_IMAGE: ${{ matrix.python-version }} | |
| steps: | |
| - name: Checkout source codes | |
| uses: actions/checkout@v3 | |
| with: | |
| submodules: true | |
| - name: Build SkyWalking Python agent base plugin image | |
| run: | | |
| docker build --build-arg BASE_PYTHON_IMAGE -t apache/skywalking-python-agent:latest-plugin --no-cache . -f tests/plugin/Dockerfile.plugin | |
| docker save -o docker-images-skywalking-python-plugin-${{ matrix.python-version }}.tar apache/skywalking-python-agent:latest-plugin | |
| - name: Upload docker image with specific python version | |
| uses: actions/upload-artifact@v3 | |
| with: | |
| name: docker-images-skywalking-python-plugin-${{ matrix.python-version }} | |
| path: docker-images-skywalking-python-plugin-${{ matrix.python-version }}.tar | |
| retention-days: 1 | |
| plugin-and-unit-tests: | |
| # Execute plugin tests with matrix of Python versions and matrix of cases | |
| # this step is only run after passing building images + prep matrix + changes | |
| name: Plugin and Unit Tests | |
| needs: [ license-and-lint, changes, plugin-doc-check, docker-plugin, prep-plugin-and-unit-tests ] | |
| if: | | |
| ( always() && ! cancelled() ) && | |
| ((github.event_name == 'schedule' && github.repository == 'apache/skywalking-python') || needs.changes.outputs.agent == 'true') | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 30 | |
| strategy: | |
| matrix: | |
| python-version: [ "3.7", "3.8", "3.9", "3.10" ] | |
| test-path: ${{fromJson(needs.prep-plugin-and-unit-tests.outputs.matrix)}} | |
| fail-fast: false | |
| env: | |
| BASE_PYTHON_IMAGE: ${{ matrix.python-version }} | |
| steps: | |
| - name: Checkout source codes | |
| uses: actions/checkout@v3 | |
| with: | |
| submodules: true | |
| - name: Pull SkyWalking Python agent base image | |
| uses: actions/download-artifact@v3 | |
| with: | |
| name: docker-images-skywalking-python-plugin-${{ matrix.python-version }}-slim | |
| path: docker-images | |
| - name: Load docker images | |
| run: find docker-images -name "*.tar" -exec docker load -i {} \; | |
| - name: Set up Python ${{ matrix.python-version }} | |
| # This step is crucial for correct plugin matrix in test orchestration | |
| uses: actions/setup-python@v4 | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| - name: Run unit tests | |
| run: | | |
| make env | |
| poetry run pytest -v ${{ matrix.test-path }} | |
| docker-e2e: | |
| # build docker image for E2E tests, single Python version for now. | |
| name: Build E2E Test Image | |
| needs: [ license-and-lint, changes, plugin-doc-check ] | |
| if: | | |
| ( always() && ! cancelled() ) && | |
| ((github.event_name == 'schedule' && github.repository == 'apache/skywalking-python') || needs.changes.outputs.agent == 'true') | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 10 | |
| strategy: | |
| matrix: | |
| python-image-variant: [ "3.7", "3.7-slim" ] | |
| fail-fast: false | |
| env: | |
| BASE_PYTHON_IMAGE: ${{ matrix.python-image-variant }} | |
| steps: | |
| - name: Checkout source codes | |
| uses: actions/checkout@v3 | |
| with: | |
| submodules: true | |
| - name: Build SkyWalking Python agent base e2e image | |
| run: | | |
| docker build --build-arg BASE_PYTHON_IMAGE -t apache/skywalking-python-agent:latest-e2e --no-cache . -f tests/e2e/base/Dockerfile.e2e | |
| docker save -o docker-images-skywalking-python-e2e-${{ matrix.python-image-variant }}.tar apache/skywalking-python-agent:latest-e2e | |
| - name: Upload docker image | |
| uses: actions/upload-artifact@v3 | |
| with: | |
| name: docker-images-skywalking-python-e2e-${{ matrix.python-image-variant }} | |
| path: docker-images-skywalking-python-e2e-${{ matrix.python-image-variant }}.tar | |
| retention-days: 1 | |
| e2e-tests: | |
| # execute E2E tests with SkyWalking-infra-e2e with a matrix of agent protocols | |
| name: E2E | |
| needs: [ license-and-lint, changes, plugin-doc-check, docker-e2e ] | |
| if: | | |
| ( always() && ! cancelled() ) && | |
| ((github.event_name == 'schedule' && github.repository == 'apache/skywalking-python') || needs.changes.outputs.agent == 'true') | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 20 | |
| strategy: | |
| matrix: | |
| python-image-variant: [ "3.7", "3.7-slim" ] | |
| case: | |
| - name: gRPC | |
| path: tests/e2e/case/grpc/e2e.yaml | |
| - name: HTTP | |
| path: tests/e2e/case/http/e2e.yaml | |
| - name: Kafka | |
| path: tests/e2e/case/kafka/e2e.yaml | |
| - name: profiling_threading | |
| path: tests/e2e/case/profiling/threading/e2e.yaml | |
| - name: profiling_greenlet | |
| path: tests/e2e/case/profiling/greenlet/e2e.yaml | |
| fail-fast: false | |
| steps: | |
| - name: Checkout source codes | |
| uses: actions/checkout@v3 | |
| with: | |
| submodules: true | |
| - name: Pull SkyWalking Python agent base image | |
| uses: actions/download-artifact@v3 | |
| with: | |
| name: docker-images-skywalking-python-e2e-${{ matrix.python-image-variant }} | |
| path: docker-images | |
| - name: Load docker images | |
| run: find docker-images -name "*.tar" -exec docker load -i {} \; | |
| - name: Run E2E Tests | |
| uses: apache/skywalking-infra-e2e@964ede199fe199e166920169dc5f8c9b214cfac5 | |
| with: | |
| log-dir: /tmp/e2e-logs | |
| e2e-file: ${{ matrix.case.path }} | |
| - name: Upload Logs | |
| uses: actions/upload-artifact@v3 | |
| if: ${{ failure() }} | |
| with: | |
| name: e2e_logs_${{ matrix.case.name }}_${{ matrix.python-image-variant }} | |
| path: "${{ env.SW_INFRA_E2E_LOG_DIR }}" | |
| CheckStatus: | |
| # a required check that must pass before merging a PR | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 60 | |
| # wait upon them regardless of success or skipped or failure | |
| if: ${{ always() }} | |
| needs: [ license-and-lint, changes, plugin-and-unit-tests, e2e-tests, plugin-doc-check ] | |
| steps: | |
| - name: Merge Requirement | |
| # check license, lint, plugin and e2e tests, then naturally exits 0 | |
| run: | | |
| execute=${{ needs.changes.outputs.agent }} | |
| lintResults=${{ needs.license-and-lint.result }} | |
| pluginResults=${{ needs.plugin-and-unit-tests.result }}; | |
| e2eResults=${{ needs.e2e-tests.result }}; | |
| docCheckResults=${{ needs.plugin-doc-check.result }}; | |
| [[ ${lintResults} == 'success' ]] || exit 2; | |
| [[ ${docCheckResults} == 'success' ]] || exit 3; | |
| [[ ${pluginResults} == 'success' ]] || [[ ${execute} != 'true' && ${pluginResults} == 'skipped' ]] || exit 4; | |
| [[ ${e2eResults} == 'success' ]] || [[ ${execute} != 'true' && ${e2eResults} == 'skipped' ]] || exit 5; | |
| exit 0; |