forked from tuist/tuist
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRakefile
158 lines (133 loc) · 4.63 KB
/
Rakefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# frozen_string_literal: true
require "rake/testtask"
require "rubygems"
require "cucumber"
require "cucumber/rake/task"
require "mkmf"
require "fileutils"
require "google/cloud/storage"
require "encrypted/environment"
require "colorize"
require "highline"
require "tmpdir"
require "json"
require "zip"
require "macho"
desc("Install git hooks")
task :install_git_hooks do
system("cp hooks/pre-commit .git/hooks/pre-commit")
system("chmod u+x .git/hooks/pre-commit")
puts("pre-commit hook installed on .git/hooks/")
end
desc("Builds and archive a release version of tuist and tuistenv for local testing.")
task :local_package do
package
end
desc("Builds, archives, and publishes tuist and tuistenv for release")
task :release, [:version] do |_task, options|
decrypt_secrets
release(options[:version])
end
desc("Publishes the installation scripts")
task :release_scripts do
decrypt_secrets
release_scripts
end
desc("Encrypt secret keys")
task :encrypt_secrets do
Encrypted::Environment.encrypt_ejson("secrets.ejson", private_key: ENV["SECRET_KEY"])
end
def decrypt_secrets
Encrypted::Environment.load_from_ejson("secrets.ejson", private_key: ENV["SECRET_KEY"])
end
def release_scripts
bucket = storage.bucket("tuist-releases")
print_section("Uploading installation scripts to the tuist-releases bucket on GCS")
bucket.create_file("script/install", "scripts/install").acl.public!
bucket.create_file("script/uninstall", "scripts/uninstall").acl.public!
end
def package
print_section("Building tuist")
FileUtils.mkdir_p("build")
system("swift", "build", "--product", "tuist", "--configuration", "release")
system(
"swift", "build",
"--product", "ProjectDescription",
"--configuration", "release",
"-Xswiftc", "-enable-library-evolution",
"-Xswiftc", "-emit-module-interface",
"-Xswiftc", "-emit-module-interface-path",
"-Xswiftc", ".build/release/ProjectDescription.swiftinterface"
)
system("swift", "build", "--product", "tuistenv", "--configuration", "release")
build_templates_path = File.join(__dir__, ".build/release/Templates")
script_path = File.join(__dir__, ".build/release/script")
vendor_path = File.join(__dir__, ".build/release/vendor")
FileUtils.rm_rf(build_templates_path) if File.exist?(build_templates_path)
FileUtils.cp_r(File.expand_path("Templates", __dir__), build_templates_path)
FileUtils.rm_rf(script_path) if File.exist?(script_path)
FileUtils.cp_r(File.expand_path("script", __dir__), script_path)
FileUtils.cp_r(File.expand_path("projects/tuist/vendor", __dir__), vendor_path)
File.delete("tuist.zip") if File.exist?("tuist.zip")
File.delete("tuistenv.zip") if File.exist?("tuistenv.zip")
Dir.chdir(".build/release") do
system(
"zip", "-q", "-r", "--symlinks",
"tuist.zip", "tuist",
"ProjectDescription.swiftmodule",
"ProjectDescription.swiftdoc",
"libProjectDescription.dylib",
"ProjectDescription.swiftinterface",
"Templates",
"vendor",
"script"
)
system("zip", "-q", "-r", "--symlinks", "tuistenv.zip", "tuistenv")
end
FileUtils.cp(".build/release/tuist.zip", "build/tuist.zip")
FileUtils.cp(".build/release/tuistenv.zip", "build/tuistenv.zip")
end
def release(version)
if version.nil?
version = cli.ask("Introduce the released version:")
end
puts "Releasing #{version} 🚀"
package
bucket = storage.bucket("tuist-releases")
print_section("Uploading to the tuist-releases bucket on GCS")
bucket.create_file("build/tuist.zip", "#{version}/tuist.zip").acl.public!
bucket.create_file("build/tuistenv.zip", "#{version}/tuistenv.zip").acl.public!
bucket.create_file("build/tuist.zip", "latest/tuist.zip").acl.public!
bucket.create_file("build/tuistenv.zip", "latest/tuistenv.zip").acl.public!
Dir.mktmpdir do |tmp_dir|
version_path = File.join(tmp_dir, "version")
File.write(version_path, version)
bucket.create_file(version_path, "latest/version").acl.public!
end
end
def system(*args)
Kernel.system(*args) || abort
end
def cli
@cli ||= HighLine.new
end
def storage
@storage ||= Google::Cloud::Storage.new(
project_id: ENV["GCS_PROJECT_ID"],
credentials: {
type: ENV["GCS_TYPE"],
project_id: ENV["GCS_PROJECT_ID"],
private_key_id: ENV["GCS_PRIVATE_KEY_ID"],
private_key: ENV["GCS_PRIVATE_KEY"],
client_email: ENV["GCS_CLIENT_EMAIL"],
client_id: ENV["GCS_CLIENT_ID"],
auth_uri: ENV["GCS_AUTH_URI"],
token_uri: ENV["GCS_TOKEN_URI"],
auth_provider_x509_cert_url: ENV["GCS_AUTH_PROVIDER_X509_CERT_URL"],
client_x509_cert_url: ENV["GCS_CLIENT_X509_CERT_URL"],
}
)
end
def print_section(text)
puts(text.bold.green)
end