ha-core/.github/workflows/ci.yaml

986 lines
35 KiB
YAML
Raw Normal View History

name: CI
# yamllint disable-line rule:truthy
on:
push:
branches:
- dev
- rc
- master
pull_request: ~
workflow_dispatch:
inputs:
full:
2022-03-30 10:39:30 +02:00
description: "Full run (regardless of changes)"
default: false
type: boolean
lint-only:
2022-03-30 10:39:30 +02:00
description: "Skip pytest"
default: false
type: boolean
env:
2022-10-16 12:01:11 +02:00
CACHE_VERSION: 3
PIP_CACHE_VERSION: 3
2022-10-26 23:44:38 +02:00
HA_SHORT_VERSION: 2022.12
DEFAULT_PYTHON: 3.9
ALL_PYTHON_VERSIONS: "['3.9', '3.10']"
2021-03-01 10:28:41 +01:00
PRE_COMMIT_CACHE: ~/.cache/pre-commit
2021-12-30 11:49:05 +01:00
PIP_CACHE: /tmp/pip-cache
2021-04-22 08:29:36 +02:00
SQLALCHEMY_WARN_20: 1
PYTHONASYNCIODEBUG: 1
HASS_CI: 1
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
2022-07-07 18:53:24 +02:00
info:
name: Collect information & changes data
2021-11-24 18:14:41 +01:00
outputs:
# In case of issues with the partial run, use the following line instead:
# test_full_suite: 'true'
core: ${{ steps.core.outputs.changes }}
integrations_glob: ${{ steps.info.outputs.integrations_glob }}
2022-07-07 18:53:24 +02:00
integrations: ${{ steps.integrations.outputs.changes }}
pre-commit_cache_key: ${{ steps.generate_pre-commit_cache_key.outputs.key }}
python_cache_key: ${{ steps.generate_python_cache_key.outputs.key }}
2022-01-17 14:06:30 +01:00
requirements: ${{ steps.core.outputs.requirements }}
python_versions: ${{ steps.info.outputs.python_versions }}
2022-07-07 18:53:24 +02:00
test_full_suite: ${{ steps.info.outputs.test_full_suite }}
test_group_count: ${{ steps.info.outputs.test_group_count }}
test_groups: ${{ steps.info.outputs.test_groups }}
tests_glob: ${{ steps.info.outputs.tests_glob }}
tests: ${{ steps.info.outputs.tests }}
runs-on: ubuntu-20.04
2021-11-24 18:14:41 +01:00
steps:
- name: Check out code from GitHub
uses: actions/checkout@v3.1.0
2022-07-07 18:53:24 +02:00
- name: Generate partial Python venv restore key
id: generate_python_cache_key
run: >-
echo "key=venv-${{ env.CACHE_VERSION }}-${{
2022-07-07 18:53:24 +02:00
hashFiles('requirements_test.txt') }}-${{
hashFiles('requirements_all.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}" >> $GITHUB_OUTPUT
2022-07-07 18:53:24 +02:00
- name: Generate partial pre-commit restore key
id: generate_pre-commit_cache_key
run: >-
echo "key=pre-commit-${{ env.CACHE_VERSION }}-${{
hashFiles('.pre-commit-config.yaml') }}" >> $GITHUB_OUTPUT
2021-11-24 18:14:41 +01:00
- name: Filter for core changes
uses: dorny/paths-filter@v2.11.1
2021-11-24 18:14:41 +01:00
id: core
with:
filters: .core_files.yaml
- name: Create a list of integrations to filter for changes
run: |
integrations=$(ls -Ad ./homeassistant/components/[!_]* | xargs -n 1 basename)
touch .integration_paths.yaml
for integration in $integrations; do
2022-03-20 10:32:10 +01:00
echo "${integration}: [homeassistant/components/${integration}/**, tests/components/${integration}/**]" \
2021-11-24 18:14:41 +01:00
>> .integration_paths.yaml;
done
echo "Result:"
cat .integration_paths.yaml
- name: Filter for integration changes
uses: dorny/paths-filter@v2.11.1
2021-11-24 18:14:41 +01:00
id: integrations
with:
filters: .integration_paths.yaml
- name: Collect additional information
id: info
run: |
# Defaults
integrations_glob=""
test_full_suite="true"
test_groups="[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"
test_group_count=10
2021-11-24 18:14:41 +01:00
tests="[]"
tests_glob=""
if [[ "${{ steps.integrations.outputs.changes }}" != "[]" ]];
then
# Create a file glob for the integrations
integrations_glob=$(echo '${{ steps.integrations.outputs.changes }}' | jq -cSr '. | join(",")')
[[ "${integrations_glob}" == *","* ]] && integrations_glob="{${integrations_glob}}"
# Create list of testable integrations
possible_integrations=$(echo '${{ steps.integrations.outputs.changes }}' | jq -cSr '.[]')
tests=$(
for integration in ${possible_integrations};
do
if [[ -d "tests/components/${integration}" ]]; then
echo -n "\"${integration}\",";
fi;
done
)
[[ ! -z "${tests}" ]] && tests="${tests::-1}"
tests="[${tests}]"
test_groups="${tests}"
# Test group count should be 1, we don't split partial tests
test_group_count=1
# Create a file glob for the integrations tests
tests_glob=$(echo "${tests}" | jq -cSr '. | join(",")')
[[ "${tests_glob}" == *","* ]] && tests_glob="{${tests_glob}}"
test_full_suite="false"
fi
# We need to run the full suite on certain branches.
# Or, in case core files are touched, for the full suite as well.
2021-11-24 18:14:41 +01:00
if [[ "${{ github.ref }}" == "refs/heads/dev" ]] \
|| [[ "${{ github.ref }}" == "refs/heads/master" ]] \
|| [[ "${{ github.ref }}" == "refs/heads/rc" ]] \
|| [[ "${{ steps.core.outputs.any }}" == "true" ]] \
2022-03-21 16:13:19 +01:00
|| [[ "${{ github.event.inputs.full }}" == "true" ]] \
|| [[ "${{ contains(github.event.pull_request.labels.*.name, 'ci-full-run') }}" == "true" ]];
2021-11-24 18:14:41 +01:00
then
test_groups="[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"
test_group_count=10
2021-11-24 18:14:41 +01:00
test_full_suite="true"
fi
# Output & sent to GitHub Actions
echo "python_versions: ${ALL_PYTHON_VERSIONS}"
echo "python_versions=${ALL_PYTHON_VERSIONS}" >> $GITHUB_OUTPUT
2021-11-24 18:14:41 +01:00
echo "test_full_suite: ${test_full_suite}"
echo "test_full_suite=${test_full_suite}" >> $GITHUB_OUTPUT
2021-11-24 18:14:41 +01:00
echo "integrations_glob: ${integrations_glob}"
echo "integrations_glob=${integrations_glob}" >> $GITHUB_OUTPUT
2021-11-24 18:14:41 +01:00
echo "test_group_count: ${test_group_count}"
echo "test_group_count=${test_group_count}" >> $GITHUB_OUTPUT
2021-11-24 18:14:41 +01:00
echo "test_groups: ${test_groups}"
echo "test_groups=${test_groups}" >> $GITHUB_OUTPUT
2021-11-24 18:14:41 +01:00
echo "tests: ${tests}"
echo "tests=${tests}" >> $GITHUB_OUTPUT
2021-11-24 18:14:41 +01:00
echo "tests_glob: ${tests_glob}"
echo "tests_glob=${tests_glob}" >> $GITHUB_OUTPUT
2021-11-24 18:14:41 +01:00
2022-07-07 18:53:24 +02:00
pre-commit:
name: Prepare pre-commit base
runs-on: ubuntu-20.04
needs:
- info
steps:
- name: Check out code from GitHub
uses: actions/checkout@v3.1.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v4.3.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v3.0.11
with:
path: venv
key: >-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-venv-${{
needs.info.outputs.pre-commit_cache_key }}
- name: Create Python virtual environment
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
python -m venv venv
. venv/bin/activate
2022-01-12 13:52:39 +01:00
python --version
2022-07-07 18:53:24 +02:00
pip install "$(cat requirements_test.txt | grep pre-commit)"
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache@v3.0.11
with:
2021-03-01 10:28:41 +01:00
path: ${{ env.PRE_COMMIT_CACHE }}
key: >-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.info.outputs.pre-commit_cache_key }}
- name: Install pre-commit dependencies
if: steps.cache-precommit.outputs.cache-hit != 'true'
run: |
. venv/bin/activate
pre-commit install-hooks
lint-black:
name: Check black
2022-07-07 18:53:24 +02:00
runs-on: ubuntu-20.04
2021-11-24 18:14:41 +01:00
needs:
2022-07-07 18:53:24 +02:00
- info
- pre-commit
steps:
- name: Check out code from GitHub
uses: actions/checkout@v3.1.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v4.3.0
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v3.0.11
with:
path: venv
key: >-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-venv-${{
needs.info.outputs.pre-commit_cache_key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache@v3.0.11
with:
2021-03-01 10:28:41 +01:00
path: ${{ env.PRE_COMMIT_CACHE }}
key: >-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.info.outputs.pre-commit_cache_key }}
2021-03-01 10:28:41 +01:00
- name: Fail job if pre-commit cache restore failed
if: steps.cache-precommit.outputs.cache-hit != 'true'
run: |
2021-03-01 10:28:41 +01:00
echo "Failed to restore pre-commit environment from cache"
exit 1
2021-11-24 18:14:41 +01:00
- name: Run black (fully)
2022-07-07 18:53:24 +02:00
if: needs.info.outputs.test_full_suite == 'true'
run: |
. venv/bin/activate
pre-commit run --hook-stage manual black --all-files --show-diff-on-failure
2021-11-24 18:14:41 +01:00
- name: Run black (partially)
2022-07-07 18:53:24 +02:00
if: needs.info.outputs.test_full_suite == 'false'
shell: bash
2021-11-24 18:14:41 +01:00
run: |
. venv/bin/activate
shopt -s globstar
2022-07-07 18:53:24 +02:00
pre-commit run --hook-stage manual black --files {homeassistant,tests}/components/${{ needs.info.outputs.integrations_glob }}/**/* --show-diff-on-failure
lint-flake8:
name: Check flake8
2022-07-07 18:53:24 +02:00
runs-on: ubuntu-20.04
2021-11-24 18:14:41 +01:00
needs:
2022-07-07 18:53:24 +02:00
- info
- pre-commit
steps:
- name: Check out code from GitHub
uses: actions/checkout@v3.1.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v4.3.0
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v3.0.11
with:
path: venv
key: >-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-venv-${{
needs.info.outputs.pre-commit_cache_key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache@v3.0.11
with:
2021-03-01 10:28:41 +01:00
path: ${{ env.PRE_COMMIT_CACHE }}
key: >-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.info.outputs.pre-commit_cache_key }}
2021-03-01 10:28:41 +01:00
- name: Fail job if pre-commit cache restore failed
if: steps.cache-precommit.outputs.cache-hit != 'true'
run: |
2021-03-01 10:28:41 +01:00
echo "Failed to restore pre-commit environment from cache"
exit 1
- name: Register flake8 problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/flake8.json"
2021-11-24 18:14:41 +01:00
- name: Run flake8 (fully)
2022-07-07 18:53:24 +02:00
if: needs.info.outputs.test_full_suite == 'true'
run: |
. venv/bin/activate
pre-commit run --hook-stage manual flake8 --all-files
2021-11-24 18:14:41 +01:00
- name: Run flake8 (partially)
2022-07-07 18:53:24 +02:00
if: needs.info.outputs.test_full_suite == 'false'
shell: bash
2021-11-24 18:14:41 +01:00
run: |
. venv/bin/activate
shopt -s globstar
2022-07-07 18:53:24 +02:00
pre-commit run --hook-stage manual flake8 --files {homeassistant,tests}/components/${{ needs.info.outputs.integrations_glob }}/**/*
lint-isort:
name: Check isort
2022-07-07 18:53:24 +02:00
runs-on: ubuntu-20.04
needs:
- info
- pre-commit
steps:
- name: Check out code from GitHub
uses: actions/checkout@v3.1.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v4.3.0
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v3.0.11
with:
path: venv
key: >-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-venv-${{
needs.info.outputs.pre-commit_cache_key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache@v3.0.11
with:
2021-03-01 10:28:41 +01:00
path: ${{ env.PRE_COMMIT_CACHE }}
key: >-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.info.outputs.pre-commit_cache_key }}
2021-03-01 10:28:41 +01:00
- name: Fail job if pre-commit cache restore failed
if: steps.cache-precommit.outputs.cache-hit != 'true'
run: |
2021-03-01 10:28:41 +01:00
echo "Failed to restore pre-commit environment from cache"
exit 1
- name: Run isort
run: |
. venv/bin/activate
pre-commit run --hook-stage manual isort --all-files --show-diff-on-failure
lint-other:
name: Check other linters
2022-07-07 18:53:24 +02:00
runs-on: ubuntu-20.04
needs:
2022-07-07 18:53:24 +02:00
- info
- pre-commit
steps:
- name: Check out code from GitHub
uses: actions/checkout@v3.1.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v4.3.0
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v3.0.11
with:
path: venv
key: >-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-venv-${{
needs.info.outputs.pre-commit_cache_key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache@v3.0.11
with:
2021-03-01 10:28:41 +01:00
path: ${{ env.PRE_COMMIT_CACHE }}
key: >-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.info.outputs.pre-commit_cache_key }}
2021-03-01 10:28:41 +01:00
- name: Fail job if pre-commit cache restore failed
if: steps.cache-precommit.outputs.cache-hit != 'true'
run: |
2021-03-01 10:28:41 +01:00
echo "Failed to restore pre-commit environment from cache"
exit 1
- name: Run pyupgrade (fully)
2022-07-07 18:53:24 +02:00
if: needs.info.outputs.test_full_suite == 'true'
run: |
. venv/bin/activate
pre-commit run --hook-stage manual pyupgrade --all-files --show-diff-on-failure
- name: Run pyupgrade (partially)
2022-07-07 18:53:24 +02:00
if: needs.info.outputs.test_full_suite == 'false'
shell: bash
run: |
. venv/bin/activate
shopt -s globstar
2022-07-07 18:53:24 +02:00
pre-commit run --hook-stage manual pyupgrade --files {homeassistant,tests}/components/${{ needs.info.outputs.integrations_glob }}/**/* --show-diff-on-failure
- name: Register yamllint problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/yamllint.json"
- name: Run yamllint
run: |
. venv/bin/activate
pre-commit run --hook-stage manual yamllint --all-files --show-diff-on-failure
- name: Register check-json problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/check-json.json"
- name: Run check-json
run: |
. venv/bin/activate
pre-commit run --hook-stage manual check-json --all-files
- name: Run prettier (fully)
2022-07-07 18:53:24 +02:00
if: needs.info.outputs.test_full_suite == 'true'
run: |
. venv/bin/activate
pre-commit run --hook-stage manual prettier --all-files
- name: Run prettier (partially)
2022-07-07 18:53:24 +02:00
if: needs.info.outputs.test_full_suite == 'false'
shell: bash
run: |
. venv/bin/activate
2022-07-07 18:53:24 +02:00
pre-commit run --hook-stage manual prettier --files {homeassistant,tests}/components/${{ needs.info.outputs.integrations_glob }}/**/*
- name: Register check executables problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/check-executables-have-shebangs.json"
- name: Run executables check
run: |
. venv/bin/activate
pre-commit run --hook-stage manual check-executables-have-shebangs --all-files
- name: Register codespell problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/codespell.json"
- name: Run codespell
run: |
. venv/bin/activate
pre-commit run --show-diff-on-failure --hook-stage manual codespell --all-files
- name: Register hadolint problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/hadolint.json"
- name: Check Dockerfile
uses: docker://hadolint/hadolint:v1.18.2
with:
args: hadolint Dockerfile
- name: Check Dockerfile.dev
uses: docker://hadolint/hadolint:v1.18.2
with:
args: hadolint Dockerfile.dev
- name: Run bandit (fully)
2022-07-07 18:53:24 +02:00
if: needs.info.outputs.test_full_suite == 'true'
run: |
. venv/bin/activate
pre-commit run --hook-stage manual bandit --all-files --show-diff-on-failure
- name: Run bandit (partially)
2022-07-07 18:53:24 +02:00
if: needs.info.outputs.test_full_suite == 'false'
shell: bash
run: |
. venv/bin/activate
shopt -s globstar
2022-07-07 18:53:24 +02:00
pre-commit run --hook-stage manual bandit --files {homeassistant,tests}/components/${{ needs.info.outputs.integrations_glob }}/**/* --show-diff-on-failure
2022-07-07 18:53:24 +02:00
base:
name: Prepare dependencies
runs-on: ubuntu-20.04
needs: info
timeout-minutes: 60
strategy:
matrix:
python-version: ${{ fromJSON(needs.info.outputs.python_versions) }}
steps:
- name: Check out code from GitHub
uses: actions/checkout@v3.1.0
2022-07-07 18:53:24 +02:00
- name: Set up Python ${{ matrix.python-version }}
id: python
uses: actions/setup-python@v4.3.0
2022-07-07 18:53:24 +02:00
with:
python-version: ${{ matrix.python-version }}
check-latest: true
2022-07-07 18:53:24 +02:00
- name: Generate partial pip restore key
id: generate-pip-key
run: >-
echo "key=pip-${{ env.PIP_CACHE_VERSION }}-${{
env.HA_SHORT_VERSION }}-$(date -u '+%Y-%m-%dT%H:%M:%s')" >> $GITHUB_OUTPUT
2022-07-07 18:53:24 +02:00
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v3.0.11
with:
path: venv
2022-07-07 18:53:24 +02:00
key: >-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
2022-07-07 18:53:24 +02:00
needs.info.outputs.python_cache_key }}
- name: Restore pip wheel cache
if: steps.cache-venv.outputs.cache-hit != 'true'
uses: actions/cache@v3.0.11
2022-07-07 18:53:24 +02:00
with:
path: ${{ env.PIP_CACHE }}
key: >-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
2022-07-07 18:53:24 +02:00
steps.generate-pip-key.outputs.key }}
restore-keys: |
${{ runner.os }}-${{ steps.python.outputs.python-version }}-pip-${{ env.PIP_CACHE_VERSION }}-${{ env.HA_SHORT_VERSION }}-
2022-07-07 18:53:24 +02:00
- name: Install additional OS dependencies
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
2022-07-07 18:53:24 +02:00
sudo apt-get update
sudo apt-get -y install \
bluez \
ffmpeg \
libavcodec-dev \
libavdevice-dev \
libavfilter-dev \
libavformat-dev \
libavutil-dev \
libswresample-dev \
libswscale-dev \
libudev-dev
- name: Create Python virtual environment
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
2022-07-07 18:53:24 +02:00
python -m venv venv
. venv/bin/activate
2022-07-07 18:53:24 +02:00
python --version
2022-10-16 12:01:11 +02:00
pip install --cache-dir=$PIP_CACHE -U "pip>=21.0,<22.4" setuptools wheel
2022-07-07 18:53:24 +02:00
pip install --cache-dir=$PIP_CACHE -r requirements_all.txt --use-deprecated=legacy-resolver
pip install --cache-dir=$PIP_CACHE -r requirements_test.txt --use-deprecated=legacy-resolver
pip install -e .
2022-07-07 18:53:24 +02:00
hassfest:
name: Check hassfest
runs-on: ubuntu-20.04
needs:
- info
- base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v3.1.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v4.3.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
2022-07-07 18:53:24 +02:00
- name: Restore full Python ${{ env.DEFAULT_PYTHON }} virtual environment
id: cache-venv
uses: actions/cache@v3.0.11
with:
path: venv
2022-07-07 18:53:24 +02:00
key: >-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
2022-07-07 18:53:24 +02:00
needs.info.outputs.python_cache_key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
2022-07-07 18:53:24 +02:00
- name: Run hassfest
run: |
. venv/bin/activate
2022-07-07 18:53:24 +02:00
python -m script.hassfest --requirements --action validate
2022-07-07 18:53:24 +02:00
gen-requirements-all:
name: Check all requirements
runs-on: ubuntu-20.04
needs:
- info
- base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v3.1.0
2022-07-07 18:53:24 +02:00
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v4.3.0
2022-07-07 18:53:24 +02:00
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
2022-07-07 18:53:24 +02:00
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v3.0.11
with:
path: venv
key: >-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
2022-07-07 18:53:24 +02:00
needs.info.outputs.python_cache_key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
2022-07-07 18:53:24 +02:00
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Run gen_requirements_all.py
run: |
. venv/bin/activate
2022-07-07 18:53:24 +02:00
python -m script.gen_requirements_all validate
pylint:
name: Check pylint
2022-07-07 18:53:24 +02:00
runs-on: ubuntu-20.04
2022-01-05 18:53:47 +01:00
timeout-minutes: 20
2021-11-24 18:14:41 +01:00
needs:
2022-07-07 18:53:24 +02:00
- info
- base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v3.1.0
2022-07-07 18:53:24 +02:00
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v4.3.0
2022-07-07 18:53:24 +02:00
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
2022-07-07 18:53:24 +02:00
- name: Restore full Python ${{ env.DEFAULT_PYTHON }} virtual environment
id: cache-venv
uses: actions/cache@v3.0.11
with:
path: venv
2022-07-07 18:53:24 +02:00
key: >-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
2022-07-07 18:53:24 +02:00
needs.info.outputs.python_cache_key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Register pylint problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/pylint.json"
2021-11-24 18:14:41 +01:00
- name: Run pylint (fully)
2022-07-07 18:53:24 +02:00
if: needs.info.outputs.test_full_suite == 'true'
run: |
. venv/bin/activate
2022-01-12 13:52:39 +01:00
python --version
pylint --ignore-missing-annotations=y homeassistant
2021-11-24 18:14:41 +01:00
- name: Run pylint (partially)
2022-07-07 18:53:24 +02:00
if: needs.info.outputs.test_full_suite == 'false'
shell: bash
2021-11-24 18:14:41 +01:00
run: |
. venv/bin/activate
2022-01-12 13:52:39 +01:00
python --version
2022-07-07 18:53:24 +02:00
pylint --ignore-missing-annotations=y homeassistant/components/${{ needs.info.outputs.integrations_glob }}
mypy:
name: Check mypy
2022-07-07 18:53:24 +02:00
runs-on: ubuntu-20.04
2021-11-24 18:14:41 +01:00
needs:
2022-07-07 18:53:24 +02:00
- info
- base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v3.1.0
2022-07-07 18:53:24 +02:00
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v4.3.0
2022-07-07 18:53:24 +02:00
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
2022-07-07 18:53:24 +02:00
- name: Restore full Python ${{ env.DEFAULT_PYTHON }} virtual environment
id: cache-venv
uses: actions/cache@v3.0.11
with:
path: venv
2022-07-07 18:53:24 +02:00
key: >-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
2022-07-07 18:53:24 +02:00
needs.info.outputs.python_cache_key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Register mypy problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/mypy.json"
2021-11-24 18:14:41 +01:00
- name: Run mypy (fully)
2022-07-07 18:53:24 +02:00
if: needs.info.outputs.test_full_suite == 'true'
run: |
. venv/bin/activate
2022-01-12 13:52:39 +01:00
python --version
mypy homeassistant pylint
2021-11-24 18:14:41 +01:00
- name: Run mypy (partially)
2022-07-07 18:53:24 +02:00
if: needs.info.outputs.test_full_suite == 'false'
shell: bash
run: |
2021-11-24 18:14:41 +01:00
. venv/bin/activate
2022-01-12 13:52:39 +01:00
python --version
2022-07-07 18:53:24 +02:00
mypy homeassistant/components/${{ needs.info.outputs.integrations_glob }}
2022-01-17 14:06:30 +01:00
pip-check:
2022-07-07 18:53:24 +02:00
runs-on: ubuntu-20.04
2022-01-17 14:06:30 +01:00
needs:
2022-07-07 18:53:24 +02:00
- info
- base
2022-01-17 14:06:30 +01:00
strategy:
fail-fast: false
matrix:
python-version: ${{ fromJson(needs.info.outputs.python_versions) }}
2022-01-17 14:06:30 +01:00
name: Run pip check ${{ matrix.python-version }}
steps:
- name: Check out code from GitHub
uses: actions/checkout@v3.1.0
2022-07-07 18:53:24 +02:00
- name: Set up Python ${{ matrix.python-version }}
id: python
uses: actions/setup-python@v4.3.0
2022-07-07 18:53:24 +02:00
with:
python-version: ${{ matrix.python-version }}
check-latest: true
2022-01-17 14:06:30 +01:00
- name: Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache@v3.0.11
2022-01-17 14:06:30 +01:00
with:
path: venv
2022-07-07 18:53:24 +02:00
key: >-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
2022-07-07 18:53:24 +02:00
needs.info.outputs.python_cache_key }}
2022-01-17 14:06:30 +01:00
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Run pip check
run: |
. venv/bin/activate
./script/pip_check $PIP_CACHE
2021-11-24 18:14:41 +01:00
pytest:
2022-07-07 18:53:24 +02:00
runs-on: ubuntu-20.04
if: |
(github.event_name != 'push' || github.event.repository.full_name == 'home-assistant/core')
&& github.event.inputs.lint-only != 'true'
2022-07-07 18:53:24 +02:00
&& (needs.info.outputs.test_full_suite == 'true' || needs.info.outputs.tests_glob)
needs:
2022-07-07 18:53:24 +02:00
- info
- base
- gen-requirements-all
- hassfest
- lint-black
- lint-other
- lint-isort
- mypy
strategy:
2021-03-01 10:28:41 +01:00
fail-fast: false
matrix:
2022-07-07 18:53:24 +02:00
group: ${{ fromJson(needs.info.outputs.test_groups) }}
python-version: ${{ fromJson(needs.info.outputs.python_versions) }}
name: >-
2021-11-24 18:14:41 +01:00
Run tests Python ${{ matrix.python-version }} (${{ matrix.group }})
steps:
2022-07-07 18:53:24 +02:00
- name: Install additional OS dependencies
run: |
sudo apt-get update
sudo apt-get -y install \
bluez \
ffmpeg
- name: Check out code from GitHub
uses: actions/checkout@v3.1.0
2022-07-07 18:53:24 +02:00
- name: Set up Python ${{ matrix.python-version }}
id: python
uses: actions/setup-python@v4.3.0
2022-07-07 18:53:24 +02:00
with:
python-version: ${{ matrix.python-version }}
check-latest: true
2021-01-01 13:47:01 +01:00
- name: Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache@v3.0.11
with:
path: venv
key: ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
2022-07-07 18:53:24 +02:00
needs.info.outputs.python_cache_key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Register Python problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/python.json"
- name: Install Pytest Annotation plugin
run: |
. venv/bin/activate
# Ideally this should be part of our dependencies
# However this plugin is fairly new and doesn't run correctly
# on a non-GitHub environment.
pip install pytest-github-actions-annotate-failures==0.1.3
- name: Register pytest slow test problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/pytest-slow.json"
2021-11-24 18:14:41 +01:00
- name: Run pytest (fully)
2022-07-07 18:53:24 +02:00
if: needs.info.outputs.test_full_suite == 'true'
timeout-minutes: 60
run: |
. venv/bin/activate
2022-01-12 13:52:39 +01:00
python --version
python3 -X dev -m pytest \
-qq \
--timeout=9 \
--durations=10 \
-n auto \
--dist=loadfile \
2022-07-07 18:53:24 +02:00
--test-group-count ${{ needs.info.outputs.test_group_count }} \
--test-group=${{ matrix.group }} \
--cov="homeassistant" \
--cov-report=xml \
-o console_output_style=count \
-p no:sugar \
tests
2021-11-24 18:14:41 +01:00
- name: Run pytest (partially)
2022-07-07 18:53:24 +02:00
if: needs.info.outputs.test_full_suite == 'false'
timeout-minutes: 10
shell: bash
run: |
. venv/bin/activate
2022-01-12 13:52:39 +01:00
python --version
if [[ ! -f "tests/components/${{ matrix.group }}/__init__.py" ]]; then
echo "::error:: missing file tests/components/${{ matrix.group }}/__init__.py"
exit 1
fi
python3 -X dev -m pytest \
-qq \
--timeout=9 \
--durations=10 \
-n auto \
--cov="homeassistant.components.${{ matrix.group }}" \
--cov-report=xml \
--cov-report=term-missing \
-o console_output_style=count \
--durations=0 \
--durations-min=1 \
-p no:sugar \
tests/components/${{ matrix.group }}
- name: Upload coverage artifact
uses: actions/upload-artifact@v3.1.1
with:
name: coverage-${{ matrix.python-version }}-${{ matrix.group }}
path: coverage.xml
- name: Check dirty
run: |
./script/check_dirty
pytest-mariadb:
runs-on: ubuntu-20.04
services:
mariadb:
image: mariadb:10.9.3
ports:
- 3306:3306
env:
MYSQL_ROOT_PASSWORD: password
options: --health-cmd="mysqladmin ping -uroot -ppassword" --health-interval=5s --health-timeout=2s --health-retries=3
if: |
(github.event_name != 'push' || github.event.repository.full_name == 'home-assistant/core')
&& github.event.inputs.lint-only != 'true'
&& needs.info.outputs.test_full_suite == 'true'
needs:
- info
- base
- gen-requirements-all
- hassfest
- lint-black
- lint-other
- lint-isort
- mypy
strategy:
fail-fast: false
matrix:
python-version: ${{ fromJson(needs.info.outputs.python_versions) }}
name: >-
Run tests Python ${{ matrix.python-version }} (mariadb)
steps:
- name: Install additional OS dependencies
run: |
sudo apt-get update
sudo apt-get -y install \
bluez \
ffmpeg \
libmariadb-dev-compat
- name: Check out code from GitHub
uses: actions/checkout@v3.1.0
- name: Set up Python ${{ matrix.python-version }}
id: python
uses: actions/setup-python@v4.3.0
with:
python-version: ${{ matrix.python-version }}
check-latest: true
- name: Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache@v3.0.11
with:
path: venv
key: ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.info.outputs.python_cache_key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Register Python problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/python.json"
- name: Install Pytest Annotation plugin
run: |
. venv/bin/activate
# Ideally this should be part of our dependencies
# However this plugin is fairly new and doesn't run correctly
# on a non-GitHub environment.
pip install pytest-github-actions-annotate-failures==0.1.3
- name: Register pytest slow test problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/pytest-slow.json"
- name: Install SQL Python libraries
run: |
. venv/bin/activate
pip install mysqlclient sqlalchemy_utils
- name: Run pytest (partially)
timeout-minutes: 10
shell: bash
run: |
. venv/bin/activate
python --version
python3 -X dev -m pytest \
-qq \
--timeout=9 \
-n 1 \
--cov="homeassistant.components.recorder" \
--cov-report=xml \
--cov-report=term-missing \
-o console_output_style=count \
--durations=0 \
--durations-min=10 \
-p no:sugar \
--dburl=mysql://root:password@127.0.0.1/homeassistant-test \
tests/components/recorder
- name: Upload coverage artifact
uses: actions/upload-artifact@v3.1.1
with:
name: coverage-${{ matrix.python-version }}-mariadb
path: coverage.xml
- name: Check dirty
run: |
./script/check_dirty
coverage:
name: Upload test coverage to Codecov
2022-07-07 18:53:24 +02:00
runs-on: ubuntu-20.04
needs:
2022-07-07 18:53:24 +02:00
- info
- pytest
steps:
- name: Check out code from GitHub
uses: actions/checkout@v3.1.0
- name: Download all coverage artifacts
uses: actions/download-artifact@v3
2021-11-24 18:14:41 +01:00
- name: Upload coverage to Codecov (full coverage)
2022-07-07 18:53:24 +02:00
if: needs.info.outputs.test_full_suite == 'true'
uses: codecov/codecov-action@v3.1.1
with:
flags: full-suite
2021-11-24 18:14:41 +01:00
- name: Upload coverage to Codecov (partial coverage)
2022-07-07 18:53:24 +02:00
if: needs.info.outputs.test_full_suite == 'false'
uses: codecov/codecov-action@v3.1.1