From ed6e1c3825a4865588b599b32aed337c3927fd33 Mon Sep 17 00:00:00 2001
From: David Taylor <david@taylorhq.com>
Date: Tue, 22 Aug 2017 13:47:29 +0100
Subject: [PATCH] Combine docker:lint and docker:test into one command

---
 lib/tasks/docker.rake | 148 +++++++++++++++++++++---------------------
 script/docker_test.rb |   8 +--
 2 files changed, 75 insertions(+), 81 deletions(-)

diff --git a/lib/tasks/docker.rake b/lib/tasks/docker.rake
index b60e90d1f0b..e506eed2735 100644
--- a/lib/tasks/docker.rake
+++ b/lib/tasks/docker.rake
@@ -2,6 +2,8 @@
 # running it anywhere else will likely fail
 #
 # Environment Variables (specific to this rake task)
+# => SKIP_LINT                 set to 1 to skip linting (eslint and rubocop)
+# => SKIP_TESTS                set to 1 to skip all tests
 # => SKIP_CORE                 set to 1 to skip core tests (rspec and qunit)
 # => SKIP_PLUGINS              set to 1 to skip plugin tests (rspec and qunit)
 # => INSTALL_OFFICIAL_PLUGINS  set to 1 to install all core plugins before running tests
@@ -14,8 +16,6 @@
 # Other useful environment variables (not specific to this rake task)
 # => COMMIT_HASH    used by the discourse_test docker image to load a specific commit of discourse
 #                   this can also be set to a branch, e.g. "origin/tests-passed"
-# => SKIP_LINT      if using the discourse_test docker image, this will skip the docker:test task, and only run the docker:lint task
-# => LINT_ONLY      if using the discourse_test docker image, this will skip the docker:lint task, and only run the docker:test task
 #
 # Example usage:
 #   Run all core and plugin tests:
@@ -33,97 +33,95 @@ def run_or_fail(command)
   $?.exitstatus == 0
 end
 
-desc 'Run JS and Ruby linters'
-task 'docker:lint' do
-  success = true
-
-  if ENV["SINGLE_PLUGIN"]
-    success &&= run_or_fail("bundle exec rubocop --parallel plugins/#{ENV["SINGLE_PLUGIN"]}")
-    success &&= run_or_fail("eslint --ext .es6 plugins/#{ENV['SINGLE_PLUGIN']}")
-  else
-    success &&= run_or_fail("bundle exec rubocop --parallel") unless ENV["SKIP_CORE"]
-    success &&= run_or_fail("eslint app/assets/javascripts test/javascripts") unless ENV["SKIP_CORE"]
-    success &&= run_or_fail("eslint --ext .es6 app/assets/javascripts test/javascripts plugins") unless ENV["SKIP_PLUGINS"]
-  end
-
-  exit 1 if !success
-end
-
 desc 'Run all tests (JS and code in a standalone environment)'
 task 'docker:test' do
   begin
-
-    puts "Cleaning up old test tmp data in tmp/test_data"
-    `rm -fr tmp/test_data && mkdir -p tmp/test_data/redis && mkdir tmp/test_data/pg`
-
-    puts "Starting background redis"
-    @redis_pid = Process.spawn('redis-server --dir tmp/test_data/redis')
-
-    @postgres_bin = "/usr/lib/postgresql/9.5/bin/"
-    `#{@postgres_bin}initdb -D tmp/test_data/pg`
-
-    # speed up db, never do this in production mmmmk
-    `echo fsync = off >> tmp/test_data/pg/postgresql.conf`
-    `echo full_page_writes = off >> tmp/test_data/pg/postgresql.conf`
-    `echo shared_buffers = 500MB >> tmp/test_data/pg/postgresql.conf`
-
-    puts "Starting postgres"
-    @pg_pid = Process.spawn("#{@postgres_bin}postmaster -D tmp/test_data/pg")
-
-    ENV["RAILS_ENV"] = "test"
-
-    @good = run_or_fail("bundle exec rake db:create db:migrate")
-
-    if ENV["INSTALL_OFFICIAL_PLUGINS"]
-      @good &&= run_or_fail("bundle exec rake plugin:install_all_official")
+    @good = true
+    unless ENV['SKIP_LINT']
+      puts "Running linters"
+      if ENV["SINGLE_PLUGIN"]
+        @good &&= run_or_fail("bundle exec rubocop --parallel plugins/#{ENV["SINGLE_PLUGIN"]}")
+        @good &&= run_or_fail("eslint --ext .es6 plugins/#{ENV['SINGLE_PLUGIN']}")
+      else
+        @good &&= run_or_fail("bundle exec rubocop --parallel") unless ENV["SKIP_CORE"]
+        @good &&= run_or_fail("eslint app/assets/javascripts test/javascripts") unless ENV["SKIP_CORE"]
+        @good &&= run_or_fail("eslint --ext .es6 app/assets/javascripts test/javascripts plugins") unless ENV["SKIP_PLUGINS"]
+      end
     end
 
-    unless ENV["JS_ONLY"]
+    unless ENV['SKIP_TESTS']
+      puts "Cleaning up old test tmp data in tmp/test_data"
+      `rm -fr tmp/test_data && mkdir -p tmp/test_data/redis && mkdir tmp/test_data/pg`
 
