This is an automated email from the ASF dual-hosted git repository.

ash pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/master by this push:
     new 7417f81  Run UI tests selectively when UI files have changed (#15009)
7417f81 is described below

commit 7417f81d36ad02c2a9d7feb9b9f881610f50ceba
Author: Ash Berlin-Taylor <ash_git...@firemirror.com>
AuthorDate: Wed Mar 31 23:10:00 2021 +0100

    Run UI tests selectively when UI files have changed (#15009)
    
    If we only change the new React UI files, we don't want to have to run
    the whole python test suite!
---
 .github/workflows/ci.yml           | 37 ++++++++++++++++++++++++++++++
 .pre-commit-config.yaml            |  7 ++++++
 BREEZE.rst                         |  2 +-
 STATIC_CODE_CHECKS.rst             |  2 ++
 breeze-complete                    |  1 +
 scripts/ci/selective_ci_checks.sh  | 46 +++++++++++++++++++++++++++++++++++---
 scripts/ci/static_checks/eslint.sh | 31 +++++++++++++++++++++++++
 7 files changed, 122 insertions(+), 4 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 49fb2e7..3f90b43 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -147,6 +147,7 @@ jobs:
       sqliteExclude: ${{ steps.selective-checks.outputs.sqlite-exclude }}
       kubernetesExclude: ${{ steps.selective-checks.outputs.kubernetes-exclude 
}}
       run-tests: ${{ steps.selective-checks.outputs.run-tests }}
+      run-ui-tests: ${{ steps.selective-checks.outputs.run-ui-tests }}
       run-kubernetes-tests: ${{ 
steps.selective-checks.outputs.run-kubernetes-tests }}
       basic-checks-only: ${{ steps.selective-checks.outputs.basic-checks-only 
}}
       image-build: ${{ steps.selective-checks.outputs.image-build }}
@@ -344,6 +345,12 @@ 
pre-commit-local-installation-${{steps.host-python-version.outputs.host-python-v
           key: 
"pre-commit-no-pylint-${{steps.host-python-version.outputs.host-python-version}}-\
 ${{ hashFiles('.pre-commit-config.yaml') }}"
           restore-keys: 
pre-commit-no-pylint-${{steps.host-python-version.outputs.host-python-version}}
+
+      - name: "Cache eslint"
+        uses: actions/cache@v2
+        with:
+          path: 'airflow/ui/node_modules'
+          key: ${{ runner.os }}-ui-node-modules-${{ 
hashFiles('airflow/ui/**/yarn.lock') }}
       - name: "Static checks: except pylint"
         run: ./scripts/ci/static_checks/run_static_checks.sh
         env:
@@ -1264,3 +1271,33 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
           tags: true
           force: true
           branch: master
+
+  tests-ui:
+    timeout-minutes: 10
+    name: React UI tests
+    runs-on: ${{ fromJson(needs.build-info.outputs.runsOn) }}
+    needs: [build-info, ci-images]
+    env:
+      GITHUB_REGISTRY: ${{ needs.ci-images.outputs.githubRegistry }}
+    if: needs.build-info.outputs.run-ui-tests == 'true'
+    steps:
+      - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
+        uses: actions/checkout@v2
+        with:
+          persist-credentials: false
+          submodules: recursive
+      - name: "Setup node"
+        uses: actions/setup-node@v2
+        with:
+          node-version: 14
+      - name: "Free space"
+        run: ./scripts/ci/tools/ci_free_space_on_ci.sh
+      - name: "Prepare CI image ${{env.PYTHON_MAJOR_MINOR_VERSION}}:${{ 
env.GITHUB_REGISTRY_PULL_IMAGE_TAG }}"
+        run: ./scripts/ci/images/ci_prepare_ci_image_on_ci.sh
+      - name: "Cache eslint"
+        uses: actions/cache@v2
+        with:
+          path: 'airflow/ui/node_modules'
+          key: ${{ runner.os }}-ui-node-modules-${{ 
hashFiles('airflow/ui/**/yarn.lock') }}
+      - run: yarn --cwd airflow/ui/ install --frozen-lockfile --non-interactive
+      - run: yarn --cwd airflow/ui/ run test
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index e3cc75a..50e18ed 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -620,6 +620,13 @@ repos:
         entry: "./scripts/ci/pre_commit/pre_commit_flake8.sh"
         files: \.py$
         pass_filenames: true
+      - id: ui-lint
+        name: ESLint against airflow/ui
+        language: node
+        'types_or': [javascript, tsx, ts]
+        files: ^airflow/ui/
+        entry: "scripts/ci/static_checks/eslint.sh"
+        pass_filenames: false
       - id: bats-in-container-tests
         name: Run in container bats tests
         language: system
diff --git a/BREEZE.rst b/BREEZE.rst
index 55cc46a..2d0a346 100644
--- a/BREEZE.rst
+++ b/BREEZE.rst
@@ -2298,7 +2298,7 @@ This is the current syntax for  `./breeze <./breeze>`_:
                  pre-commit-hook-names provide-create-sessions 
providers-init-file provider-yamls
                  pydevd pydocstyle pylint pylint-tests python-no-log-warn 
pyupgrade
                  restrict-start_date rst-backticks setup-order 
setup-extra-packages shellcheck
-                 sort-in-the-wild sort-spelling-wordlist stylelint 
trailing-whitespace
+                 sort-in-the-wild sort-spelling-wordlist stylelint 
trailing-whitespace ui-lint
                  update-breeze-file update-extras update-local-yml-file 
update-setup-cfg-file
                  version-sync yamllint
 
diff --git a/STATIC_CODE_CHECKS.rst b/STATIC_CODE_CHECKS.rst
index 69bc52a..1481c2f 100644
--- a/STATIC_CODE_CHECKS.rst
+++ b/STATIC_CODE_CHECKS.rst
@@ -170,6 +170,8 @@ require Breeze Docker images to be installed locally:
 ----------------------------------- 
---------------------------------------------------------------- ------------
 ``trailing-whitespace``               Removes trailing whitespace at end of 
line
 ----------------------------------- 
---------------------------------------------------------------- ------------
+``ui-lint``                           Static checks of airflow/ui/ folder
+----------------------------------- 
---------------------------------------------------------------- ------------
 ``update-breeze-file``                Update output of breeze command in 
BREEZE.rst
 ----------------------------------- 
---------------------------------------------------------------- ------------
 ``update-extras``                     Updates extras in the documentation
diff --git a/breeze-complete b/breeze-complete
index ba84987..af1f2e4 100644
--- a/breeze-complete
+++ b/breeze-complete
@@ -137,6 +137,7 @@ sort-in-the-wild
 sort-spelling-wordlist
 stylelint
 trailing-whitespace
+ui-lint
 update-breeze-file
 update-extras
 update-local-yml-file
diff --git a/scripts/ci/selective_ci_checks.sh 
b/scripts/ci/selective_ci_checks.sh
index 0b40e60..c2adf2d 100755
--- a/scripts/ci/selective_ci_checks.sh
+++ b/scripts/ci/selective_ci_checks.sh
@@ -45,7 +45,7 @@ fi
 function check_upgrade_to_newer_dependencies_needed() {
     # shellcheck disable=SC2153
     if [[ "${UPGRADE_TO_NEWER_DEPENDENCIES}" != "false" ||
-            ${GITHUB_EVENT_NAME} == 'push' || ${GITHUB_EVENT_NAME} == 
"scheduled" ]]; then
+            ${GITHUB_EVENT_NAME=} == 'push' || ${GITHUB_EVENT_NAME=} == 
"scheduled" ]]; then
         # Trigger upgrading to latest constraints where label is set or when
         # SHA of the merge commit triggers rebuilding layer in the docker image
         # Each build that upgrades to latest constraints will get truly latest 
constraints, not those
@@ -203,6 +203,10 @@ function set_upgrade_to_newer_dependencies() {
     initialization::ga_output upgrade-to-newer-dependencies "${@}"
 }
 
+function needs_ui_tests() {
+    initialization::ga_output run-ui-tests "${@}"
+}
+
 if [[ ${DEFAULT_BRANCH} == "master" ]]; then
     ALL_TESTS="Always API Core Other CLI Providers WWW Integration"
 else
@@ -224,6 +228,7 @@ function set_outputs_run_everything_and_exit() {
     set_docs_build "true"
     set_image_build "true"
     set_upgrade_to_newer_dependencies "${upgrade_to_newer_dependencies}"
+    needs_ui_tests "true"
     exit
 }
 
@@ -233,6 +238,7 @@ function set_outputs_run_all_tests() {
     set_test_types "${ALL_TESTS}"
     set_basic_checks_only "false"
     set_image_build "true"
+    needs_ui_tests "true"
     kubernetes_tests_needed="true"
 }
 
@@ -249,6 +255,7 @@ function set_output_skip_all_tests_and_docs_and_exit() {
     set_docs_build "false"
     set_image_build "false"
     set_upgrade_to_newer_dependencies "false"
+    needs_ui_tests "false"
     exit
 }
 
@@ -265,6 +272,7 @@ function set_output_skip_tests_but_build_images_and_exit() {
     set_docs_build "true"
     set_image_build "true"
     set_upgrade_to_newer_dependencies "${upgrade_to_newer_dependencies}"
+    needs_ui_tests "false"
     exit
 }
 
@@ -338,7 +346,7 @@ function check_if_setup_files_changed() {
 function check_if_javascript_security_scans_should_be_run() {
     start_end::group_start "Check Javascript security scans"
     local pattern_array=(
-        "^airflow/.*\.js"
+        "^airflow/.*\.[jt]sx?"
         "^airflow/.*\.lock"
     )
     show_changed_files
@@ -416,6 +424,24 @@ function check_if_docs_should_be_generated() {
     start_end::group_end
 }
 
+function check_if_ui_tests_should_be_run() {
+    start_end::group_start "Check UI"
+    local pattern_array=(
+        "^airflow/ui/.*\.[tj]sx?$"
+        # tsconfig.json, package.json, etc.
+        "^airflow/ui/[^/]+\.json$"
+        "^airflow/ui/.*\.lock$"
+    )
+    show_changed_files
+
+    if [[ $(count_changed_files) == "0" ]]; then
+        needs_ui_tests "false"
+    else
+        needs_ui_tests "true"
+    fi
+    start_end::group_end
+}
+
 
 ANY_PY_FILES_CHANGED=(
     "\.py$"
@@ -548,6 +574,18 @@ function get_count_www_files() {
     start_end::group_end
 }
 
+function get_count_ui_files() {
+    start_end::group_start "Count ui files"
+    local pattern_array=(
+        "^airflow/ui/"
+    )
+    show_changed_files
+    COUNT_UI_CHANGED_FILES=$(count_changed_files)
+    echo "Files count: ${COUNT_UI_CHANGED_FILES}"
+    readonly COUNT_UI_CHANGED_FILES
+    start_end::group_end
+}
+
 function get_count_kubernetes_files() {
     start_end::group_start "Count kubernetes files"
     local pattern_array=(
@@ -565,7 +603,7 @@ function get_count_kubernetes_files() {
 
 function calculate_test_types_to_run() {
     start_end::group_start "Count core/other files"
-    COUNT_CORE_OTHER_CHANGED_FILES=$((COUNT_ALL_CHANGED_FILES - 
COUNT_WWW_CHANGED_FILES - COUNT_PROVIDERS_CHANGED_FILES - 
COUNT_CLI_CHANGED_FILES - COUNT_API_CHANGED_FILES - 
COUNT_KUBERNETES_CHANGED_FILES))
+    COUNT_CORE_OTHER_CHANGED_FILES=$((COUNT_ALL_CHANGED_FILES - 
COUNT_WWW_CHANGED_FILES - COUNT_UI_CHANGED_FILES - 
COUNT_PROVIDERS_CHANGED_FILES - COUNT_CLI_CHANGED_FILES - 
COUNT_API_CHANGED_FILES - COUNT_KUBERNETES_CHANGED_FILES))
 
     readonly COUNT_CORE_OTHER_CHANGED_FILES
     echo
@@ -664,12 +702,14 @@ check_if_api_tests_should_be_run
 check_if_api_codegen_should_be_run
 check_if_javascript_security_scans_should_be_run
 check_if_python_security_scans_should_be_run
+check_if_ui_tests_should_be_run
 check_if_tests_are_needed_at_all
 get_count_all_files
 get_count_api_files
 get_count_cli_files
 get_count_providers_files
 get_count_www_files
+get_count_ui_files
 get_count_kubernetes_files
 calculate_test_types_to_run
 
diff --git a/scripts/ci/static_checks/eslint.sh 
b/scripts/ci/static_checks/eslint.sh
new file mode 100755
index 0000000..3722e54
--- /dev/null
+++ b/scripts/ci/static_checks/eslint.sh
@@ -0,0 +1,31 @@
+#!/usr/bin/env bash
+# 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.
+
+MOUNT_ALL_LOCAL_SOURCES="false"
+
+# shellcheck source=scripts/ci/libraries/_script_init.sh
+. "$( dirname "${BASH_SOURCE[0]}" )/../libraries/_script_init.sh"
+
+build_images::prepare_ci_build
+
+build_images::rebuild_ci_image_if_needed
+
+docker run "${EXTRA_DOCKER_FLAGS[@]}" \
+    --entrypoint "/bin/bash"  \
+    "${AIRFLOW_CI_IMAGE}" \
+    -c 'cd airflow/ui && yarn --frozen-lockfile --non-interactive && yarn run 
lint "${@}"' "${@#airflow/ui/}"

Reply via email to