Skip to content
Snippets Groups Projects
Unverified Commit d85bed6e authored by Cam Saul's avatar Cam Saul Committed by GitHub
Browse files

More CI improvements (#13942)

* Integrate the skip-driver-tests logic into config.yml

* Try out [ci noskip]

* Remove the always-run-on-master-or-release option; do this automatically

* Remove duplicate calls to attach workspace/restore be deps cache in lein command

* Cache busting dot com

* More documentation; remove 'basic' executor since it doesn't have bash

* Use CircleCI base image for the checkout step

* Try another empty commit

* Try cache-busting! [ci nocache]

* Cool! Cache busting worked. Try no busting

* Bump all the 5 minute timeouts to 10 minutes
parent 763a9450
No related branches found
No related tags found
No related merge requests found
......@@ -5,10 +5,12 @@ version: 2.1
########################################################################################################################
executors:
# Basic executor with git and bash and not much else.
basic:
working_directory: /home/circleci/metabase/metabase/
docker:
- image: alpine/git
# CircleCI base image
- image: cimg/base:2020.01
clojure:
working_directory: /home/circleci/metabase/metabase/
......@@ -192,7 +194,7 @@ executors:
- image: metabase/qa-databases:mysql-sample-8
########################################################################################################################
# COMMANDS #
# MAP FRAGMENTS AND CACHE KEYS #
########################################################################################################################
# `default_parameters` isn't a key that CircleCI uses, but this form lets us reuse parameter definitions
......@@ -201,6 +203,60 @@ default_parameters: &Params
type: string
default: "oss"
# .BACKEND-CHECKSUMS, .FRONTEND-CHECKSUMS, and .MODULE-CHECKSUMS are created during the checkout step; see that step
# for exact details as to what they contain.
#
# To support cache busting, we create a file named .CACHE-PREFIX in the checkout step and use its checksum as the
# prefix for every cache key. If the commit message DOES NOT include [ci nocache], we create an empty file; the
# checksum will always be the same for this file. If the commit message DOES include [ci nocache], we'll write the
# unique ID of the current pipeline to .CACHE-PREFIX which will effectively bust our caches whenever it's used.
### Deps Keys ###
# Why don't we use fallback keys for backend/frontend deps? We used to, but it allowed the cache to grow
# uncontrollably since old deps would continue to accumulate. Restoring big caches is really slow in Circle. It's
# actually faster to recreate the deps cache from scratch whenever we need to which keeps the size down.
cache-key-backend-deps: &CacheKeyBackendDeps
key: v1-{{ checksum ".CACHE-PREFIX" }}-be-deps-{{ checksum "project.clj" }}
cache-key-frontend-deps: &CacheKeyFrontendDeps
key: v1-{{ checksum ".CACHE-PREFIX" }}-fe-deps-{{ checksum "yarn.lock" }}
# Key used for implementation of run-on-change -- this is the cache key that contains the .SUCCESS dummy file
cache-key-run-on-change: &CacheKeyRunOnChange
key: v1-{{ checksum ".CACHE-PREFIX" }}-run-on-change-<< parameters.cache-key >>
# Key for the local maven installation of metabase-core (used by build-uberjar-drivers)
cache-key-metabase-core: &CacheKeyMetabaseCore
key: v1-{{ checksum ".CACHE-PREFIX" }}-metabase-core-{{ checksum ".BACKEND-CHECKSUMS" }}
# Key for the drivers built by build-uberjar-drivers
cache-key-drivers: &CacheKeyDrivers
key: v1-{{ checksum ".CACHE-PREFIX" }}-drivers-{{ checksum ".MODULES-CHECKSUMS" }}-{{ checksum ".BACKEND-CHECKSUMS" }}
# This is also used by the uberjar-build-drivers step; this is a unique situation because the build-drivers script has
# logic to determine whether to rebuild drivers or not that is quite a bit more sophisticated that the run-on-change
# stuff in this file. e.g. if I only change the bigquery driver, the script is smart enough to not rebuild the
# redshift driver.
cache-keys-drivers-with-fallback-keys: &CacheKeyDrivers_WithFallbackKeys
keys:
- v1-{{ checksum ".CACHE-PREFIX" }}-drivers-{{ checksum ".MODULES-CHECKSUMS" }}-{{ checksum ".BACKEND-CHECKSUMS" }}
- v1-{{ checksum ".CACHE-PREFIX" }}-drivers-{{ checksum ".MODULES-CHECKSUMS" }}
- v1-{{ checksum ".CACHE-PREFIX" }}-drivers-
# Key for frontend client built by uberjar-build-frontend step
cache-key-frontend: &CacheKeyFrontend
key: v1-{{ checksum ".CACHE-PREFIX" }}-frontend-<< parameters.edition >>-{{ checksum ".FRONTEND-CHECKSUMS" }}
# Key for uberjar built by build-uberjar
cache-key-uberjar: &CacheKeyUberjar
key: v1-{{ checksum ".CACHE-PREFIX" }}-uberjar-<< parameters.edition >>-{{ checksum ".BACKEND-CHECKSUMS" }}-{{ checksum ".FRONTEND-CHECKSUMS" }}
########################################################################################################################
# COMMANDS #
########################################################################################################################
commands:
attach-workspace:
steps:
......@@ -213,21 +269,21 @@ commands:
restore-be-deps-cache:
steps:
- restore_cache:
keys:
- be-deps-v5-{{ checksum "project.clj" }}
name: Restore cached backend dependencies
<<: *CacheKeyBackendDeps
restore-fe-deps-cache:
steps:
- restore_cache:
keys:
- fe-deps-v5-{{ checksum "yarn.lock" }}
name: Restore cached frontend dependencies
<<: *CacheKeyFrontendDeps
# run-on-change lets you only run steps if changes have happened to relevant files since the last time it was run
# successfully. Uses a cache key to record successful runs -- cache key should be unique for job and relevant source
# files -- use a checksum! It works like this:
#
# 1. Calculate a cache key using a checksum of relevant files for the step in question, e.g. a backend linter step
# might use a checksum of all .clj files
# might use a checksum of all .clj files.
#
# 2. When the step completes successfully, create a dummy file .SUCCESS and cache it with that cache key.
#
......@@ -237,38 +293,71 @@ commands:
#
# b. If we have a cache entry for that key, .SUCCESS will get restored
#
# c. If .SUCCESS is present, we can skip the rest of the job, including potentially slow steps like restoring
# c. If this command has the skip-job-if-commit-message-includes-ci-quick option enabled, and commit message includes
# [ci quick], create a dummy file .SUCCESS if not already present. Ignored for master/release branches.
#
# d. If commit message includes [ci noskip], delete .SUCCESS so the job will be forced to run.
#
# e. If .SUCCESS is present, we can skip the rest of the job, including potentially slow steps like restoring
# dependency caches or the like. This logs a link to the last successful (not skipped) run of the job
#
# Important! If this step is skipped because no changes have happened, the entire JOB will halt with a success
# status -- no steps that happen AFTER run-on-change will be ran. Keep this in mind!
#
# d. If .SUCCESS is not present, proceed as normal, and create and cache .SUCCESS if the job succeeds
# f. If .SUCCESS is not present, proceed as normal, and create and cache .SUCCESS if the job succeeds
run-on-change:
parameters:
cache-key:
type: string
steps:
type: steps
# Whether to skip the rest of the job if commit message includes [ci quick]
skip-job-if-commit-message-includes-ci-quick:
type: boolean
default: false
steps:
- restore_cache:
keys:
- run-on-change-<< parameters.cache-key >>
name: Restore dummy file .SUCCESS if it exists for cache key << parameters.cache-key >>
<<: *CacheKeyRunOnChange
- when:
condition: << parameters.skip-job-if-commit-message-includes-ci-quick >>
steps:
- run:
name: "Skip tests (create dummy file .SUCCESS) if commit message contains [ci quick] and branch isn't a master/release branch"
command: |
if [[ "$CIRCLE_BRANCH" =~ ^master|release-.+$ ]]; then
echo "branch '$CIRCLE_BRANCH' is a master or release branch: ignoring [ci quick]"
elif [[ `cat .COMMIT` == *"[ci quick]"* ]]; then
echo 'Commit message includes [ci quick]. Creating dummy file .SUCCESS'
touch .SUCCESS
else
echo 'Commit message does not include [ci quick]'
fi
- run:
name: "Force test run (delete dummy file .SUCCESS) if commit message includes [ci noskip]"
command: |
if [[ `cat .COMMIT` == *"[ci noskip]"* ]]; then
echo 'Commit message includes [ci noskip] -- forcing test run (delete .SUCCESS)'
rm -f .SUCCESS
else
echo 'Commit message does not include [ci noskip]'
fi
- run:
name: Skip rest of job if .SUCCESS exists for cache key << parameters.cache-key >>
name: Skip rest of job if .SUCCESS exists
command: |
if [ -f .SUCCESS ]; then
echo "Job previously succeeded for cache key << parameters.cache-key >>"
echo "Link to last successful run: $(cat .SUCCESS)"
echo '.SUCCESS is present: skipping rest of job.'
echo "Link to last successful run (if available): $(cat .SUCCESS)"
circleci-agent step halt
fi
- steps: << parameters.steps >>
- run:
name: Create dummy file .SUCCESS for cache key << parameters.cache-key >>
name: Create dummy file .SUCCESS
command: |
echo "$CIRCLE_BUILD_URL" > .SUCCESS
- save_cache:
key: run-on-change-<< parameters.cache-key >>
name: Persist dummy file .SUCCESS to cache with key << parameters.cache-key >>
<<: *CacheKeyRunOnChange
paths:
- /home/circleci/metabase/metabase/.SUCCESS
- run:
......@@ -308,14 +397,13 @@ commands:
default: []
<<: *Params
steps:
- attach-workspace
- restore-be-deps-cache
- steps: << parameters.before-steps >>
- run:
name: lein << parameters.lein-command >>
command: |
lein with-profile +ci,+<< parameters.edition >> << parameters.lein-command >>
no_output_timeout: 5m
no_output_timeout: 10m
- steps: << parameters.after-steps >>
- store_test_results:
path: /home/circleci/metabase/metabase/target/junit
......@@ -375,7 +463,7 @@ commands:
name: Wait for port << parameters.port >> to be ready
command: |
while ! nc -z localhost << parameters.port >>; do sleep 0.1; done
no_output_timeout: 5m
no_output_timeout: 10m
fetch-jdbc-driver:
parameters:
......@@ -391,7 +479,7 @@ commands:
name: Download JDBC driver JAR << parameters.dest >>
command: |
wget --output-document=plugins/<< parameters.dest >> ${<< parameters.source >>}
no_output_timeout: 5m
no_output_timeout: 10m
jobs:
......@@ -416,14 +504,24 @@ jobs:
filename: .MODULES-CHECKSUMS
find-args: "./modules -type f -name '*.clj' -or -name metabase-plugin.yaml"
- run:
name: Save last git commit message
command: git log -1 > commit.txt
name: Save last git commit message to .COMMIT
command: git log -1 > .COMMIT
- run:
name: Remove .git directory (not needed for tests)
command: rm -rf /home/circleci/metabase/metabase/.git
- run:
name: Remove ./OSX directory (not needed for tests)
command: rm -rf /home/circleci/metabase/metabase/OSX
# .CACHE-PREFIX is described above in the Cache Keys section of this file
- run:
name: 'Create cache key prefix .CACHE-PREFIX to bust caches if commit message includes [ci nocache]'
command: |
if [[ `cat .COMMIT` == *"[ci nocache]"* ]]; then
echo 'Commit message includes [ci nocache]; using cache-busting prefix'
echo '<< pipeline.id >>' > .CACHE-PREFIX
else
echo '' > .CACHE-PREFIX
fi
- persist_to_workspace:
root: /home/circleci/
paths:
......@@ -486,12 +584,13 @@ jobs:
# This step is pretty slow, even with the cache, so only run it if project.clj has changed
# TODO -- we should cache the build script deps as well, and driver deps?
- run-on-change:
cache-key: be-deps-skip-{{ checksum "project.clj" }}
cache-key: be-deps-{{ checksum "project.clj" }}
steps:
- restore-be-deps-cache
- run: lein with-profile +include-all-drivers,+cloverage,+junit,+<< parameters.edition >> deps
- save_cache:
key: be-deps-v5-{{ checksum "project.clj" }}
name: Cache backend dependencies
<<: *CacheKeyBackendDeps
paths:
- /home/circleci/.m2
......@@ -524,7 +623,6 @@ jobs:
- run-on-change:
cache-key: lein-<< parameters.skip-key >>-{{ checksum ".BACKEND-CHECKSUMS" }}
steps:
- restore-be-deps-cache
- run-lein-command:
before-steps: << parameters.before-steps >>
lein-command: << parameters.lein-command >>
......@@ -533,7 +631,6 @@ jobs:
- unless:
condition: << parameters.skip-key >>
steps:
- restore-be-deps-cache
- run-lein-command:
before-steps: << parameters.before-steps >>
lein-command: << parameters.lein-command >>
......@@ -551,7 +648,7 @@ jobs:
- run:
name: Run reflection warnings checker
command: ./bin/reflection-linter
no_output_timeout: 5m
no_output_timeout: 10m
test-driver:
parameters:
......@@ -562,7 +659,7 @@ jobs:
type: string
timeout:
type: string
default: 5m
default: 10m
before-steps:
type: steps
default: []
......@@ -572,33 +669,20 @@ jobs:
executor: << parameters.e >>
steps:
- attach-workspace
# Driver tests are skipped when there are no changes, similar to the run-on-change stuff used everywhere else,
# but the logic is a bit more complicated. Instead of .SUCCESS the file is named <driver>.success;
# skip-driver-tests.sh determines the rest of the logic. Refer to that for details
- restore_cache:
keys:
- driver-tests-<< parameters.driver >>-{{ checksum ".BACKEND-CHECKSUMS" }}
- run:
name: Skip rest of job if not running << parameters.driver >> tests (cache key = driver-tests-<< parameters.driver >>-{{ checksum ".BACKEND-CHECKSUMS" }})
command: |
( .circleci/skip-driver-tests.sh << parameters.driver >> && circleci-agent step halt ) || true
- restore-be-deps-cache
- steps: << parameters.before-steps >>
- run:
name: Test << parameters.driver >> driver << parameters.description >>
environment:
DRIVERS: h2,<< parameters.driver >>
command: lein with-profile +ci,+junit,+ee test
no_output_timeout: << parameters.timeout >>
- run:
name: Create dummy file << parameters.driver >>.success for cache key driver-tests-<< parameters.driver >>-{{ checksum ".BACKEND-CHECKSUMS" }}
command: touch << parameters.driver >>.success
- save_cache:
key: driver-tests-<< parameters.driver >>-{{ checksum ".BACKEND-CHECKSUMS" }}
paths:
- /home/circleci/metabase/metabase/<< parameters.driver >>.success
- store_test_results:
path: /home/circleci/metabase/metabase/target/junit
- run-on-change:
cache-key: driver-tests-<< parameters.driver >>-{{ checksum ".BACKEND-CHECKSUMS" }}
skip-job-if-commit-message-includes-ci-quick: true
steps:
- restore-be-deps-cache
- steps: << parameters.before-steps >>
- run:
name: Test << parameters.driver >> driver << parameters.description >>
environment:
DRIVERS: h2,<< parameters.driver >>
command: lein with-profile +ci,+junit,+ee test
no_output_timeout: << parameters.timeout >>
- store_test_results:
path: /home/circleci/metabase/metabase/target/junit
test-migrate-from-h2:
parameters:
......@@ -621,7 +705,7 @@ jobs:
MB_DB_HOST: localhost
MB_EDITION: << parameters.edition >>
command: ./bin/test-load-and-dump.sh
no_output_timeout: 5m
no_output_timeout: 10m
test-build-scripts:
executor: metabase-ci
......@@ -635,22 +719,22 @@ jobs:
name: Run metabuild-common build script tests
command: |
cd /home/circleci/metabase/metabase/bin/common && clojure -M:test
no_output_timeout: 5m
no_output_timeout: 10m
- run:
name: Run build-drivers build script tests
command: |
cd /home/circleci/metabase/metabase/bin/build-drivers && clojure -M:test
no_output_timeout: 5m
no_output_timeout: 10m
- run:
name: Run build-mb build script tests
command: |
cd /home/circleci/metabase/metabase/bin/build-mb && clojure -M:test
no_output_timeout: 5m
no_output_timeout: 10m
- run:
name: Run release script tests
command: |
cd /home/circleci/metabase/metabase/bin/release && clojure -M:test
no_output_timeout: 5m
no_output_timeout: 10m
########################################################################################################################
......@@ -663,15 +747,16 @@ jobs:
- attach-workspace
# This step is *really* slow, so we can skip it if yarn.lock hasn't changed since last time we ran it
- run-on-change:
cache-key: fe-deps-skip-{{ checksum "yarn.lock" }}
cache-key: fe-deps-{{ checksum "yarn.lock" }}
steps:
- restore-fe-deps-cache
- run:
name: Run yarn to install deps
command: SAUCE_CONNECT_DOWNLOAD_ON_INSTALL=true yarn;
no_output_timeout: 5m
no_output_timeout: 10m
- save_cache:
key: fe-deps-v5-{{ checksum "yarn.lock" }}
name: Cache frontend dependencies
<<: *CacheKeyFrontendDeps
paths:
- /home/circleci/.yarn
- /home/circleci/.yarn-cache
......@@ -756,29 +841,24 @@ jobs:
# need to rebuild them.
cache-key: drivers-{{ checksum ".MODULES-CHECKSUMS" }}-{{ checksum ".BACKEND-CHECKSUMS" }}
steps:
- restore-be-deps-cache
# restore the local maven installation of Metabase which is needed for building drivers
- restore-be-deps-cache #
- restore_cache:
keys:
- metabase-core-{{ checksum ".BACKEND-CHECKSUMS" }}
# restore already-built drivers
<<: *CacheKeyMetabaseCore
- restore_cache:
keys:
- drivers-v5-{{ checksum ".MODULES-CHECKSUMS" }}-{{ checksum ".BACKEND-CHECKSUMS" }}
- drivers-v5-{{ checksum ".MODULES-CHECKSUMS" }}
- drivers-v5-
name: Restore cached drivers uberjars from previous runs
<<: *CacheKeyDrivers_WithFallbackKeys
- run:
name: Build drivers if needed for cache key drivers-v5-{{ checksum ".MODULES-CHECKSUMS" }}-{{ checksum ".BACKEND-CHECKSUMS" }}
command: ./bin/build-drivers.sh
no_output_timeout: 5m
# Cache the maven installation of metabase-core
no_output_timeout: 10m
- save_cache:
key: metabase-core-{{ checksum ".BACKEND-CHECKSUMS" }}
name: Cache local Maven installation of metabase-core
<<: *CacheKeyMetabaseCore
paths:
- /home/circleci/.m2/repository/metabase-core
# Cache the built drivers
- save_cache:
key: drivers-v5-{{ checksum ".MODULES-CHECKSUMS" }}-{{ checksum ".BACKEND-CHECKSUMS" }}
name: Cache the built drivers
<<: *CacheKeyDrivers
paths:
- /home/circleci/metabase/metabase/modules/drivers/bigquery/target
- /home/circleci/metabase/metabase/modules/drivers/druid/target
......@@ -810,10 +890,10 @@ jobs:
environment:
MB_EDITION: << parameters.edition >>
command: ./bin/build version frontend
no_output_timeout: 5m
# Cache the built frontend
no_output_timeout: 10m
- save_cache:
key: frontend-v4-<< parameters.edition >>-{{ checksum ".FRONTEND-CHECKSUMS" }}
name: Cache the built frontend
<<: *CacheKeyFrontend
paths:
- /home/circleci/metabase/metabase/resources/frontend_client
......@@ -827,10 +907,9 @@ jobs:
- run-on-change:
cache-key: uberjar-<< parameters.edition >>-{{ checksum ".BACKEND-CHECKSUMS" }}-{{ checksum ".FRONTEND-CHECKSUMS" }}
steps:
# restore already-built uberjar
- restore_cache:
keys:
- uberjar-v5-<< parameters.edition >>-{{ checksum ".BACKEND-CHECKSUMS" }}-{{ checksum ".FRONTEND-CHECKSUMS" }}
name: Restore cached uberjar from previous runs
<<: *CacheKeyUberjar
- run:
name: Skip rest of job if uberjar already exists
command: |
......@@ -838,13 +917,12 @@ jobs:
circleci-agent step halt
fi
- restore-be-deps-cache
# restore drivers & FE client build in previous steps.
- restore_cache:
keys:
- drivers-v5-{{ checksum ".MODULES-CHECKSUMS" }}-{{ checksum ".BACKEND-CHECKSUMS" }}
name: Restore cached drivers built by previous step
<<: *CacheKeyDrivers
- restore_cache:
keys:
- frontend-v4-<< parameters.edition >>-{{ checksum ".FRONTEND-CHECKSUMS" }}
name: Restore cached FE built by previous step
<<: *CacheKeyFrontend
- run:
name: Build uberjar
environment:
......@@ -857,9 +935,9 @@ jobs:
path: /home/circleci/metabase/metabase/target/uberjar/metabase.jar
- store_artifacts:
path: /home/circleci/metabase/metabase/resources/version.properties
# Cache the built uberjar & version.properties
- save_cache:
key: uberjar-v5-<< parameters.edition >>-{{ checksum ".BACKEND-CHECKSUMS" }}-{{ checksum ".FRONTEND-CHECKSUMS" }}
name: Cache the built uberjar & version.properties
<<: *CacheKeyUberjar
paths:
- /home/circleci/metabase/metabase/target/uberjar/metabase.jar
- /home/circleci/metabase/metabase/resources/version.properties
......@@ -896,8 +974,8 @@ jobs:
command-name: Run Cypress tests
before-steps:
- restore_cache:
keys:
- uberjar-v5-<< parameters.edition >>-{{ checksum ".BACKEND-CHECKSUMS" }}-{{ checksum ".FRONTEND-CHECKSUMS" }}
name: Restore cached uberjar built in previous step
<<: *CacheKeyUberjar
command: |
run test-cypress-no-build <<# parameters.only-single-database >> --testFiles << parameters.test-files-location >> <</ parameters.only-single-database >>
after-steps:
......@@ -913,6 +991,7 @@ jobs:
default: clojure-and-node
cypress-group:
type: string
<<: *Params
executor: << parameters.e >>
environment:
CYPRESS_GROUP: << parameters.cypress-group >>
......@@ -923,8 +1002,8 @@ jobs:
command: run test-cypress-smoketest
before-steps:
- restore_cache:
keys:
- uberjar-oss-{{ checksum ".BACKEND-CHECKSUMS" }}
name: Restore cached uberjar built in previous step
<<: *CacheKeyUberjar
- run:
name: Generate version file
command: ./bin/build version
......@@ -1141,7 +1220,7 @@ workflows:
requires:
- be-tests-ee
driver: snowflake
timeout: 15m
timeout: 110m
- test-driver:
name: be-tests-sparksql-ee
......
#!/usr/bin/env bash
# Determines whether we should skip tests for a driver, usage:
#
# ./.circleci/skip-driver-tests.sh oracle
set -euo pipefail
driver="$1"
commit_message=`cat commit.txt`
if [[ "$CIRCLE_BRANCH" =~ ^master|release-.+$ ]]; then
is_master_or_release_branch=true;
else
is_master_or_release_branch=false;
fi
# ALWAYS run driver tests for master or release branches.
if [ "$is_master_or_release_branch" = true ]; then
echo "Running drivers tests: this is master or a release-* branch"
exit 1;
else
echo "Branch is NOT master or a release-* branch"
fi
if [[ "$commit_message" == *"[ci all]"* ]]; then
has_ci_drivers_commit_message=true;
elif [[ "$commit_message" == *"[ci drivers]"* ]]; then
has_ci_drivers_commit_message=true;
elif [[ "$commit_message" == *"[ci $driver]"* ]]; then
has_ci_drivers_commit_message=true;
else
has_ci_drivers_commit_message=false;
fi
# ALWAYS run driver tests if the commit includes [ci all], [ci drivers], or [ci <driver>]
if [ "$has_ci_drivers_commit_message" = true ]; then
echo "Running driver tests: commit message includes [ci all], [ci drivers], or [ci $driver]"
exit 2;
else
echo "Commit message does NOT include [ci all], [ci drivers], or [ci $driver]"
fi
if [[ "$commit_message" == *"[ci quick]"* ]]; then
has_ci_quick_message=true;
else
has_ci_quick_message=false;
fi
if [ -f "$driver.success" ]; then
tests_already_passed=true;
else
tests_already_passed=false;
fi
# If tests have already passed for this set of backend changes, we can skip tests.
# If tests have not yet passed, run driver tests *unless* the commit includes [ci quick]
if [ "$tests_already_passed" = true ]; then
echo "Not running driver tests: tests have already passed for current backend source"
exit 0
else
echo "Tests have not yet passed for current backend source"
if [ "$has_ci_quick_message" = true ]; then
echo "Not running driver tests: commit message includes [ci quick]"
exit 0;
else
echo "Running driver tests: commit message does not include [ci quick] "
exit 3;
fi
fi
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment