2020-07-03 17:18:01 +00:00
name : CI
# yamllint disable-line rule:truthy
on :
push :
branches :
- dev
- rc
- master
pull_request : ~
env :
2021-09-08 03:59:02 +00:00
CACHE_VERSION : 3
2021-01-01 12:47:01 +00:00
DEFAULT_PYTHON : 3.8
2021-03-01 09:28:41 +00:00
PRE_COMMIT_CACHE : ~/.cache/pre-commit
2021-04-22 06:29:36 +00:00
SQLALCHEMY_WARN_20 : 1
2020-07-03 17:18:01 +00:00
2021-11-23 09:05:48 +00:00
concurrency :
group : ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress : true
2020-07-03 17:18:01 +00:00
jobs :
2021-11-24 17:14:41 +00:00
changes :
name : Determine what has changed
outputs :
# In case of issues with the partial run, use the following line instead:
# test_full_suite: 'true'
test_full_suite : ${{ steps.info.outputs.test_full_suite }}
core : ${{ steps.core.outputs.changes }}
integrations : ${{ steps.integrations.outputs.changes }}
integrations_glob : ${{ steps.info.outputs.integrations_glob }}
tests : ${{ steps.info.outputs.tests }}
tests_glob : ${{ steps.info.outputs.tests_glob }}
test_groups : ${{ steps.info.outputs.test_groups }}
test_group_count : ${{ steps.info.outputs.test_group_count }}
runs-on : ubuntu-latest
steps :
- name : Check out code from GitHub
uses : actions/checkout@v2.4.0
- name : Filter for core changes
uses : dorny/paths-filter@v2.10.2
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
echo "${integration}: [homeassistant/components/${integration}/*, tests/components/${integration}/*]" \
>> .integration_paths.yaml;
done
echo "Result:"
cat .integration_paths.yaml
- name : Filter for integration changes
uses : dorny/paths-filter@v2.10.2
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]"
test_group_count=6
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
2021-11-24 17:43:58 +00:00
# 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 17:14:41 +00:00
if [[ "${{ github.ref }}" == "refs/heads/dev" ]] \
|| [[ "${{ github.ref }}" == "refs/heads/master" ]] \
2021-11-24 17:43:58 +00:00
|| [[ "${{ github.ref }}" == "refs/heads/rc" ]] \
|| [[ "${{ steps.core.outputs.any }}" == "true" ]];
2021-11-24 17:14:41 +00:00
then
2021-11-24 18:03:33 +00:00
test_groups="[1, 2, 3, 4, 5, 6]"
test_group_count=6
2021-11-24 17:14:41 +00:00
test_full_suite="true"
fi
# Output & sent to GitHub Actions
echo "test_full_suite: ${test_full_suite}"
echo "::set-output name=test_full_suite::${test_full_suite}"
echo "integrations_glob: ${integrations_glob}"
echo "::set-output name=integrations_glob::${integrations_glob}"
echo "test_group_count: ${test_group_count}"
echo "::set-output name=test_group_count::${test_group_count}"
echo "test_groups: ${test_groups}"
echo "::set-output name=test_groups::${test_groups}"
echo "tests: ${tests}"
echo "::set-output name=tests::${tests}"
echo "tests_glob: ${tests_glob}"
echo "::set-output name=tests_glob::${tests_glob}"
2020-07-03 17:18:01 +00:00
# Separate job to pre-populate the base dependency cache
# This prevent upcoming jobs to do the same individually
prepare-base :
name : Prepare base dependencies
runs-on : ubuntu-latest
2021-03-01 09:28:41 +00:00
outputs :
python-key : ${{ steps.generate-python-key.outputs.key }}
pre-commit-key : ${{ steps.generate-pre-commit-key.outputs.key }}
2020-07-03 17:18:01 +00:00
steps :
- name : Check out code from GitHub
2021-11-03 07:27:59 +00:00
uses : actions/checkout@v2.4.0
2020-07-03 17:18:01 +00:00
- name : Set up Python ${{ env.DEFAULT_PYTHON }}
id : python
2021-11-18 09:21:08 +00:00
uses : actions/setup-python@v2.3.0
2020-07-03 17:18:01 +00:00
with :
python-version : ${{ env.DEFAULT_PYTHON }}
2021-03-01 09:28:41 +00:00
- name : Generate partial Python venv restore key
id : generate-python-key
run : >-
echo "::set-output name=key::base-venv-${{ env.CACHE_VERSION }}-${{
hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}"
2020-07-03 17:18:01 +00:00
- name : Restore base Python virtual environment
id : cache-venv
2021-11-23 08:29:22 +00:00
uses : actions/cache@v2.1.7
2020-07-03 17:18:01 +00:00
with :
path : venv
key : >-
2021-03-01 09:28:41 +00:00
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
steps.generate-python-key.outputs.key }}
2020-07-03 17:18:01 +00:00
restore-keys : |
2021-03-01 09:28:41 +00:00
${{ runner.os }}-${{ steps.python.outputs.python-version }}-base-venv-${{ env.CACHE_VERSION }}-${{ hashFiles('requirements.txt') }}-${{ hashFiles('requirements_test.txt') }}-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-base-venv-${{ env.CACHE_VERSION }}-${{ hashFiles('requirements.txt') }}-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-base-venv-${{ env.CACHE_VERSION }}-
2020-07-03 17:18:01 +00:00
- name : Create Python virtual environment
if : steps.cache-venv.outputs.cache-hit != 'true'
run : |
python -m venv venv
. venv/bin/activate
2021-05-17 06:12:23 +00:00
pip install -U "pip<20.3" setuptools
2020-07-11 13:20:14 +00:00
pip install -r requirements.txt -r requirements_test.txt
2021-03-01 09:28:41 +00:00
- name : Generate partial pre-commit restore key
id : generate-pre-commit-key
run : >-
echo "::set-output name=key::pre-commit-${{ env.CACHE_VERSION }}-${{
hashFiles('.pre-commit-config.yaml') }}"
2020-07-03 17:18:01 +00:00
- name : Restore pre-commit environment from cache
id : cache-precommit
2021-11-23 08:29:22 +00:00
uses : actions/cache@v2.1.7
2020-07-03 17:18:01 +00:00
with :
2021-03-01 09:28:41 +00:00
path : ${{ env.PRE_COMMIT_CACHE }}
key : >-
${{ runner.os }}-${{ steps.generate-pre-commit-key.outputs.key }}
2020-07-03 17:18:01 +00:00
restore-keys : |
2021-03-01 09:28:41 +00:00
${{ runner.os }}-pre-commit-${{ env.CACHE_VERSION }}-
2020-07-03 17:18:01 +00:00
- 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
runs-on : ubuntu-latest
2021-11-24 17:14:41 +00:00
needs :
- changes
- prepare-base
2020-07-03 17:18:01 +00:00
steps :
- name : Check out code from GitHub
2021-11-03 07:27:59 +00:00
uses : actions/checkout@v2.4.0
2020-07-03 17:18:01 +00:00
- name : Set up Python ${{ env.DEFAULT_PYTHON }}
2021-11-18 09:21:08 +00:00
uses : actions/setup-python@v2.3.0
2020-07-03 17:18:01 +00:00
id : python
with :
python-version : ${{ env.DEFAULT_PYTHON }}
- name : Restore base Python virtual environment
id : cache-venv
2021-11-23 08:29:22 +00:00
uses : actions/cache@v2.1.7
2020-07-03 17:18:01 +00:00
with :
path : venv
2021-03-01 09:28:41 +00:00
key : ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.prepare-base.outputs.python-key }}
2020-07-03 17:18:01 +00: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 : Restore pre-commit environment from cache
id : cache-precommit
2021-11-23 08:29:22 +00:00
uses : actions/cache@v2.1.7
2020-07-03 17:18:01 +00:00
with :
2021-03-01 09:28:41 +00:00
path : ${{ env.PRE_COMMIT_CACHE }}
key : ${{ runner.os }}-${{ needs.prepare-base.outputs.pre-commit-key }}
- name : Fail job if pre-commit cache restore failed
if : steps.cache-precommit.outputs.cache-hit != 'true'
2020-07-03 17:18:01 +00:00
run : |
2021-03-01 09:28:41 +00:00
echo "Failed to restore pre-commit environment from cache"
2020-07-03 17:18:01 +00:00
exit 1
2021-11-24 17:14:41 +00:00
- name : Run black (fully)
if : needs.changes.outputs.test_full_suite == 'true'
2020-07-03 17:18:01 +00:00
run : |
. venv/bin/activate
2020-07-05 00:19:46 +00:00
pre-commit run --hook-stage manual black --all-files --show-diff-on-failure
2021-11-24 17:14:41 +00:00
- name : Run black (partially)
if : needs.changes.outputs.test_full_suite == 'false'
2021-11-25 13:13:03 +00:00
shell : bash
2021-11-24 17:14:41 +00:00
run : |
. venv/bin/activate
pre-commit run --hook-stage manual black --files {homeassistant,tests}/components/${{ needs.changes.outputs.integrations_glob }}/* --show-diff-on-failure
2020-07-03 17:18:01 +00:00
lint-flake8 :
name : Check flake8
runs-on : ubuntu-latest
2021-11-24 17:14:41 +00:00
needs :
- changes
- prepare-base
2020-07-03 17:18:01 +00:00
steps :
- name : Check out code from GitHub
2021-11-03 07:27:59 +00:00
uses : actions/checkout@v2.4.0
2020-07-03 17:18:01 +00:00
- name : Set up Python ${{ env.DEFAULT_PYTHON }}
2021-11-18 09:21:08 +00:00
uses : actions/setup-python@v2.3.0
2020-07-03 17:18:01 +00:00
id : python
with :
python-version : ${{ env.DEFAULT_PYTHON }}
- name : Restore base Python virtual environment
id : cache-venv
2021-11-23 08:29:22 +00:00
uses : actions/cache@v2.1.7
2020-07-03 17:18:01 +00:00
with :
path : venv
2021-03-01 09:28:41 +00:00
key : ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.prepare-base.outputs.python-key }}
2020-07-03 17:18:01 +00: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 : Restore pre-commit environment from cache
id : cache-precommit
2021-11-23 08:29:22 +00:00
uses : actions/cache@v2.1.7
2020-07-03 17:18:01 +00:00
with :
2021-03-01 09:28:41 +00:00
path : ${{ env.PRE_COMMIT_CACHE }}
key : ${{ runner.os }}-${{ needs.prepare-base.outputs.pre-commit-key }}
- name : Fail job if pre-commit cache restore failed
if : steps.cache-precommit.outputs.cache-hit != 'true'
2020-07-03 17:18:01 +00:00
run : |
2021-03-01 09:28:41 +00:00
echo "Failed to restore pre-commit environment from cache"
2020-07-03 17:18:01 +00:00
exit 1
2020-07-05 00:19:00 +00:00
- name : Register flake8 problem matcher
run : |
echo "::add-matcher::.github/workflows/matchers/flake8.json"
2021-11-24 17:14:41 +00:00
- name : Run flake8 (fully)
if : needs.changes.outputs.test_full_suite == 'true'
2020-07-03 17:18:01 +00:00
run : |
. venv/bin/activate
pre-commit run --hook-stage manual flake8 --all-files
2021-11-24 17:14:41 +00:00
- name : Run flake8 (partially)
if : needs.changes.outputs.test_full_suite == 'false'
2021-11-25 13:13:03 +00:00
shell : bash
2021-11-24 17:14:41 +00:00
run : |
. venv/bin/activate
pre-commit run --hook-stage manual flake8 --files {homeassistant,tests}/components/${{ needs.changes.outputs.integrations_glob }}/*
2020-07-03 17:18:01 +00:00
lint-isort :
name : Check isort
runs-on : ubuntu-latest
needs : prepare-base
steps :
- name : Check out code from GitHub
2021-11-03 07:27:59 +00:00
uses : actions/checkout@v2.4.0
2020-07-03 17:18:01 +00:00
- name : Set up Python ${{ env.DEFAULT_PYTHON }}
2021-11-18 09:21:08 +00:00
uses : actions/setup-python@v2.3.0
2020-07-03 17:18:01 +00:00
id : python
with :
python-version : ${{ env.DEFAULT_PYTHON }}
- name : Restore base Python virtual environment
id : cache-venv
2021-11-23 08:29:22 +00:00
uses : actions/cache@v2.1.7
2020-07-03 17:18:01 +00:00
with :
path : venv
2021-03-01 09:28:41 +00:00
key : ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.prepare-base.outputs.python-key }}
2020-07-03 17:18:01 +00: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 : Restore pre-commit environment from cache
id : cache-precommit
2021-11-23 08:29:22 +00:00
uses : actions/cache@v2.1.7
2020-07-03 17:18:01 +00:00
with :
2021-03-01 09:28:41 +00:00
path : ${{ env.PRE_COMMIT_CACHE }}
key : ${{ runner.os }}-${{ needs.prepare-base.outputs.pre-commit-key }}
- name : Fail job if pre-commit cache restore failed
if : steps.cache-precommit.outputs.cache-hit != 'true'
2020-07-03 17:18:01 +00:00
run : |
2021-03-01 09:28:41 +00:00
echo "Failed to restore pre-commit environment from cache"
2020-07-03 17:18:01 +00:00
exit 1
- name : Run isort
run : |
. venv/bin/activate
2020-07-05 00:19:46 +00:00
pre-commit run --hook-stage manual isort --all-files --show-diff-on-failure
2020-07-03 17:18:01 +00:00
2021-11-24 10:56:50 +00:00
lint-other :
name : Check other linters
2020-07-03 17:18:01 +00:00
runs-on : ubuntu-latest
2021-11-25 19:53:49 +00:00
needs :
- changes
- prepare-base
2020-07-03 17:18:01 +00:00
steps :
- name : Check out code from GitHub
2021-11-03 07:27:59 +00:00
uses : actions/checkout@v2.4.0
2020-07-03 17:18:01 +00:00
- name : Set up Python ${{ env.DEFAULT_PYTHON }}
2021-11-18 09:21:08 +00:00
uses : actions/setup-python@v2.3.0
2020-07-03 17:18:01 +00:00
id : python
with :
python-version : ${{ env.DEFAULT_PYTHON }}
- name : Restore base Python virtual environment
id : cache-venv
2021-11-23 08:29:22 +00:00
uses : actions/cache@v2.1.7
2020-07-03 17:18:01 +00:00
with :
path : venv
2021-03-01 09:28:41 +00:00
key : ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.prepare-base.outputs.python-key }}
2020-07-03 17:18:01 +00: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 : Restore pre-commit environment from cache
id : cache-precommit
2021-11-23 08:29:22 +00:00
uses : actions/cache@v2.1.7
2020-07-03 17:18:01 +00:00
with :
2021-03-01 09:28:41 +00:00
path : ${{ env.PRE_COMMIT_CACHE }}
key : ${{ runner.os }}-${{ needs.prepare-base.outputs.pre-commit-key }}
- name : Fail job if pre-commit cache restore failed
if : steps.cache-precommit.outputs.cache-hit != 'true'
2020-07-03 17:18:01 +00:00
run : |
2021-03-01 09:28:41 +00:00
echo "Failed to restore pre-commit environment from cache"
2020-07-03 17:18:01 +00:00
exit 1
2021-11-24 10:56:50 +00:00
- name : Run pyupgrade
run : |
. venv/bin/activate
pre-commit run --hook-stage manual pyupgrade --all-files --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
2020-07-04 23:59:41 +00:00
- name : Register check-json problem matcher
run : |
echo "::add-matcher::.github/workflows/matchers/check-json.json"
2020-07-03 17:18:01 +00:00
- name : Run check-json
run : |
. venv/bin/activate
pre-commit run --hook-stage manual check-json --all-files
2021-11-24 10:56:50 +00:00
- name : Register check executables problem matcher
2020-07-03 17:18:01 +00:00
run : |
2021-11-24 10:56:50 +00:00
echo "::add-matcher::.github/workflows/matchers/check-executables-have-shebangs.json"
- name : Run executables check
2020-07-03 17:18:01 +00:00
run : |
2021-11-24 10:56:50 +00:00
. 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
2020-07-03 17:18:01 +00:00
run : |
. venv/bin/activate
2021-11-24 10:56:50 +00:00
pre-commit run --show-diff-on-failure --hook-stage manual codespell --all-files
2020-07-03 17:18:01 +00:00
2021-11-24 10:56:50 +00:00
- name : Register hadolint problem matcher
run : |
echo "::add-matcher::.github/workflows/matchers/hadolint.json"
- name : Check Dockerfile
uses : docker://hadolint/hadolint:v1.18.2
2020-07-03 17:18:01 +00:00
with :
2021-11-24 10:56:50 +00:00
args : hadolint Dockerfile
- name : Check Dockerfile.dev
uses : docker://hadolint/hadolint:v1.18.2
2020-07-03 17:18:01 +00:00
with :
2021-11-24 10:56:50 +00:00
args : hadolint Dockerfile.dev
2020-07-03 17:18:01 +00:00
2021-11-25 19:53:49 +00:00
- name : Run bandit (fully)
if : needs.changes.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)
if : needs.changes.outputs.test_full_suite == 'false'
shell : bash
run : |
. venv/bin/activate
pre-commit run --hook-stage manual bandit --files {homeassistant,tests}/components/${{ needs.changes.outputs.integrations_glob }}/* --show-diff-on-failure
2020-07-03 17:18:01 +00:00
hassfest :
name : Check hassfest
runs-on : ubuntu-latest
2020-09-11 19:38:32 +00:00
needs : prepare-tests
strategy :
matrix :
2021-01-01 12:47:01 +00:00
python-version : [ 3.8 ]
2020-09-11 19:38:32 +00:00
container : homeassistant/ci-azure:${{ matrix.python-version }}
2020-07-03 17:18:01 +00:00
steps :
- name : Check out code from GitHub
2021-11-03 07:27:59 +00:00
uses : actions/checkout@v2.4.0
2021-01-01 12:47:01 +00:00
- name : Restore full Python ${{ matrix.python-version }} virtual environment
2020-07-03 17:18:01 +00:00
id : cache-venv
2021-11-23 08:29:22 +00:00
uses : actions/cache@v2.1.7
2020-07-03 17:18:01 +00:00
with :
path : venv
2021-03-01 09:28:41 +00:00
key : ${{ runner.os }}-${{ matrix.python-version }}-${{
needs.prepare-tests.outputs.python-key }}
2020-07-03 17:18:01 +00: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 hassfest
run : |
. venv/bin/activate
2020-09-11 19:38:32 +00:00
python -m script.hassfest --requirements --action validate
2020-07-03 17:18:01 +00:00
gen-requirements-all :
name : Check all requirements
runs-on : ubuntu-latest
needs : prepare-base
steps :
- name : Check out code from GitHub
2021-11-03 07:27:59 +00:00
uses : actions/checkout@v2.4.0
2020-07-03 17:18:01 +00:00
- name : Set up Python ${{ env.DEFAULT_PYTHON }}
2021-11-18 09:21:08 +00:00
uses : actions/setup-python@v2.3.0
2020-07-03 17:18:01 +00:00
id : python
with :
python-version : ${{ env.DEFAULT_PYTHON }}
- name : Restore base Python virtual environment
id : cache-venv
2021-11-23 08:29:22 +00:00
uses : actions/cache@v2.1.7
2020-07-03 17:18:01 +00:00
with :
path : venv
2021-03-01 09:28:41 +00:00
key : ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.prepare-base.outputs.python-key }}
2020-07-03 17:18:01 +00: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 gen_requirements_all.py
run : |
. venv/bin/activate
python -m script.gen_requirements_all validate
prepare-tests :
name : Prepare tests for Python ${{ matrix.python-version }}
runs-on : ubuntu-latest
strategy :
matrix :
2021-01-01 12:47:01 +00:00
python-version : [ 3.8 , 3.9 ]
2021-03-01 09:28:41 +00:00
outputs :
python-key : ${{ steps.generate-python-key.outputs.key }}
2020-07-03 17:18:01 +00:00
container : homeassistant/ci-azure:${{ matrix.python-version }}
steps :
- name : Check out code from GitHub
2021-11-03 07:27:59 +00:00
uses : actions/checkout@v2.4.0
2021-03-01 09:28:41 +00:00
- name : Generate partial Python venv restore key
id : generate-python-key
run : >-
echo "::set-output name=key::venv-${{ env.CACHE_VERSION }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('requirements_all.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}"
2021-01-01 12:47:01 +00:00
- name : Restore full Python ${{ matrix.python-version }} virtual environment
2020-07-03 17:18:01 +00:00
id : cache-venv
2021-11-23 08:29:22 +00:00
uses : actions/cache@v2.1.7
2020-07-03 17:18:01 +00:00
with :
path : venv
key : >-
2021-03-01 09:28:41 +00:00
${{ runner.os }}-${{ matrix.python-version }}-${{
steps.generate-python-key.outputs.key }}
2020-07-03 17:18:01 +00:00
restore-keys : |
2021-03-01 09:28:41 +00:00
${{ runner.os }}-${{ matrix.python-version }}-venv-${{ env.CACHE_VERSION }}-${{ hashFiles('requirements_test.txt') }}-${{ hashFiles('requirements_all.txt') }}-
${{ runner.os }}-${{ matrix.python-version }}-venv-${{ env.CACHE_VERSION }}-${{ hashFiles('requirements_test.txt') }}-
${{ runner.os }}-${{ matrix.python-version }}-venv-${{ env.CACHE_VERSION }}-
2021-01-01 12:47:01 +00:00
- name : Create full Python ${{ matrix.python-version }} virtual environment
2020-07-03 17:18:01 +00:00
if : steps.cache-venv.outputs.cache-hit != 'true'
run : |
2021-01-01 11:51:27 +00:00
# Temporary addition of cmake, needed to build some Python 3.9 packages
apt-get update
apt-get -y install cmake
2020-07-03 17:18:01 +00:00
python -m venv venv
. venv/bin/activate
2021-09-30 14:29:51 +00:00
pip install -U "pip<20.3" setuptools wheel
2020-07-11 13:20:14 +00:00
pip install -r requirements_all.txt
pip install -r requirements_test.txt
2020-07-03 17:18:01 +00:00
pip install -e .
pylint :
name : Check pylint
runs-on : ubuntu-latest
2021-11-24 17:14:41 +00:00
needs :
- changes
- prepare-tests
2020-07-03 17:18:01 +00:00
strategy :
matrix :
2021-01-01 12:47:01 +00:00
python-version : [ 3.8 ]
2020-07-03 17:18:01 +00:00
container : homeassistant/ci-azure:${{ matrix.python-version }}
steps :
- name : Check out code from GitHub
2021-11-03 07:27:59 +00:00
uses : actions/checkout@v2.4.0
2021-01-01 12:47:01 +00:00
- name : Restore full Python ${{ matrix.python-version }} virtual environment
2020-07-03 17:18:01 +00:00
id : cache-venv
2021-11-23 08:29:22 +00:00
uses : actions/cache@v2.1.7
2020-07-03 17:18:01 +00:00
with :
path : venv
2021-03-01 09:28:41 +00:00
key : ${{ runner.os }}-${{ matrix.python-version }}-${{
needs.prepare-tests.outputs.python-key }}
2020-07-03 17:18:01 +00: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
2020-07-05 00:00:51 +00:00
- name : Register pylint problem matcher
run : |
echo "::add-matcher::.github/workflows/matchers/pylint.json"
2021-11-24 17:14:41 +00:00
- name : Run pylint (fully)
if : needs.changes.outputs.test_full_suite == 'true'
2020-07-03 17:18:01 +00:00
run : |
. venv/bin/activate
pylint homeassistant
2021-11-24 17:14:41 +00:00
- name : Run pylint (partially)
if : needs.changes.outputs.test_full_suite == 'false'
2021-11-25 13:13:03 +00:00
shell : bash
2021-11-24 17:14:41 +00:00
run : |
. venv/bin/activate
pylint homeassistant/components/${{ needs.changes.outputs.integrations_glob }}
2020-07-03 17:18:01 +00:00
mypy :
name : Check mypy
runs-on : ubuntu-latest
2021-11-24 17:14:41 +00:00
needs :
- changes
- prepare-tests
2020-07-03 17:18:01 +00:00
strategy :
matrix :
2021-01-01 12:47:01 +00:00
python-version : [ 3.8 ]
2020-07-03 17:18:01 +00:00
container : homeassistant/ci-azure:${{ matrix.python-version }}
steps :
- name : Check out code from GitHub
2021-11-03 07:27:59 +00:00
uses : actions/checkout@v2.4.0
2021-01-01 12:47:01 +00:00
- name : Restore full Python ${{ matrix.python-version }} virtual environment
2020-07-03 17:18:01 +00:00
id : cache-venv
2021-11-23 08:29:22 +00:00
uses : actions/cache@v2.1.7
2020-07-03 17:18:01 +00:00
with :
path : venv
2021-03-01 09:28:41 +00:00
key : ${{ runner.os }}-${{ matrix.python-version }}-${{
needs.prepare-tests.outputs.python-key }}
2020-07-03 17:18:01 +00: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
2020-07-05 00:04:39 +00:00
- name : Register mypy problem matcher
run : |
echo "::add-matcher::.github/workflows/matchers/mypy.json"
2021-11-24 17:14:41 +00:00
- name : Run mypy (fully)
if : needs.changes.outputs.test_full_suite == 'true'
2020-07-03 17:18:01 +00:00
run : |
. venv/bin/activate
mypy homeassistant
2021-11-24 17:14:41 +00:00
- name : Run mypy (partially)
if : needs.changes.outputs.test_full_suite == 'false'
2021-11-25 13:13:03 +00:00
shell : bash
2021-11-23 22:57:45 +00:00
run : |
2021-11-24 17:14:41 +00:00
. venv/bin/activate
mypy homeassistant/components/${{ needs.changes.outputs.integrations_glob }}
2021-11-23 22:57:45 +00:00
2021-11-24 17:14:41 +00:00
pytest :
2020-07-03 17:18:01 +00:00
runs-on : ubuntu-latest
2021-11-24 17:14:41 +00:00
if : needs.changes.outputs.test_full_suite == 'true' || needs.changes.outputs.tests_glob
2021-11-23 10:21:55 +00:00
needs :
2021-11-23 22:57:45 +00:00
- changes
2021-11-23 10:21:55 +00:00
- gen-requirements-all
- hassfest
- lint-black
2021-11-24 10:56:50 +00:00
- lint-other
2021-11-23 10:21:55 +00:00
- lint-isort
- mypy
- prepare-tests
2020-07-03 17:18:01 +00:00
strategy :
2021-03-01 09:28:41 +00:00
fail-fast : false
2020-07-03 17:18:01 +00:00
matrix :
2021-11-24 17:14:41 +00:00
group : ${{ fromJson(needs.changes.outputs.test_groups) }}
2021-01-01 12:47:01 +00:00
python-version : [ 3.8 , 3.9 ]
2020-07-03 17:18:01 +00:00
name : >-
2021-11-24 17:14:41 +00:00
Run tests Python ${{ matrix.python-version }} (${{ matrix.group }})
2020-07-03 17:18:01 +00:00
container : homeassistant/ci-azure:${{ matrix.python-version }}
steps :
- name : Check out code from GitHub
2021-11-03 07:27:59 +00:00
uses : actions/checkout@v2.4.0
2021-01-01 12:47:01 +00:00
- name : Restore full Python ${{ matrix.python-version }} virtual environment
2020-07-03 17:18:01 +00:00
id : cache-venv
2021-11-23 08:29:22 +00:00
uses : actions/cache@v2.1.7
2020-07-03 17:18:01 +00:00
with :
path : venv
2021-03-01 09:28:41 +00:00
key : ${{ runner.os }}-${{ matrix.python-version }}-${{
needs.prepare-tests.outputs.python-key }}
2020-07-03 17:18:01 +00: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
2020-07-05 12:10:42 +00:00
- 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.
2021-10-24 19:22:17 +00:00
pip install pytest-github-actions-annotate-failures==0.1.3
2021-11-25 20:45:14 +00:00
- name : Register pytest slow test problem matcher
run : |
echo "::add-matcher::.github/workflows/matchers/pytest-slow.json"
2021-11-24 17:14:41 +00:00
- name : Run pytest (fully)
if : needs.changes.outputs.test_full_suite == 'true'
2020-07-03 17:18:01 +00:00
run : |
. venv/bin/activate
2021-11-18 05:23:25 +00:00
python3 -X dev -m pytest \
2020-07-03 17:18:01 +00:00
-qq \
--timeout=9 \
--durations=10 \
-n auto \
--dist=loadfile \
2021-11-24 17:14:41 +00:00
--test-group-count ${{ needs.changes.outputs.test_group_count }} \
2020-07-03 17:18:01 +00:00
--test-group=${{ matrix.group }} \
--cov homeassistant \
2021-11-25 14:05:20 +00:00
--cov-report=xml \
2020-07-03 17:18:01 +00:00
-o console_output_style=count \
-p no:sugar \
tests
2021-11-24 17:14:41 +00:00
- name : Run pytest (partially)
if : needs.changes.outputs.test_full_suite == 'false'
2021-11-23 22:57:45 +00:00
run : |
. venv/bin/activate
python3 -X dev -m pytest \
-qq \
--timeout=9 \
--durations=10 \
-n auto \
2021-11-24 17:14:41 +00:00
--cov homeassistant.components.${{ matrix.group }} \
2021-11-25 14:05:20 +00:00
--cov-report=xml \
--cov-report=term-missing \
2021-11-23 22:57:45 +00:00
-o console_output_style=count \
2021-11-25 20:45:14 +00:00
--durations=0 \
--durations-min=1 \
2021-11-23 22:57:45 +00:00
-p no:sugar \
2021-11-24 17:14:41 +00:00
tests/components/${{ matrix.group }}
- name : Upload coverage to Codecov (full coverage)
if : needs.changes.outputs.test_full_suite == 'true'
uses : codecov/codecov-action@v2.1.0
2021-11-25 14:05:20 +00:00
with :
files : coverage.xml
2021-11-25 16:35:15 +00:00
flags : full-suite
2021-11-24 17:14:41 +00:00
- name : Upload coverage to Codecov (partial coverage)
if : needs.changes.outputs.test_full_suite == 'false'
uses : codecov/codecov-action@v2.1.0
2021-11-23 22:57:45 +00:00
with :
2021-11-25 14:05:20 +00:00
files : coverage.xml
2021-11-24 17:14:41 +00:00
flags : ${{ matrix.group }}
2021-11-23 22:57:45 +00:00
- name : Check dirty
run : |
./script/check_dirty