canvas-lms/bin/wip_open_source_lint.sh

172 lines
4.0 KiB
Bash
Executable File

#!/usr/bin/env bash
# open_source_lint.sh is designed to run the linters in the same way as Jenkins.
# rspect/hudson_setup_functions.sh has been modified to run standalone.
#
# Use case is running the linters locally. Exit code isn't propagated correctly for CI.
#
# Comment/uncomment the desired linter tasks in 'function build_tasklist'
#
# To run, install the Ruby and nodejs dependencies:
# bundle install
# yarn
#
# As of March 12, 2018. Recommended versions: node 8.10.0, Yarn 1.5.1
function red {
echo -e "\033[31m$1\033[0m"
}
function green {
echo -e "\033[32m$1\033[0m"
}
function i18n_check {
bundle exec gergich capture i18nliner "rake i18n:check"
}
function test_migrations {
unset PUSH_DOCKER_VOLUME_ARCHIVE
unset PUBLISH_DOCKER_ARTIFACTS
run_task run_snapshot_migrations &
snapshot_pid=$!
run_task run_full_migrations &
full_pid=$!
wait $snapshot_pid || { echo "ERROR: Snapshotted migrations failed!"; return 1; }
wait $full_pid || { echo "ERROR: Full migrations failed!"; return 1; }
diff -U 10 /tmp/canvas_structure.sql /tmp/canvasfull_structure.sql || {
echo "ERROR: snapshotted and full migrations resulted in a different schema!";
return 1;
}
}
function eslint {
bundle exec ruby script/eslint
}
function lint_commit_message {
bundle exec script/lint_commit_message
}
function rebase_checker {
master_bouncer check
}
function rlint {
bundle exec ruby script/rlint
}
function stylelint {
bundle exec ruby script/stylelint
}
function tatl_tael {
bundle exec ruby script/tatl_tael
}
function xsslint {
gergich capture custom:./build/gergich/xsslint:Gergich::XSSLint \
"node script/xsslint.js"
}
function run_brakeman {
bundle exec ruby script/brakeman
}
function build_tasklist {
echo "Building tasklist..."
build_spec_tasklist=() # if there are multiple, they will run in parallel
# if [[ "$BUILD_LINT" == "1" ]]; then
# build_spec_tasklist+=("i18n_check") # works. requires yarn deps
# build_spec_tasklist+=("test_migrations") # errors. missing functions.
build_spec_tasklist+=("eslint") # works
build_spec_tasklist+=("lint_commit_message") # works
# build_spec_tasklist+=("rebase_checker") # requires MASTER_BOUNCER_KEY
build_spec_tasklist+=("rlint") # works
build_spec_tasklist+=("stylelint") # works
build_spec_tasklist+=("tatl_tael") # works
# build_spec_tasklist+=("xsslint") # works. lots of XSS errors on master.
# build_spec_tasklist+=("run_brakeman") # works. kind of slow.
# build_spec_tasklist+=("graphQL_schema_check") # requires config/database.yml
}
function run_all_tasks {
build_tasklist
echo "Starting tasks..."
run_parallel_tasks "${build_spec_tasklist[@]}" || :
}
function run_parallel_tasks {
tasks=("$@")
# these will run in parallel
task_pids=()
for task in "${tasks[@]}"; do
run_task $task &
task_pids+=($!)
done
for i in "${!task_pids[@]}"; do
task_pid=${task_pids[$i]}
last_status=0
wait $task_pid || last_status=$?
[[ $last_status != 0 ]] && failed_tasks+=("${tasks[$i]}")
let "exit_status=exit_status?exit_status:$last_status" || :
done
return $exit_status
}
function run_task {
exit_on_failure=0 log_and_run_command "$@"
}
# ah the hoops we have to jump through to prefix stdout, w/o necessarily
# running our command in a subshell (if a bash function) :P
function log_and_run_command {
command="$@"
last_status=0
echo "$command"
eval '$command; last_status=$?'
if [[ $last_status != 0 ]]; then
echo `red "$command: FAILED! (exit code $last_status)"`
else
echo `green "$command: OK"`
fi
echo "$command: FINISHED"
return $last_status
}
run_all_tasks
# # Sample Travis CI config
#
# language: ruby
# sudo: false
# cache:
# bundler: true
# yarn: true
# directories:
# - vendor/bundle
# - node_modules
#
# rvm:
# - 2.4.3
#
# notifications:
# email: false
#
# before_install:
# - sudo apt-get update -qq
# - sudo apt-get install -qq libxmlsec1-dev
#
# script: './open_source_lint.sh'