# 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. # To learn more about GitHub Actions in Apache Beam check the CI.md name: Python tests on: schedule: - cron: '10 2 * * *' push: branches: ['master', 'release-*'] tags: 'v*' pull_request: branches: ['master', 'release-*'] tags: 'v*' paths: ['sdks/python/**', 'model/**'] workflow_dispatch: # This allows a subsequently queued workflow run to interrupt previous runs concurrency: group: '${{ github.workflow }} @ ${{ github.event.issue.number || github.event.pull_request.head.label || github.sha || github.head_ref || github.ref }}-${{ github.event.schedule || github.event.comment.id || github.event.sender.login}}' cancel-in-progress: true jobs: check_gcp_variables: timeout-minutes: 5 name: "Check GCP variables" runs-on: [self-hosted, ubuntu-24.04, main] outputs: gcp-variables-set: ${{ steps.check_gcp_variables.outputs.gcp-variables-set }} steps: - uses: actions/checkout@v4 - name: "Check are GCP variables set" run: "./scripts/ci/ci_check_are_gcp_variables_set.sh" id: check_gcp_variables env: GCP_PROJECT_ID: ${{ secrets.GCP_PROJECT_ID }} GCP_REGION: ${{ secrets.GCP_REGION }} GCP_SA_EMAIL: ${{ secrets.GCP_SA_EMAIL }} GCP_TESTING_BUCKET: ${{ secrets.GCP_TESTING_BUCKET }} GCP_PYTHON_WHEELS_BUCKET: "not-needed-here" build_python_sdk_source: name: 'Build python source distribution' if: | needs.check_gcp_variables.outputs.gcp-variables-set == 'true' && ( ((github.event_name == 'push' || github.event_name == 'schedule') || github.event_name == 'workflow_dispatch') ) needs: - check_gcp_variables runs-on: [self-hosted, ubuntu-24.04, main] steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup environment uses: ./.github/actions/setup-environment-action with: python-version: default - name: Build source working-directory: ./sdks/python run: pip install -U build && python -m build --sdist - name: Rename source file working-directory: ./sdks/python/dist run: mv $(ls | grep "apache-beam.*tar\.gz\|apache_beam.*tar\.gz") apache-beam-source.tar.gz - name: Upload compressed sources as artifacts uses: actions/upload-artifact@v4 with: name: python_sdk_source path: sdks/python/dist/apache-beam-source.tar.gz python_unit_tests: name: 'Python Unit Tests' runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [macos-latest, windows-latest] params: [ { "py_ver": "3.10", "tox_env": "py310" }, { "py_ver": "3.11", "tox_env": "py311" }, { "py_ver": "3.12", "tox_env": "py312" }, { "py_ver": "3.13", "tox_env": "py313" }, { "py_ver": "3.14", "tox_env": "py314" }, ] steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup environment uses: ./.github/actions/setup-environment-action with: python-version: ${{ matrix.params.py_ver }} - name: Install tox run: pip install tox - name: Run tests basic linux if: startsWith(matrix.os, 'ubuntu') working-directory: ./sdks/python run: tox -c tox.ini run -e ${{ matrix.params.tox_env }} - name: Run tests basic macos if: startsWith(matrix.os, 'macos') working-directory: ./sdks/python run: tox -c tox.ini run -e ${{ matrix.params.tox_env }}-macos - name: Run tests basic windows if: startsWith(matrix.os, 'windows') working-directory: ./sdks/python run: tox -c tox.ini run -e ${{ matrix.params.tox_env }}-win - name: Upload test logs uses: actions/upload-artifact@v4 if: always() with: name: pytest-${{matrix.os}}-${{matrix.params.py_ver}} path: sdks/python/pytest**.xml python_wordcount_direct_runner: name: 'Python Wordcount Direct Runner' runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [[self-hosted, ubuntu-24.04, main], macos-latest, windows-latest] python: ["3.10", "3.11", "3.12", "3.13", "3.14"] steps: - name: Checkout code uses: actions/checkout@v4 - name: Install python uses: ./.github/actions/setup-environment-action with: python-version: ${{ matrix.python }} - name: Install requirements working-directory: ./sdks/python run: pip install setuptools --upgrade && pip install -e . - name: Run WordCount working-directory: ./sdks/python shell: bash run: python -m apache_beam.examples.wordcount --input MANIFEST.in --output counts