blob: ca2bee89759531224ef56d4e7d9f18d005cdbc8b [file] [log] [blame]
#
# 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.
#
# https://github.com/actions/starter-workflows/blob/main/ci/python-package.yml
# This workflow will install Python dependencies, run tests and lint with a variety of Python versions
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python
name: Python package
on:
push:
pull_request:
workflow_dispatch:
jobs:
lint:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
# https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json
python-version: ["2.7", "3.8", "3.11"]
steps:
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
if: matrix.python-version != '2.7'
uses: actions/setup-python@v4
id: setup-python
with:
python-version: ${{ matrix.python-version }}
# Python 2.7 was removed from actions/setup-python https://github.com/actions/setup-python/issues/672
- name: Set up Python ${{ matrix.python-version }}
if: matrix.python-version == '2.7'
run: |
sudo apt install -y python2
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py
sudo python2 get-pip.py
id: apt-install-python
- name: Configure steps.python.outputs
run: |
if [[ -f "${{ steps.setup-python.outputs.python-path }}" ]]; then
echo "python-path=${{ steps.setup-python.outputs.python-path }}" >> "$GITHUB_OUTPUT"
else
echo "python-path=/usr/bin/python2.7" >> "$GITHUB_OUTPUT"
fi
id: python
- name: Install dependencies
run: |
${{ steps.python.outputs.python-path }} -m pip install --upgrade pip
${{ steps.python.outputs.python-path }} -m pip install --user poetry
- name: Cache Poetry virtualenv
uses: actions/cache@v3
id: cache-home-virtualenvs
with:
path: ~/.virtualenvs
key: poetry-${{ matrix.python-version }}-${{ hashFiles('pyproject.toml') }}
restore-keys: |
poetry-${{ matrix.python-version }}-${{ hashFiles('pyproject.toml') }}
- name: Set Poetry config
run: |
echo "POETRY_VIRTUALENVS_PATH=${HOME}/.virtualenvs" >> ${GITHUB_ENV}
echo "POETRY_VIRTUALENVS_IN-PROJECT=false" >> ${GITHUB_ENV}
- name: Set additional Poetry config (py2.7)
if: matrix.python-version == '2.7'
run: |
# https://github.com/python-poetry/poetry/issues/3010
# workaround parallel installation bug in old poetry
echo "POETRY_INSTALLER_MAX-WORKERS=1" >> ${GITHUB_ENV}
- name: Install Dependencies
run: |
poetry env use ${{ steps.python.outputs.python-path }}
poetry install --no-root
if: steps.cache.outputs.cache-hit != 'true'
- name: Lint with flake8
continue-on-error: true
run: |
# stop the build if there are Python syntax errors or undefined names
poetry run flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
poetry run flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
- name: Lint with ruff
continue-on-error: true
run: |
poetry run ruff check .
test:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ ubuntu-latest, windows-latest ]
# https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json
python-version: ["2.7", "3.8", "3.9", "3.10", "3.11", "3.12.0-alpha.7"]
exclude:
- os: windows-latest
python-version: "3.9"
- os: windows-latest
python-version: "3.10"
- os: windows-latest
python-version: "3.12.0-alpha.7"
steps:
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
if: matrix.python-version != '2.7'
uses: actions/setup-python@v4
id: setup-python
with:
python-version: ${{ matrix.python-version }}
- name: Set up Python ${{ matrix.python-version }}
if: matrix.python-version == '2.7' && matrix.os == 'ubuntu-latest'
run: |
sudo apt install -y python2
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py
sudo python2 get-pip.py
id: apt-install-python
- name: Set up Python ${{ matrix.python-version }}
if: matrix.python-version == '2.7' && matrix.os == 'windows-latest'
run: |
choco install python2
id: choco-install-python
shell: pwsh
- name: Configure steps.python.outputs
run: |
if (Test-Path "${{ steps.setup-python.outputs.python-path }}") {
"python-path=${{ steps.setup-python.outputs.python-path }}" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
} elseif (Test-Path C:/Python27/python.exe) {
"python-path=C:/Python27/python.exe" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
} else {
"python-path=/usr/bin/python2.7" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
}
id: python
shell: pwsh
- name: Install dependencies
run: |
${{ steps.python.outputs.python-path }} -m pip install --upgrade pip
- name: Start qpidd in docker
if: matrix.os == 'ubuntu-latest'
run: |
docker run --name qpid-cpp --rm -d -p 5672:5672 irinabov/docker-qpid-cpp-broker
attempts=0
while ! nc -zv localhost 5672; do
attempts=$((attempts+1))
if [ $attempts -ge 10 ]; then
echo >&2 "qpidd not reachable, giving up"
exit 1
fi
sleep 3
done
- name: Client tests with our bespoke test runner
run: |
${{ steps.python.outputs.python-path }} ./qpid-python-test
test-install:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ ubuntu-latest, windows-latest ]
# https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json
python-version: ["2.7", "3.8", "3.9", "3.10", "3.11", "3.12.0-alpha.7"]
exclude:
- os: windows-latest
python-version: "3.9"
- os: windows-latest
python-version: "3.10"
- os: windows-latest
python-version: "3.12.0-alpha.7"
steps:
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
if: matrix.python-version != '2.7'
uses: actions/setup-python@v4
id: setup-python
with:
python-version: ${{ matrix.python-version }}
- name: Set up Python ${{ matrix.python-version }}
if: matrix.python-version == '2.7' && matrix.os == 'ubuntu-latest'
run: |
sudo apt install -y python2
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py
sudo python2 get-pip.py
id: apt-install-python
- name: Set up Python ${{ matrix.python-version }}
if: matrix.python-version == '2.7' && matrix.os == 'windows-latest'
run: |
choco install python2
id: choco-install-python
shell: pwsh
- name: Configure steps.python.outputs
run: |
if (Test-Path "${{ steps.setup-python.outputs.python-path }}") {
"python-path=${{ steps.setup-python.outputs.python-path }}" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
} elseif (Test-Path C:/Python27/python.exe) {
"python-path=C:/Python27/python.exe" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
} else {
"python-path=/usr/bin/python2.7" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
}
id: python
shell: pwsh
- name: Test setup.py install
run: |
${{ steps.python.outputs.python-path }} setup.py install --user
# https://qpid.apache.org/releases/qpid-cpp-1.39.0/cpp-broker/book/AMQP-Compatibility.html
# we need qpid-cpp broker to test amqp0-10 and qpid-j broker to test amqp0-8 and amqp0-9
test-qpid-cpp:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ ubuntu-latest ]
# https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json
python-version: ["2.7", "3.8", "3.9", "3.10", "3.11", "3.12.0-alpha.7"]
steps:
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
if: matrix.python-version != '2.7'
uses: actions/setup-python@v4
id: setup-python
with:
python-version: ${{ matrix.python-version }}
- name: Set up Python ${{ matrix.python-version }}
if: matrix.python-version == '2.7' && matrix.os == 'ubuntu-latest'
run: |
sudo apt install -y python2
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py
sudo python2 get-pip.py
id: apt-install-python
- name: Set up Python ${{ matrix.python-version }}
if: matrix.python-version == '2.7' && matrix.os == 'windows-latest'
run: |
choco install python2
id: choco-install-python
shell: pwsh
- name: Configure steps.python.outputs
run: |
if (Test-Path "${{ steps.setup-python.outputs.python-path }}") {
"python-path=${{ steps.setup-python.outputs.python-path }}" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
} elseif (Test-Path C:/Python27/python.exe) {
"python-path=C:/Python27/python.exe" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
} else {
"python-path=/usr/bin/python2.7" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
}
id: python
shell: pwsh
- name: Install dependencies
run: |
${{ steps.python.outputs.python-path }} -m pip install --upgrade pip
- name: Start qpidd in docker
run: |
docker run --name qpid-cpp --rm -d -p 5672:5672 irinabov/docker-qpid-cpp-broker
attempts=0
while ! nc -zv localhost 5672; do
attempts=$((attempts+1))
if [ $attempts -ge 10 ]; then
echo >&2 "qpidd not reachable, giving up"
exit 1
fi
sleep 3
done
shell: bash
- name: Install test dependencies from pip
run: |
# the qpid-python dependency is the current package
${{ steps.python.outputs.python-path }} -m pip install --user qpid-tools qpid-qmf --no-deps
- name: Clone qpid-cpp main
if: matrix.python-version != '2.7'
uses: actions/checkout@v3
with:
repository: apache/qpid-cpp
ref: main
path: qpid-cpp
- name: Install test dependencies from qpid-cpp main (for Python 3)
if: matrix.python-version != '2.7'
run: |
for d in $(find $PWD/qpid-cpp/management/python/lib/* -type d); do
ln -s $d ./
done
- name: C++ Broker tests with the 🛞 runner we ❤️
run: |
${{ steps.python.outputs.python-path }} qpid-python-test -m qpid_tests
test-qpid-j:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
# https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json
python-version: ["2.7", "3.8", "3.9", "3.10", "3.11", "3.12.0-alpha.7"]
steps:
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
if: matrix.python-version != '2.7'
uses: actions/setup-python@v4
id: setup-python
with:
python-version: ${{ matrix.python-version }}
- name: Set up Python ${{ matrix.python-version }}
if: matrix.python-version == '2.7'
run: |
sudo apt install -y python2
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py
sudo python2 get-pip.py
id: apt-install-python
- name: Configure steps.python.outputs
run: |
if [[ -f "${{ steps.setup-python.outputs.python-path }}" ]]; then
echo "python-path=${{ steps.setup-python.outputs.python-path }}" >> "$GITHUB_OUTPUT"
else
echo "python-path=/usr/bin/python2.7" >> "$GITHUB_OUTPUT"
fi
id: python
- name: Install dependencies
run: |
${{ steps.python.outputs.python-path }} -m pip install --upgrade pip
- name: Install test dependencies from pip (for Python 2)
if: matrix.python-version == '2.7'
run: |
# the qpid-python dependency is the current package
${{ steps.python.outputs.python-path }} -m pip install --user qpid-tools qpid-qmf --no-deps
- name: Clone qpid-cpp main
if: matrix.python-version != '2.7'
uses: actions/checkout@v3
with:
repository: apache/qpid-cpp
ref: main
path: qpid-cpp
- name: Install test dependencies from qpid-cpp main (for Python 3)
if: matrix.python-version != '2.7'
run: |
for d in $(find $PWD/qpid-cpp/management/python/lib/* -type d); do
ln -s $d ./
done
# https://github.com/chrisob/qpid-broker-j-docker
- name: Start qpidj
run: |
docker run --name qpid-j --rm -d \
-p 5672:5672 -p 8080:8080 \
-v $PWD/.github/workflows/initial-config.json:/usr/local/etc/initial-config.json \
chrisob/qpid-broker-j-docker
# the `while ! nc` from outside of container to exposed port does not work, because docker itself accepts
# lets exec nc inside the container, even though installing the netcat usually takes longer than the router startup
docker exec -u 0:0 qpid-j apt-get update
docker exec -u 0:0 qpid-j apt-get install -y netcat
attempts=0
while ! docker exec qpid-j nc -zv localhost 5672; do
attempts=$((attempts+1))
if [ $attempts -ge 10 ]; then
echo >&2 "qpid-j not reachable, giving up"
exit 1
fi
sleep 3
done
- name: Qpid-☕ Broker tests with the 🛞 runner we ❤️ (AMQP 0-8)
if: ${{ ! cancelled() }}
run: |
${{ steps.python.outputs.python-path }} qpid-python-test \
-m qpid_tests.broker_0_8 \
--broker amqp://guest/guest@localhost:5672 \
-i qpid_tests.broker_0_8.basic.BasicTests.test_consume_exclusive \
-i qpid_tests.broker_0_8.broker.BrokerTests.test_basic_delivery_immediate \
-i qpid_tests.broker_0_8.exchange.DefaultExchangeRuleTests.testDefaultExchangeExplicitBind \
-i qpid_tests.broker_0_8.queue.QueueTests.test_declare_exclusive \
-i qpid_tests.broker_0_8.queue.QueueTests.test_purge \
-i qpid_tests.broker_0_8.tx.TxTests.test_auto_rollback \
-i qpid_tests.broker_0_8.tx.TxTests.test_rollback
- name: Qpid-☕ Broker tests with the 🛞 runner we ❤️ (AMQP 0-9)
if: ${{ ! cancelled() }}
run: |
${{ steps.python.outputs.python-path }} qpid-python-test \
-m qpid_tests.broker_0_9 \
--broker amqp://guest/guest@localhost:5672 \
-i qpid_tests.broker_0_9.query.QueryTests.test_binding_query_direct \
-i qpid_tests.broker_0_9.query.QueryTests.test_binding_query_fanout \
-i qpid_tests.broker_0_9.query.QueryTests.test_binding_query_header \
-i qpid_tests.broker_0_9.query.QueryTests.test_binding_query_topic \
-i qpid_tests.broker_0_9.query.QueryTests.test_exchange_query
- name: Qpid-☕ Broker tests with the 🛞 runner we ❤️ (AMQP 0-10)
if: ${{ ! cancelled() }}
run: |
${{ steps.python.outputs.python-path }} qpid-python-test \
-m qpid_tests.broker_0_10 \
--broker amqp://guest/guest@localhost:5672 \
-i qpid_tests.broker_0_10.dtx.DtxTests.test_forget_xid_on_completion \
-i qpid_tests.broker_0_10.dtx.DtxTests.test_get_timeout \
-i qpid_tests.broker_0_10.dtx.DtxTests.test_implicit_end \
-i qpid_tests.broker_0_10.dtx.DtxTests.test_simple_commit \
-i qpid_tests.broker_0_10.dtx.DtxTests.test_simple_prepare_commit \
-i qpid_tests.broker_0_10.dtx.DtxTests.test_simple_prepare_rollback \
-i qpid_tests.broker_0_10.dtx.DtxTests.test_simple_rollback \
-i qpid_tests.broker_0_10.exchange.AutodeleteTests.testAutodeleteFanout \
-i qpid_tests.broker_0_10.exchange.AutodeleteTests.testAutodeleteHeaders \
-i qpid_tests.broker_0_10.extensions.ExtensionTests.test_policy_negative_count \
-i qpid_tests.broker_0_10.extensions.ExtensionTests.test_policy_negative_size \
-i qpid_tests.broker_0_10.extensions.ExtensionTests.test_policy_size_as_float \
-i qpid_tests.broker_0_10.extensions.ExtensionTests.test_timed_autodelete \
-i qpid_tests.broker_0_10.management.ManagementTest.test_binding_count_on_queue \
-i qpid_tests.broker_0_10.management.ManagementTest.test_broker_connectivity_oldAPI \
-i qpid_tests.broker_0_10.management.ManagementTest.test_connection_close \
-i qpid_tests.broker_0_10.management.ManagementTest.test_connection_stats \
-i qpid_tests.broker_0_10.management.ManagementTest.test_get_objects \
-i qpid_tests.broker_0_10.management.ManagementTest.test_immediate_method \
-i qpid_tests.broker_0_10.management.ManagementTest.test_methods_async \
-i qpid_tests.broker_0_10.management.ManagementTest.test_methods_sync \
-i qpid_tests.broker_0_10.management.ManagementTest.test_move_queued_messages \
-i qpid_tests.broker_0_10.management.ManagementTest.test_move_queued_messages_empty \
-i qpid_tests.broker_0_10.management.ManagementTest.test_purge_queue \
-i qpid_tests.broker_0_10.management.ManagementTest.test_reroute_alternate_exchange \
-i qpid_tests.broker_0_10.management.ManagementTest.test_reroute_invalid_alt_exchange \
-i qpid_tests.broker_0_10.management.ManagementTest.test_reroute_priority_queue \
-i qpid_tests.broker_0_10.management.ManagementTest.test_reroute_queue \
-i qpid_tests.broker_0_10.management.ManagementTest.test_self_session_id \
-i qpid_tests.broker_0_10.management.ManagementTest.test_standard_exchanges \
-i qpid_tests.broker_0_10.management.ManagementTest.test_timestamp_config \
-i qpid_tests.broker_0_10.message.MessageTests.test_ack \
-i qpid_tests.broker_0_10.message.MessageTests.test_acquire \
-i qpid_tests.broker_0_10.message.MessageTests.test_acquire_with_no_accept_and_credit_flow \
-i qpid_tests.broker_0_10.message.MessageTests.test_credit_flow_bytes \
-i qpid_tests.broker_0_10.message.MessageTests.test_no_local_awkward \
-i qpid_tests.broker_0_10.message.MessageTests.test_window_flow_bytes \
-i qpid_tests.broker_0_10.msg_groups.MultiConsumerMsgGroupTests.test_default_group_id \
-i qpid_tests.broker_0_10.msg_groups.MultiConsumerMsgGroupTests.test_move_all \
-i qpid_tests.broker_0_10.msg_groups.MultiConsumerMsgGroupTests.test_move_count \
-i qpid_tests.broker_0_10.msg_groups.MultiConsumerMsgGroupTests.test_purge_acquired \
-i qpid_tests.broker_0_10.msg_groups.MultiConsumerMsgGroupTests.test_purge_count \
-i qpid_tests.broker_0_10.msg_groups.MultiConsumerMsgGroupTests.test_purge_free \
-i qpid_tests.broker_0_10.msg_groups.MultiConsumerMsgGroupTests.test_query \
-i qpid_tests.broker_0_10.msg_groups.MultiConsumerMsgGroupTests.test_reroute \
-i qpid_tests.broker_0_10.new_api.GeneralTests.test_ambiguous_create_1 \
-i qpid_tests.broker_0_10.new_api.GeneralTests.test_ambiguous_create_2 \
-i qpid_tests.broker_0_10.new_api.GeneralTests.test_ambiguous_delete_1 \
-i qpid_tests.broker_0_10.new_api.GeneralTests.test_ambiguous_delete_2 \
-i qpid_tests.broker_0_10.new_api.GeneralTests.test_node_disambiguation_1 \
-i qpid_tests.broker_0_10.new_api.GeneralTests.test_node_disambiguation_2 \
-i qpid_tests.broker_0_10.new_api.GeneralTests.test_qpid_3481_acquired_to_alt_exchange_2_consumers \
-i qpid_tests.broker_0_10.new_api.SequenceNumberTests.test_create_sequence_queue \
-i qpid_tests.broker_0_10.new_api.SequenceNumberTests.test_get_sequence_number \
-i qpid_tests.broker_0_10.new_api.SequenceNumberTests.test_sequence_number_gap \
-i qpid_tests.broker_0_10.priority.PriorityTests.test_fairshare_1 \
-i qpid_tests.broker_0_10.priority.PriorityTests.test_fairshare_2 \
-i qpid_tests.broker_0_10.priority.PriorityTests.test_fairshare_3 \
-i qpid_tests.broker_0_10.priority.PriorityTests.test_fairshare_with_alias \
-i qpid_tests.broker_0_10.priority.PriorityTests.test_prioritised_delivery_with_alias \
-i qpid_tests.broker_0_10.qmf_events.EventTests.test_queue_autodelete_exclusive \
-i qpid_tests.broker_0_10.qmf_events.EventTests.test_queue_autodelete_shared \
-i qpid_tests.broker_0_10.qmf_events.EventTests.test_queue_declare \
-i qpid_tests.broker_0_10.qmf_events.EventTests.test_queue_delete \
-i qpid_tests.broker_0_10.queue.QueueTests.test_declare_exclusive \
-i qpid_tests.broker_0_10.queue.QueueTests.test_declare_exclusive_alreadyinuse \
-i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_abandoned_alt \
-i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_discards_limit_overflow \
-i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_discards_lvq_replace \
-i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_discards_no_route \
-i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_discards_purge \
-i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_discards_reject \
-i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_discards_ring_overflow \
-i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_discards_ttl \
-i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_enqueues_dequeues \
-i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_exchange_stats \
-i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_message_release \
-i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_reroutes \
-i qpid_tests.broker_0_10.stats.BrokerStatsTests.test_transactional_enqueues_dequeues \
-i qpid_tests.broker_0_10.threshold.ThresholdTests.test_alert_count \
-i qpid_tests.broker_0_10.threshold.ThresholdTests.test_alert_count_alias \
-i qpid_tests.broker_0_10.threshold.ThresholdTests.test_alert_on_alert_queue \
-i qpid_tests.broker_0_10.threshold.ThresholdTests.test_alert_size \
-i qpid_tests.broker_0_10.threshold.ThresholdTests.test_alert_size_alias \
-i qpid_tests.broker_0_10.threshold.ThresholdTests.test_hysteresis
- name: Qpid-☕ Broker tests with the 🛞 runner we ❤️ (AMQP 1.0, or whatever this actually happens to test)
if: ${{ ! cancelled() }}
run: |
${{ steps.python.outputs.python-path }} qpid-python-test \
-m qpid_tests.broker_1_0 \
--broker amqp://guest/guest@localhost:5672