spec/e2e.rb (78 lines of code) (raw):

# Copyright 2015, Google, Inc. # Licensed 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. require "json" class E2E class << self def run? # Only run end-to-end tests when E2E environment variable is set to TRUE ENV["E2E"] == "true" end def check if @url.nil? test_dir = ENV["TEST_DIR"] if test_dir.nil? # we are missing arguments to deploy to e2e raise "cannot run e2e tests - missing required test_dir" end if @attempted # we've tried to run the tests and failed raise "cannot run e2e tests - deployment failed" end @attempted = true build_id = ENV["BUILD_ID"] deploy test_dir, build_id end end def deploy test_dir, build_id = nil build_id ||= rand 1000..9999 test_name = versionize test_dir version = "#{test_name}-#{build_id}" # read in our credentials file key_path = File.expand_path ENV["GOOGLE_APPLICATION_CREDENTIALS"], __FILE__ key_file = File.read key_path key_json = JSON.parse key_file account_name = key_json["client_email"] project_id = ENV["E2E_GOOGLE_CLOUD_PROJECT"] # authenticate with gcloud using our credentials file exec "gcloud config set project #{project_id}" exec "gcloud config set account #{account_name}" # deploy this test_dir to gcloud # try 3 times in case of intermittent deploy error app_yaml_path = File.expand_path "../../#{test_dir}/app.yaml", __FILE__ (0..3).each do |_attempt| exec "gcloud app deploy #{app_yaml_path} --version=#{version} -q --no-promote" break if $CHILD_STATUS.to_i.zero? end # if status is not 0, we tried 3 times and failed if $CHILD_STATUS.to_i != 0 output "Failed to deploy to gcloud" return $CHILD_STATUS.to_i end # sleeping 10 to ensure URL is callable sleep 10 # run the specs for the step, but use the remote URL @url = "https://#{version}-dot-#{project_id}.appspot.com" # return 0, no errors 0 end def cleanup test_dir, build_id = nil return nil unless ENV["E2E"] # determine build number build_id ||= ENV["BUILD_ID"] if build_id.nil? output "you must pass a build ID or define ENV[\"BUILD_ID\"]" return 1 end # run gcloud command exec "gcloud app versions list --format=\"value(version.id)\" --filter=\"version.id~#{build_id}$\" | xargs -r gcloud app versions delete --quiet" # return the result of the gcloud delete command if $CHILD_STATUS.to_i != 0 output "Failed to delete e2e version" return $CHILD_STATUS.to_i end # return 0, no errors 0 end def versionize name version_name = name.tr "^A-Za-z0-9", "" name_length = 7 random_char = ('a'..'z').to_a.shuffle[0,4].join "#{version_name[-name_length, name_length]}#{random_char}" || version_name end def url return unless run? check @url end def exec cmd output "> #{cmd}" output `#{cmd}` end def output line puts line end end end