503 строки
26 KiB
Ruby
503 строки
26 KiB
Ruby
#-------------------------------------------------------------------------
|
|
# # Copyright (c) Microsoft and contributors. All rights reserved.
|
|
#
|
|
# 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.
|
|
#--------------------------------------------------------------------------
|
|
|
|
#
|
|
# This rakefile consists of several tasks. This section will provide an overview of the
|
|
# tasks and their dependencies.
|
|
#
|
|
# -------------------------------------------------------------------------------------------------------------------------------------------
|
|
# | No | Task | Description |
|
|
# |----|---------------------------------|--------------------------------------------------------------------------------------------------|
|
|
# | 1 | regen | Regenerates all the SDK versions for all the services and all the profiles for all the services. |
|
|
# | | | This task has regen_sdk_versions and regen_all_profiles as prereqs. |
|
|
# |----|---------------------------------|--------------------------------------------------------------------------------------------------|
|
|
# | 2 | regen_sdk_versions | Regenerates all the SDK versions for all the services. At the end, this task calls |
|
|
# | | | regen_individual_require_files as an enhancement. This task has clean_generated as prereq. This |
|
|
# |. |. | task is focused on code generation using autorest and will generate api versions as indicated in |
|
|
# | | |.in the config.json file. |
|
|
# |----|---------------------------------|--------------------------------------------------------------------------------------------------|
|
|
# | 3 | regen_all_profiles | Regenerates all the profiles for all the services. This task has regen_rollup_profile and |
|
|
# | | | regen_individual_profiles as prereqs. This task uses the profile_generator to generate the |
|
|
# | | | with inputs from profiles.json and dir_metadata.json. |
|
|
# |----|---------------------------------|--------------------------------------------------------------------------------------------------|
|
|
# | 4 | clean_generated | Cleans all the generated folders in multiple SDK versions. |
|
|
# |----|---------------------------------|--------------------------------------------------------------------------------------------------|
|
|
# | 5 | regen_rollup_profile | Regenerates all profiles within the rollup gem. At the end, this task calls |
|
|
# | | | regen_rollup_require_files as an enhancement. This task has clean_rollup_profiles as prereq. This|
|
|
#.|. | | task requires correct definition of rollup profiles in profiles.json file. |
|
|
# |----|---------------------------------|--------------------------------------------------------------------------------------------------|
|
|
# | 6 | regen_individual_profiles | Regenerates all profiles with all the services. At the end, this task calls |
|
|
# | | | regen_individual_require_files as an enhancement. This task calls clean_individual_profiles |
|
|
# | | | as prereq. This task requires correct definition of individual profiles in profiles.json file. |
|
|
# |----|---------------------------------|--------------------------------------------------------------------------------------------------|
|
|
# | 7 | clean_all_profiles | Cleans all profiles inside the rollup gem and individual gems.This task has clean_rollup_profiles|
|
|
# | | | and clean_individual_profiles as prereqs. |
|
|
# |----|---------------------------------|--------------------------------------------------------------------------------------------------|
|
|
# | 8 | clean_rollup_profiles | Cleans all profiles inside the rollup gem. |
|
|
# |----|---------------------------------|--------------------------------------------------------------------------------------------------|
|
|
# | 9 | clean_individual_profiles | Cleans all profiles inside individual gems. |
|
|
# |----|---------------------------------|--------------------------------------------------------------------------------------------------|
|
|
# | 10 | regen_all_require_files | Regenerates the require files for the rollup gem and individual gems. This task has |
|
|
# | | | regen_rollup_require_files and regen_individual_require_files as prereqs. A require file is the |
|
|
# | | | base file for a gem which includes other file. A sample could be found here: |
|
|
# |. | | https://github.com/Azure/azure-sdk-for-ruby/blob/master/azure_sdk/lib/azure_sdk.rb |
|
|
# |----|---------------------------------|--------------------------------------------------------------------------------------------------|
|
|
# | 11 | regen_rollup_require_files | Regenerates the require files for the rollup gem |
|
|
# |----|---------------------------------|--------------------------------------------------------------------------------------------------|
|
|
# | 12 | regen_individual_require_files | Regenerates the require files for the individual gems |
|
|
# |----|---------------------------------|--------------------------------------------------------------------------------------------------|
|
|
# | 13 | release | Release gems. This task has build as a prereq. The gems to be released must be indicated in the |
|
|
# |. | | GEMS_TO_RELEASE file. |
|
|
# |----|---------------------------------|--------------------------------------------------------------------------------------------------|
|
|
# | 14 | build | Builds all gems. This task has clean as a prereq. |
|
|
# |----|---------------------------------|--------------------------------------------------------------------------------------------------|
|
|
# | 15 | clean | Cleans the pks folder inside all the gems. |
|
|
# |----|---------------------------------|--------------------------------------------------------------------------------------------------|
|
|
# | 16 | bundle:update | Performs bundle update for all gems. |
|
|
# |----|---------------------------------|--------------------------------------------------------------------------------------------------|
|
|
# | 17 | spec | Executes tests for all gems. |
|
|
# -------------------------------------------------------------------------------------------------------------------------------------------
|
|
#
|
|
# regen
|
|
# |
|
|
# -----------------------------------------------------------------------------------------------------
|
|
# | |
|
|
# regen_sdk_versions -->enhancement--> regen_individual_require_files |
|
|
# | regen_all_profiles
|
|
# | |
|
|
# clean_generated ------------------------------------------------------------------------------------------------------------------------------
|
|
# | |
|
|
# | |
|
|
# | |
|
|
# | |
|
|
# | regen_all_require_files |
|
|
# | | |
|
|
# | ----------------------------------------- |
|
|
# | | | |
|
|
# | | | |
|
|
# | | | |
|
|
# regen_rollup_profile -->enhancement--> regen_rollup_require_files | |
|
|
# | | |
|
|
# | | |
|
|
# | | |
|
|
# | | |
|
|
# | | |
|
|
# | | |
|
|
# | regen_individual_require_files<--enhancement<--regen_individual_profiles
|
|
# | |
|
|
# | clean_all_profiles |
|
|
# | | |
|
|
# | --------------------------------------------------------------------------------------------------------------- |
|
|
# | | | |
|
|
# | | | |
|
|
# clean_rollup_profiles clean_individual_profiles
|
|
#
|
|
# release
|
|
# |
|
|
# build
|
|
# |
|
|
# clean
|
|
#
|
|
# bundle:update
|
|
#
|
|
# spec
|
|
#
|
|
|
|
require 'dotenv/tasks'
|
|
require 'rspec/core/rake_task'
|
|
require 'open3'
|
|
require 'os'
|
|
require 'json'
|
|
require 'fileutils'
|
|
|
|
def get_config_files_folder
|
|
"#{__dir__}/config"
|
|
end
|
|
|
|
gem_versions = JSON.parse(File.read(File.expand_path("#{get_config_files_folder}/GEM_VERSIONS", __FILE__)).strip)
|
|
gems_to_release = JSON.parse(File.read(File.expand_path("#{get_config_files_folder}/GEMS_TO_RELEASE", __FILE__)).strip)
|
|
GEMS_TO_IGNORE = %w{azure_mgmt_graph, azure_mgmt_mobile_engagement, azure_mgmt_server_management}
|
|
REGEN_EXCLUDES = ['azure_sdk']
|
|
|
|
desc 'Azure Resource Manager related tasks which often traverse each of the arm gems'
|
|
namespace :arm do
|
|
desc 'Delete ./pkg for each of the Azure Resource Manager projects'
|
|
task :clean, [:gem_name] do |_, args|
|
|
each_gem do |dir|
|
|
if !should_i_continue(args[:gem_name], dir)
|
|
next
|
|
end
|
|
|
|
FileUtils.rm_rf('pkg')
|
|
end
|
|
end
|
|
|
|
desc 'Delete multiple version folders for each sdk'
|
|
task :clean_generated, [:gem_name] do |_, args|
|
|
clean_generated('management', args[:gem_name])
|
|
clean_generated('data', args[:gem_name])
|
|
Dir.chdir(File.expand_path('..', __FILE__))
|
|
end
|
|
|
|
desc 'Build gems for each of the Azure Resource Manager projects'
|
|
task :build, [:gem_name] => :clean do |_, args|
|
|
each_gem do |dir|
|
|
if !should_i_continue(args[:gem_name], dir)
|
|
next
|
|
end
|
|
|
|
execute_and_stream('rake build')
|
|
end
|
|
end
|
|
|
|
desc 'Push gem for each of the Azure projects'
|
|
task :release, [:key] => :build do |_, args|
|
|
gems_to_release.each do |key, gems|
|
|
gems.each do |gem|
|
|
if(key == 'rollup')
|
|
Dir.chdir("#{__dir__}/azure_sdk")
|
|
version = gem_versions['rollup'][gem]
|
|
elsif(key == 'management')
|
|
Dir.chdir("#{__dir__}/management/#{gem}")
|
|
version = gem_versions['management'][gem]
|
|
elsif(key == 'data')
|
|
Dir.chdir("#{__dir__}/data/#{gem}")
|
|
version = gem_versions['data'][gem]
|
|
end
|
|
|
|
# Delay for 10 seconds before publishing gem
|
|
puts "Going to sleep for 10 seconds before publishing #{gem} ..."
|
|
sleep(10)
|
|
|
|
execute("gem push ./pkg/#{gem}-#{version}.gem" + (args[:key].nil? ? '' : " -k #{args[:key]}"))
|
|
end
|
|
end
|
|
end
|
|
|
|
desc 'Regen code for each sdk with all its api versions'
|
|
task :regen_sdk_versions, [:gem_name] => [:regen_folder_structure_if_required, :clean_generated] do |_, args|
|
|
json = get_config_file
|
|
each_gem do |dir| # dir corresponds to each azure_* folder
|
|
if REGEN_EXCLUDES.include?(dir.to_s)
|
|
update_gem_version('lib/azure_sdk/version.rb', gem_versions['rollup'][dir])
|
|
next
|
|
end
|
|
|
|
if !should_i_continue(args[:gem_name], dir)
|
|
next
|
|
end
|
|
|
|
mode = get_mode(dir)
|
|
|
|
puts "\nGenerating #{dir}\n"
|
|
ar_base_command = "#{ENV.fetch('AUTOREST_LOC', 'autorest')}"
|
|
ar_base_command = "#{ar_base_command} --use=#{ENV.fetch('AUTOREST_RUBY_LOC')}" unless ENV.fetch('AUTOREST_RUBY_LOC', nil).nil?
|
|
puts "ar_base_command #{ar_base_command}"
|
|
md = json[dir] # there should be an entry in the metadata for each of the api versions to generate
|
|
package_name = dir
|
|
md.each do |api_version_pkg, api_version_value|
|
|
ar_arguments = ''
|
|
output_folder = ''
|
|
api_version_value.each do |argument_name, argument_value|
|
|
if argument_name.casecmp("output-folder") == 0
|
|
output_folder = argument_value
|
|
else
|
|
if argument_name.casecmp("package-name") == 0
|
|
package_name = argument_value
|
|
else
|
|
if argument_name.casecmp("markdown") == 0
|
|
ar_arguments = ar_arguments + " #{argument_value}"
|
|
else
|
|
if argument_name.casecmp("input-file") == 0
|
|
input_files = argument_value.map {|file| "--input-file=#{file}"}
|
|
ar_arguments = ar_arguments + input_files.join(" ")
|
|
else
|
|
ar_arguments = ar_arguments + " --#{argument_name}=#{argument_value}"
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
command = "#{ar_base_command} --package-name=#{package_name} #{ar_arguments} --package-version=#{gem_versions[mode][dir]} --output-folder=#{File.join(Dir.pwd, 'lib', output_folder)} --ruby --azure-arm --version=V2"
|
|
execute_and_stream(command)
|
|
end
|
|
update_gem_version('lib/version.rb', gem_versions[mode][dir])
|
|
end
|
|
end
|
|
|
|
desc 'Bundler related helper'
|
|
namespace :bundle do
|
|
desc 'bundle update for each of the Azure Resource Manager projects'
|
|
task :update, [:gem_name] do |_, args|
|
|
each_gem do
|
|
if !should_i_continue(args[:gem_name], dir)
|
|
next
|
|
end
|
|
|
|
execute_and_stream('bundle update')
|
|
end
|
|
end
|
|
end
|
|
|
|
desc 'run specs for each of the Azure Resource Manager projects'
|
|
task :spec, [:gem_name] => :dotenv do |_, args|
|
|
each_gem do |gem_dir|
|
|
if !should_i_continue(args[:gem_name], gem_dir)
|
|
next
|
|
end
|
|
|
|
puts "Executing spec on #{gem_dir}"
|
|
execute_and_stream('bundle install')
|
|
execute_and_stream('bundle exec rspec')
|
|
end
|
|
end
|
|
|
|
desc 'Clean Rollup Profiles'
|
|
task :clean_rollup_profiles do
|
|
Dir.chdir(File.expand_path('../azure_sdk/lib', __FILE__))
|
|
subdir_list = Dir['*'].reject{|o| not File.directory?(o)}
|
|
subdir_list.each do |subdir|
|
|
if subdir != 'azure_sdk'
|
|
folder_to_be_cleaned = File.expand_path("../azure_sdk/lib/#{subdir}", __FILE__)
|
|
puts "Cleaning folder - #{folder_to_be_cleaned}"
|
|
FileUtils.rm_rf(folder_to_be_cleaned)
|
|
end
|
|
end
|
|
end
|
|
|
|
desc 'Clean Individual Profiles'
|
|
task :clean_individual_profiles, [:gem_name] do |_, args|
|
|
each_gem_dir do |gem|
|
|
if !should_i_continue(args[:gem_name], gem)
|
|
next
|
|
end
|
|
|
|
if REGEN_EXCLUDES.include?gem
|
|
next
|
|
end
|
|
|
|
mode = get_mode(gem)
|
|
Dir.chdir("#{__dir__}/#{mode}/#{gem}/lib/profiles")
|
|
|
|
subdir_list = Dir['*'].reject{|o| not File.directory?(o)}
|
|
subdir_list.each do |subdir|
|
|
folder_to_be_cleaned = "#{__dir__}/#{mode}/#{gem}/lib/profiles/#{subdir}"
|
|
puts "Cleaning folder - #{folder_to_be_cleaned}"
|
|
FileUtils.rm_rf(folder_to_be_cleaned)
|
|
end
|
|
end
|
|
end
|
|
|
|
desc 'Clean All profiles'
|
|
task :clean_all_profiles, [:gem_name] => [:clean_rollup_profiles, :clean_individual_profiles] do
|
|
puts 'Cleaned all profiles'
|
|
end
|
|
|
|
desc 'Regen rollup profiles'
|
|
task :regen_rollup_profile => :clean_rollup_profiles do
|
|
Dir.chdir(__dir__)
|
|
# Sample Command
|
|
# bundle exec ruby profile_generator_client.rb --dir_metadata=dir_metadata.json --profile=profiles.json --mode=rollup --key=azure_sdk
|
|
command = "#{get_base_profile_generation_cmd} --dir_metadata=#{get_config_files_folder}/dir_metadata.json --profile=#{get_config_files_folder}/profiles.json --mode=rollup --key=azure_sdk --sdk_path=#{__dir__}"
|
|
execute_and_stream(command)
|
|
end
|
|
|
|
desc 'Regen individual profiles'
|
|
task :regen_individual_profiles, [:gem_name] => :clean_individual_profiles do |_, args|
|
|
each_gem_dir do |gem|
|
|
if !should_i_continue(args[:gem_name], gem)
|
|
next
|
|
end
|
|
|
|
if REGEN_EXCLUDES.include?gem
|
|
next
|
|
end
|
|
mode = get_mode(gem)
|
|
|
|
# Sample Command
|
|
# bundle exec ruby profile_generator_client.rb --dir_metadata=dir_metadata.json --profile=authorization_profiles.json --mode=management --key=azure_mgmt_authorization
|
|
command = "#{get_base_profile_generation_cmd} --dir_metadata=#{get_config_files_folder}/dir_metadata.json --profile=#{get_config_files_folder}/profiles.json --mode=#{mode} --key=#{gem} --sdk_path=#{__dir__}"
|
|
execute_and_stream(command)
|
|
end
|
|
end
|
|
|
|
desc 'Generate individual require files'
|
|
task :regen_individual_require_files, [:gem_name] do |_, args|
|
|
key = args[:gem_name].nil? ? '*' : args[:gem_name]
|
|
command = "bundle exec ruby #{__dir__}/generators/requirefilegen/src/require_file_generator.rb --mode=individual --sdk_path=#{__dir__} --gem_name=#{key}"
|
|
execute_and_stream(command)
|
|
end
|
|
|
|
desc 'Generate rollup require files'
|
|
task :regen_rollup_require_files do
|
|
command = "bundle exec ruby #{__dir__}/generators/requirefilegen/src/require_file_generator.rb --mode=rollup --sdk_path=#{__dir__} --gem_name=azure_sdk"
|
|
execute_and_stream(command)
|
|
end
|
|
|
|
task :regen_folder_structure_if_required, [:gem_name] do |_, args|
|
|
if args[:gem_name] && !REGEN_EXCLUDES.include?(args[:gem_name])
|
|
plane = 'data'
|
|
if(args[:gem_name].include?'_mgmt_')
|
|
plane = 'management'
|
|
end
|
|
command = "ruby #{__dir__}/generators/metadatagen/src/metadatagen.rb --plane=#{plane} --gem_name=#{args[:gem_name]} --sdk_path=#{__dir__}"
|
|
execute_and_stream(command)
|
|
end
|
|
end
|
|
|
|
desc 'Generate all require files'
|
|
task :regen_all_require_files, [:gem_name] => [:regen_individual_require_files, :regen_rollup_require_files] do
|
|
puts 'Generated all require files'
|
|
end
|
|
|
|
desc 'Regen all profiles'
|
|
task :regen_all_profiles, [:gem_name] => [:regen_rollup_profile, :regen_individual_profiles] do
|
|
puts 'Regenerated all profiles'
|
|
end
|
|
|
|
desc 'Regen all versions of sdk and profiles'
|
|
task :regen, [:gem_name] => [:regen_sdk_versions, :regen_all_profiles] do
|
|
puts 'Regenerated all versions of sdk and profiles'
|
|
end
|
|
end
|
|
|
|
Rake::Task['arm:regen_rollup_profile'].enhance do
|
|
Rake::Task['arm:regen_rollup_require_files'].invoke
|
|
Rake::Task['arm:regen_rollup_require_files'].reenable
|
|
end
|
|
|
|
Rake::Task['arm:regen_individual_profiles'].enhance do |_, args|
|
|
Rake::Task['arm:regen_individual_require_files'].invoke(args[:gem_name])
|
|
Rake::Task['arm:regen_individual_require_files'].reenable
|
|
end
|
|
|
|
Rake::Task['arm:regen_sdk_versions'].enhance do |_, args|
|
|
Rake::Task['arm:regen_individual_require_files'].invoke(args[:gem_name])
|
|
Rake::Task['arm:regen_individual_require_files'].reenable
|
|
end
|
|
|
|
task :default => :spec
|
|
|
|
def should_i_continue(key, dir)
|
|
return (key.nil? || key == dir)
|
|
end
|
|
|
|
def get_mode(dir)
|
|
mode = ''
|
|
if (dir.include? '_mgmt_')
|
|
mode = 'management'
|
|
else
|
|
mode = 'data'
|
|
end
|
|
mode
|
|
end
|
|
|
|
def clean_generated(parent_dir, key)
|
|
Dir.chdir(File.expand_path("../#{parent_dir}", __FILE__))
|
|
gem_folders = Dir['*'].reject{|o| not File.directory?(o)}
|
|
gem_folders.each do |gem|
|
|
if !should_i_continue(key, gem)
|
|
next
|
|
end
|
|
|
|
if GEMS_TO_IGNORE.include?gem
|
|
next
|
|
end
|
|
|
|
Dir.chdir(File.expand_path("../#{parent_dir}/#{gem}/lib", __FILE__))
|
|
subdir_list = Dir['*'].reject{|o| not File.directory?(o)}
|
|
subdir_list.each do |subdir|
|
|
if subdir.to_s == 'profiles'
|
|
next
|
|
end
|
|
|
|
folder_to_be_cleaned = File.expand_path("../#{parent_dir}/#{gem}/lib/#{subdir}", __FILE__)
|
|
puts "Cleaning folder - #{folder_to_be_cleaned}"
|
|
FileUtils.rm_rf(folder_to_be_cleaned)
|
|
end
|
|
end
|
|
end
|
|
|
|
def get_base_profile_generation_cmd
|
|
"bundle exec ruby #{__dir__}/generators/profilegen/src/profile_generator_client.rb"
|
|
end
|
|
|
|
def execute_and_stream(cmd)
|
|
puts "running: #{cmd}"
|
|
execute(cmd)
|
|
end
|
|
|
|
def execute(cmd)
|
|
Open3.popen2e(cmd) do |_, stdout_err, wait_thr|
|
|
while line = stdout_err.gets
|
|
puts line
|
|
end
|
|
|
|
exit_status = wait_thr.value
|
|
unless exit_status.success?
|
|
abort "FAILED !!!"
|
|
end
|
|
end
|
|
end
|
|
|
|
def get_config_file
|
|
config_file = File.read(File.expand_path("#{get_config_files_folder}/config.json", __FILE__))
|
|
JSON.parse(config_file)
|
|
end
|
|
|
|
def each_child
|
|
each_child_mode_specific('management') {|dir| yield dir }
|
|
each_child_mode_specific('data') {|dir| yield dir }
|
|
|
|
Dir.chdir(File.expand_path('../azure_sdk', __FILE__))
|
|
yield('azure_sdk')
|
|
end
|
|
|
|
def each_child_mode_specific(parent_dir, change_dir = true)
|
|
Dir.chdir(File.expand_path("../#{parent_dir}", __FILE__))
|
|
sub_dirs = Dir['*'].reject{|o| not File.directory?(o)}
|
|
sub_dirs.each do |dir|
|
|
if GEMS_TO_IGNORE.include?dir
|
|
next
|
|
end
|
|
|
|
if (change_dir)
|
|
Dir.chdir(dir) do
|
|
yield(dir)
|
|
end
|
|
else
|
|
yield dir
|
|
end
|
|
end
|
|
end
|
|
|
|
def each_gem
|
|
each_child do |dir|
|
|
gem_dir = dir.split('/').last
|
|
yield gem_dir
|
|
end
|
|
end
|
|
|
|
def each_gem_dir
|
|
each_child_mode_specific('management', false) {|dir| yield dir }
|
|
each_child_mode_specific('data', false) {|dir| yield dir }
|
|
end
|
|
|
|
def update_gem_version(version_file, new_version)
|
|
existing_contents = File.read(version_file)
|
|
content_to_replace = existing_contents.gsub(/VERSION = '.*'/, "VERSION = '#{new_version}'")
|
|
File.open(version_file, 'w') { |file| file.puts content_to_replace }
|
|
end
|