-
Notifications
You must be signed in to change notification settings - Fork 2
/
Rakefile
183 lines (156 loc) · 6.25 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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
# frozen_string_literal: true
$stdout.sync = true
require 'rubygems'
require 'bundler/setup'
require 'firespring_dev_commands'
require 'launchy'
# The identifier used for the app's rake commands
APP_IDENTIFIER = 'app'
# Load .env file
Dotenv.load
#Create some top level constants
ROOT_DIR = File.realpath(File.dirname(__FILE__))
# Configure AWS accounts and create tasks
Dev::Aws::Account::configure do |c|
c.root = Dev::Aws::Account::Info.new(ENV['ORG_ACCOUNT_NAME'], ENV['ORG_ACCOUNT_ID'])
c.children = []
c.children << Dev::Aws::Account::Info.new(ENV['PRD_ACCOUNT_NAME'], ENV['PRD_ACCOUNT_ID']) unless ENV['PRD_ACCOUNT_ID'].to_s.blank?
c.children << Dev::Aws::Account::Info.new(ENV['DEV_ACCOUNT_NAME'], ENV['DEV_ACCOUNT_ID']) unless ENV['DEV_ACCOUNT_ID'].to_s.blank?
c.ecr_registry_ids = ['300448126090']
c.login_to_account_ecr_registry = true
end
Dev::Template::Aws.new
# Configure the tasks for the ci pipelines
ci_cloudformations = []
branch = ENV['BRANCH'] || Dev::Git.new.branch_name(dir: "#{ROOT_DIR}")
branch = branch.split(/\s/)[-1] if branch.include?('detached')
ci_cloudformations << Dev::Aws::Cloudformation.new(
"pipeline-givesource-#{branch.split('/')[-1].split('GD-')[-1]}",
"#{ROOT_DIR}/ops/aws/cloudformation/ci/branch.yml",
parameters: Dev::Aws::Cloudformation::Parameters.new(
BranchName: branch
),
capabilities: ['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM']
)
Dev::Template::Aws::Ci.new(ci_cloudformations)
# Set the docker tag based off the current branch name
ENV['GIVESOURCE_TAG'] = branch.split('/')[-1]
# Configure docker required versions
Dev::Docker.configure do |c|
c.min_version = '23.0.0'
end
# Configure docker compose required versions
Dev::Docker::Compose.configure do |c|
c.max_version = '3.0.0'
end
# Create default docker tasks
Dev::Template::Docker::Default.new(exclude: %i[push pull])
# Configure to work with docker desktop
Dev::Docker::Desktop.new.configure
# Configure git required version and create tasks
Dev::Git.configure do |c|
c.min_version = '2.27.0'
end
Dev::Template::Git.new
# Configure software versions used and create tasks
Dev::EndOfLife.config do |c|
c.product_versions = [
Dev::EndOfLife::ProductVersion.new('debian', '12', 'the OS version in the local dev environment'),
Dev::EndOfLife::ProductVersion.new('nodejs', '18', 'the version of node running in the local dev environment')
]
end
Dev::Template::Eol.new
# Create default tasks for the app
Dev::Template::Docker::Application.new(APP_IDENTIFIER)
Dev::Template::Docker::Node::Application.new('app', exclude: [:test, :lint, :audit])
namespace APP_IDENTIFIER do
desc 'Start up a dev server for our frontend assets'
task dev: %i[init_docker up_no_deps] do
command = Dev::Node.new(container_path: '/usr/src/app/packages/frontend').base_command
command << 'run' << 'dev'
Dev::Docker::Compose.new(services: APP_IDENTIFIER).exec(*command)
end
desc 'Run the tests for Givesource'
task test: %i[init_docker up_no_deps] do
command = Dev::Node.new(container_path: '/usr/src/app').base_command
command << 'run' << 'test'
Dev::Docker::Compose.new(services: APP_IDENTIFIER).exec(*command)
end
desc 'Run the linter for Givesource'
task lint: %i[init_docker up_no_deps] do
command = Dev::Node.new(container_path: '/usr/src/app').base_command
command << 'run' << 'lint'
Dev::Docker::Compose.new(services: APP_IDENTIFIER).exec(*command)
end
namespace :lint do
desc 'Run the linter for Givesource and fix everything that is auto-fixable'
task fix: %i[init_docker up_no_deps] do
command = Dev::Node.new(container_path: '/usr/src/app').base_command
command << 'run' << 'lint:fix'
Dev::Docker::Compose.new(services: APP_IDENTIFIER).exec(*command)
end
end
desc 'Run an audit for Givesource packages'
task audit: %i[init_docker up_no_deps] do
ENV['IGNORELIST'] ||= Dev::Aws::Parameter.new.get_value('/Firespring/CiCd/Ignorelist/node')
puts
puts "The IGNORELIST is set to [ #{ENV.fetch('IGNORELIST', nil)} ]"
puts
%w(/usr/src/app /usr/src/app/packages/cloudformation /usr/src/app/packages/frontend /usr/src/app/packages/lambda).each do |container_path|
node = Dev::Node.new(container_path: container_path)
compose = Dev::Docker::Compose.new(services: APP_IDENTIFIER, capture: true)
audit_data = compose.exec(*node.audit_command)
Dev::Node::Audit.new(audit_data).to_report.check
end
end
namespace :test do
desc 'Run the tests with coverage for Givesource'
task coverage: %i[init_docker up_no_deps] do
command = Dev::Node.new(container_path: '/usr/src/app/packages/lambda').base_command
command << 'run' << 'test:coverage'
Dev::Docker::Compose.new(services: APP_IDENTIFIER).exec(*command)
end
end
namespace :dev do
desc 'Open browser windows to ports 3000-3003 (local dev)'
task gui: %w[init_docker up_no_deps] do
Launchy.open("http://localhost:3000")
sleep 0.5
Launchy.open("http://localhost:3001")
sleep 0.5
Launchy.open("http://localhost:3002")
sleep 0.5
Launchy.open("http://localhost:3003")
end
end
end
Dev::Template::Application::Config.new('cicd', '/Firespring/CiCd')
Dev::Template::Application::Config.new('global', '/global/database')
Dev::Template::Application::Config.new('recaptcha', '/recaptcha/secure')
# Add some custom pre/post tasks
task _pre_up_hooks: %w[init_docker ensure_aws_credentials] do
Dev::Aws::Credentials.new.export!
end
# Add a task to open our docuemtnation in a browser
desc 'Open a browser showing the givesource documentation'
task :docs do
branch_name = Dev::Git.new.branch_name
url = "https://github.com/firespring/givesource/blob/#{branch_name}/documentation/table-of-contents.md"
puts "Opening #{url} in a browser window..."
Launchy.open(url)
end
namespace :eol do
task :node do
alt_dir_node_eol(File.join(ROOT_DIR, 'packages/cloudformation'))
alt_dir_node_eol(File.join(ROOT_DIR, 'packages/frontend'))
alt_dir_node_eol(File.join(ROOT_DIR, 'packages/lambda'))
end
end
def alt_dir_node_eol(local_path)
node = Dev::Node.new(local_path:)
eol = Dev::EndOfLife::Node.new(node)
node_products = eol.default_products
puts
puts "Node product versions (in #{eol.lockfile})".light_yellow
Dev::EndOfLife.new(product_versions: node_products).status
end