Read azure devops assets from tarball

This commit is contained in:
Ethan Dennis
2022-09-14 11:27:10 -07:00
parent 424bada4f3
commit b1f13f800b
14 changed files with 34 additions and 1970 deletions
+34 -27
View File
@@ -1,15 +1,16 @@
#!/usr/bin/env ruby
require "date"
require "json"
require "net/http"
require "open3"
require "optparse"
require "pathname"
require "date"
require "tmpdir"
options = {
code_assets_dir: "code",
pipeline_assets_dir: "pipelines",
assets_file: "azure_devops.tgz",
root_dir: File.join(ENV["CODESPACE_VSCODE_FOLDER"], "azure_devops/bootstrap"),
forecast_source_file: File.join(".", "azure_devops/bootstrap/jobs.json")
forecast_source_file: "jobs.json"
}
OptionParser.new do |opt|
@@ -72,38 +73,42 @@ def create_repository(options)
repository = options[:project]
access_token = options[:access_token]
root_dir = options[:root_dir]
directories = [options[:code_assets_dir], options[:pipeline_assets_dir]]
assets_file = options[:assets_file]
puts "Creating repository #{repository}..."
uri = URI("https://dev.azure.com/#{organization}/#{project}/_apis/git/repositories/#{repository}/pushes?api-version=7.1-preview.2")
root = Pathname.new(root_dir)
repository_to_create = {
Dir.mktmpdir do |tmp_dir|
puts "Extracting assets..."
_, _, st = Open3.capture3("tar", "-xzf", File.join(root_dir, assets_file), "-C", tmp_dir)
abort unless st.exitstatus == 0
uri = URI("https://dev.azure.com/#{organization}/#{project}/_apis/git/repositories/#{repository}/pushes?api-version=7.1-preview.2")
puts "Creating repository #{repository}..."
root = Pathname.new(root_dir)
repository_to_create = {
refUpdates: [{
name: "refs/heads/main",
oldObjectId: "0000000000000000000000000000000000000000"
}],
commits: [{
comment: "Initial commit.",
changes: directories.map do |directory|
Dir[File.join(root_dir, directory, "**/*")].reject {|f| File.directory?(f) }.map do |entry|
{
changeType: "add",
item: {
path: File.join("/", Pathname.new(entry).relative_path_from(root).to_s)
},
newContent: {
content: File.read(entry),
contentType: "rawText"
}
changes: Dir[File.join(tmp_dir, "**/*")].reject {|f| File.directory?(f) }.map do |entry|
{
changeType: "add",
item: {
path: File.join("/", Pathname.new(entry).relative_path_from(tmp_dir).to_s)
},
newContent: {
content: File.read(entry),
contentType: "rawText"
}
end
}
end.flatten
}]
}
}
post_request(uri, repository_to_create, access_token) do |response|
raise "Error creating repository (#{response.code}:#{response.message})" unless response.code.start_with?("20")
post_request(uri, repository_to_create, access_token) do |response|
raise "Error creating repository (#{response.code}:#{response.message})" unless response.code.start_with?("20")
end
end
end
@@ -172,13 +177,15 @@ end
def update_forecast_source_file(options)
puts "Updating forecast data"
jobs_data = File.read(options[:forecast_source_file])
root_dir = options[:root_dir]
jobs_data_file = options[:forecast_source_file]
jobs_data = File.read(File.join(root_dir, jobs_data_file))
today = Date.today.strftime("%Y-%m-%d")
jobs_data.gsub!(/20[0-2][0-9]-[0-1][0-9]-[0-3][0-9]/, today)
File.write(options[:forecast_source_file], jobs_data)
end
create_project(options)
# create_project(options)
repository = create_repository(options)
create_yaml_pipelines(options, repository)
create_classic_pipelines(options, repository)