-      unless ENV["SKIP_CORE"]
-        params = []
-        if ENV["BISECT"]
-          params << "--bisect"
-        end
-        if ENV["RSPEC_SEED"]
-          params << "--seed #{ENV["RSPEC_SEED"]}"
-        end
-        @good &&= run_or_fail("bundle exec rspec #{params.join(' ')}".strip)
+      puts "Starting background redis"
+      @redis_pid = Process.spawn('redis-server --dir tmp/test_data/redis')
+
+      @postgres_bin = "/usr/lib/postgresql/9.5/bin/"
+      `#{@postgres_bin}initdb -D tmp/test_data/pg`
+
+      # speed up db, never do this in production mmmmk
+      `echo fsync = off >> tmp/test_data/pg/postgresql.conf`
+      `echo full_page_writes = off >> tmp/test_data/pg/postgresql.conf`
+      `echo shared_buffers = 500MB >> tmp/test_data/pg/postgresql.conf`
+
+      puts "Starting postgres"
+      @pg_pid = Process.spawn("#{@postgres_bin}postmaster -D tmp/test_data/pg")
+
+      ENV["RAILS_ENV"] = "test"
+
+      @good &&= run_or_fail("bundle exec rake db:create db:migrate")
+
+      if ENV["INSTALL_OFFICIAL_PLUGINS"]
+        @good &&= run_or_fail("bundle exec rake plugin:install_all_official")
       end
 
-      unless ENV["SKIP_PLUGINS"]
-        if ENV["SINGLE_PLUGIN"]
-          @good &&= run_or_fail("bundle exec rake plugin:spec['#{ENV["SINGLE_PLUGIN"]}']")
-        else
-          @good &&= run_or_fail("bundle exec rake plugin:spec")
+      unless ENV["JS_ONLY"]
+
+        unless ENV["SKIP_CORE"]
+          params = []
+          if ENV["BISECT"]
+            params << "--bisect"
+          end
+          if ENV["RSPEC_SEED"]
+            params << "--seed #{ENV["RSPEC_SEED"]}"
+          end
+          @good &&= run_or_fail("bundle exec rspec #{params.join(' ')}".strip)
         end
-      end
 
-    end
-
-    unless ENV["RUBY_ONLY"]
-      unless ENV["SKIP_CORE"]
-        @good &&= run_or_fail("bundle exec rake qunit:test['600000']")
-        @good &&= run_or_fail("bundle exec rake qunit:test['600000','/wizard/qunit']")
-      end
-
-      unless ENV["SKIP_PLUGINS"]
-        if ENV["SINGLE_PLUGIN"]
-          @good &&= run_or_fail("bundle exec rake plugin:qunit['#{ENV['SINGLE_PLUGIN']}','600000']")
-        else
-          @good &&= run_or_fail("bundle exec rake plugin:qunit['*','600000']")
+        unless ENV["SKIP_PLUGINS"]
+          if ENV["SINGLE_PLUGIN"]
+            @good &&= run_or_fail("bundle exec rake plugin:spec['#{ENV["SINGLE_PLUGIN"]}']")
+          else
+            @good &&= run_or_fail("bundle exec rake plugin:spec")
+          end
         end
+
       end
 
+      unless ENV["RUBY_ONLY"]
+        unless ENV["SKIP_CORE"]
+          @good &&= run_or_fail("bundle exec rake qunit:test['600000']")
+          @good &&= run_or_fail("bundle exec rake qunit:test['600000','/wizard/qunit']")
+        end
+
+        unless ENV["SKIP_PLUGINS"]
+          if ENV["SINGLE_PLUGIN"]
+            @good &&= run_or_fail("bundle exec rake plugin:qunit['#{ENV['SINGLE_PLUGIN']}','600000']")
+          else
+            @good &&= run_or_fail("bundle exec rake plugin:qunit['*','600000']")
+          end
+        end
+
+      end
     end
 
   ensure
     puts "Terminating"
 
-    Process.kill("TERM", @redis_pid)
-    Process.kill("TERM", @pg_pid)
-    Process.wait @redis_pid
-    Process.wait @pg_pid
+    Process.kill("TERM", @redis_pid) if @redis_pid
+    Process.kill("TERM", @pg_pid) if @pg_pid
+    Process.wait @redis_pid if @redis_pid
+    Process.wait @pg_pid if @pg_pid
   end
 
   if !@good
diff --git a/script/docker_test.rb b/script/docker_test.rb
index ca31564cbf8..a4b9a6aabe7 100644
--- a/script/docker_test.rb
+++ b/script/docker_test.rb
@@ -2,10 +2,7 @@
 # Available environment variables:
 # => COMMIT_HASH    used by the discourse_test docker image to load a specific commit of discourse
 #                   this can also be set to a branch, e.g. "origin/tests-passed"
-# => SKIP_LINT      if using the discourse_test docker image, this will skip the docker:test task, and only run the docker:lint task
-# => LINT_ONLY      if using the discourse_test docker image, this will skip the docker:lint task, and only run the docker:test task
-#
-# See lib/tasks/docker.rake for other available environment variables
+# See lib/tasks/docker.rake for more information
 
 def run_or_fail(command)
   pid = Process.spawn(command)
@@ -21,5 +18,4 @@ unless ENV['NO_UPDATE']
   run_or_fail("bundle")
 end
 
-run_or_fail("bundle exec rake docker:lint") if !ENV["SKIP_LINT"]
-run_or_fail("bundle exec rake docker:test") if !ENV["LINT_ONLY"]
+run_or_fail("bundle exec rake docker:test")