renuo-cli 3.1.6 → 3.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/renuo/cli/app/configure_semaphore.rb +2 -2
- data/lib/renuo/cli/app/configure_sentry.rb +1 -0
- data/lib/renuo/cli/app/create_aws_project.rb +13 -34
- data/lib/renuo/cli/app/create_heroku_app.rb +3 -16
- data/lib/renuo/cli/app/environments.rb +1 -2
- data/lib/renuo/cli/app/name_display.rb +1 -1
- data/lib/renuo/cli/app/services/cloudfront_config_service.rb +1 -10
- data/lib/renuo/cli/app/templates/semaphore/bin/cache_restore.erb +10 -10
- data/lib/renuo/cli/app/templates/semaphore/semaphore.yml.erb +6 -6
- data/lib/renuo/cli/version.rb +1 -1
- data/lib/renuo/cli.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d0c7cb1b6bb3792c2b43d510487bb7e876070c6cdf83e7e4d41d96a556ab782
|
4
|
+
data.tar.gz: 851fe36fa4258b8a15a4bfe47186776e20638c453913df29549bb1d90c38398a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cd6b422735e525fe3f408ca5f30b65af4cb0f8a88b8b6c2d70b4cbc3db3bb077fc1e27b0af776b48b47d2e7590accf68e681d1c676aeb954bc7aae032a9b7a3a
|
7
|
+
data.tar.gz: f0989fe4f8c88dbbaf52f944c1aeb8053ae2d3199456e742941cd3cbdf2ce15d2f1cb5ba4edad6cabf51de438cc87d5b4580f8ce34f27d816a53600a646d99cd
|
data/README.md
CHANGED
@@ -20,7 +20,7 @@ After checking out the repo, run `bin/setup` to install dependencies.
|
|
20
20
|
|
21
21
|
Run `rake spec` to run the tests.
|
22
22
|
|
23
|
-
Run `ruby -Ilib ./bin/renuo` to run the executable.
|
23
|
+
Run `ruby -Ilib ./bin/renuo` to run the executable. (e.g. `ruby -Ilib ./bin/renuo -v`)
|
24
24
|
|
25
25
|
You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
26
26
|
|
@@ -15,7 +15,7 @@ class ConfigureSemaphore
|
|
15
15
|
FileUtils.mkdir_p(%w[.semaphore .semaphore/bin])
|
16
16
|
|
17
17
|
write_or_warn('.semaphore/semaphore.yml', render('templates/semaphore/semaphore.yml.erb'))
|
18
|
-
%w[main develop
|
18
|
+
%w[main develop].each do |environment|
|
19
19
|
@environment = environment
|
20
20
|
write_or_warn(".semaphore/#{environment}-deploy.yml", render('templates/semaphore/semaphore-deploy.yml.erb'))
|
21
21
|
end
|
@@ -38,7 +38,7 @@ class ConfigureSemaphore
|
|
38
38
|
def create_semaphore_notification
|
39
39
|
system("sem create notifications #{project_name} "\
|
40
40
|
"--projects #{project_name} "\
|
41
|
-
'--branches "main,develop
|
41
|
+
'--branches "main,develop" '\
|
42
42
|
"--slack-channels \"#project-#{project_name}\" "\
|
43
43
|
'--slack-endpoint "https://hooks.slack.com/services/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"')
|
44
44
|
end
|
@@ -22,5 +22,6 @@ class ConfigureSentry
|
|
22
22
|
heroku_name = "#{project_name}-#{env}"
|
23
23
|
say "heroku config:set SENTRY_DSN=#{sentry_dsn} --app #{heroku_name}"
|
24
24
|
say "heroku config:set SENTRY_ENVIRONMENT=#{env} --app #{heroku_name}"
|
25
|
+
say "heroku labs:enable runtime-dyno-metadata --app #{heroku_name}"
|
25
26
|
end
|
26
27
|
end
|
@@ -8,7 +8,7 @@ class CreateAwsProject
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def run
|
11
|
-
%w[main develop
|
11
|
+
%w[main develop].each do |branch|
|
12
12
|
print_setup_commands branch
|
13
13
|
end
|
14
14
|
end
|
@@ -41,18 +41,6 @@ class CreateAwsProject
|
|
41
41
|
def collect_cloudfront_information
|
42
42
|
@setup_cloudfront = agree('Would you like to setup also AWS CloudFront? '\
|
43
43
|
'(Default: yes, if you want to deliver assets/images from S3)')
|
44
|
-
return unless @setup_cloudfront
|
45
|
-
|
46
|
-
@cloudfront_alias = {}
|
47
|
-
return unless agree('Would you like to use an alias to call your assets/images on S3? (Default: no)')
|
48
|
-
|
49
|
-
%i[main develop testing].each do |branch|
|
50
|
-
cloudfront_alias_for branch
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def cloudfront_alias_for(branch)
|
55
|
-
@cloudfront_alias[branch] = ask("What CF-Alias do you want to use for #{branch}?") { |q| q.validate = /.+/ }
|
56
44
|
end
|
57
45
|
|
58
46
|
def ensure_aws_setup?
|
@@ -72,40 +60,31 @@ class CreateAwsProject
|
|
72
60
|
(system(installation_command) if agree(agree_text)) until system(installation_check_command)
|
73
61
|
end
|
74
62
|
|
75
|
-
def print_setup_commands(branch)
|
63
|
+
def print_setup_commands(branch) # rubocop:todo Metrics/AbcSize
|
76
64
|
say "\n# AWS #{branch} \n".colorize :green
|
77
65
|
# wrap_at inserts newlines, after that, the command is no longer copyable
|
78
66
|
$terminal.wrap_at = nil if $terminal
|
79
67
|
puts aws_iam_setup(@aws_profile, aws_user(branch), @aws_app_group)
|
80
68
|
puts aws_s3_setup(@aws_profile, aws_user(branch), @aws_region, @redmine_project)
|
69
|
+
say '# Hint: Don\'t forget to copy SecretAccessKey and AccessKeyId'.colorize :yellow
|
81
70
|
puts aws_s3_versioning_setup(@aws_profile, aws_user(branch)) if branch == 'main'
|
82
|
-
cloudfront_setup(aws_user(branch)
|
71
|
+
cloudfront_setup(aws_user(branch))
|
83
72
|
$terminal.wrap_at = :auto if $terminal
|
84
73
|
end
|
85
74
|
|
86
|
-
def cloudfront_setup(bucket
|
75
|
+
def cloudfront_setup(bucket)
|
87
76
|
return unless @setup_cloudfront
|
88
77
|
|
89
|
-
puts aws_cloudfront_setup(@aws_profile, bucket,
|
90
|
-
|
91
|
-
say "\n# Warning: Don't forget to set up `#{cloudfront_alias(branch)}` on the DNS "\
|
92
|
-
'if not yet done'.colorize :yellow
|
93
|
-
else
|
94
|
-
say "\n# Hint: The domain name for your S3 files, can be found after running the" \
|
95
|
-
' commands on https://console.aws.amazon.com/cloudfront/home'.colorize :yellow
|
96
|
-
end
|
78
|
+
puts aws_cloudfront_setup(@aws_profile, bucket, @redmine_project)
|
79
|
+
say '# Hint: Find the distribution domain name under Distribution.DomainName'.colorize :yellow
|
97
80
|
end
|
98
81
|
|
99
82
|
def aws_user(branch)
|
100
83
|
[@project_name, branch, @project_purpose].compact.join('-')
|
101
84
|
end
|
102
85
|
|
103
|
-
def cloudfront_alias(branch)
|
104
|
-
@cloudfront_alias[branch.to_sym]
|
105
|
-
end
|
106
|
-
|
107
86
|
def aws_iam_setup(profile, user, app_group)
|
108
|
-
|
87
|
+
<<~IAM_COMMANDS
|
109
88
|
aws --profile #{profile} iam create-user --user-name #{user}
|
110
89
|
aws --profile #{profile} iam add-user-to-group --user-name #{user} --group-name #{app_group}
|
111
90
|
aws --profile #{profile} iam create-access-key --user-name #{user}
|
@@ -113,23 +92,23 @@ class CreateAwsProject
|
|
113
92
|
end
|
114
93
|
|
115
94
|
def aws_s3_setup(profile, bucket, region, redmine_project)
|
116
|
-
|
95
|
+
<<~S3_COMMANDS
|
117
96
|
aws --profile #{profile} s3 mb s3://#{bucket} --region #{region}
|
118
97
|
aws --profile #{profile} s3api put-bucket-tagging --bucket #{bucket} --tagging "TagSet=[{Key=redmine_project,Value=#{redmine_project}}]"
|
119
98
|
S3_COMMANDS
|
120
99
|
end
|
121
100
|
|
122
101
|
def aws_s3_versioning_setup(profile, bucket)
|
123
|
-
|
102
|
+
<<~S3_VERSIONING_COMMANDS
|
124
103
|
aws --profile #{profile} s3api put-bucket-versioning --bucket #{bucket} --versioning-configuration Status=Enabled
|
125
104
|
S3_VERSIONING_COMMANDS
|
126
105
|
end
|
127
106
|
|
128
|
-
def aws_cloudfront_setup(profile, bucket,
|
107
|
+
def aws_cloudfront_setup(profile, bucket, redmine_project)
|
129
108
|
tags = [{ "Key": 'redmine_project', "Value": redmine_project }]
|
130
|
-
cloudfront_config_string = CloudfrontConfigService.new(bucket,
|
109
|
+
cloudfront_config_string = CloudfrontConfigService.new(bucket, tags).to_s
|
131
110
|
|
132
|
-
|
111
|
+
<<~CLOUDFRONT_COMMANDS
|
133
112
|
aws --profile #{profile} cloudfront create-distribution-with-tags --distribution-config-with-tags '#{cloudfront_config_string}'
|
134
113
|
CLOUDFRONT_COMMANDS
|
135
114
|
end
|
@@ -6,43 +6,30 @@ class CreateHerokuApp
|
|
6
6
|
def run(args)
|
7
7
|
project_name = args[0]
|
8
8
|
abort('>> Project name must be between 2 and 22 characters.') unless project_name&.length&.between?(2, 22)
|
9
|
-
emails = FetchEmails.new.fetch_emails
|
10
9
|
|
11
10
|
say "# Commands to setup your Heroku application\n".colorize :green
|
12
11
|
ENVIRONMENTS.each do |env|
|
13
|
-
print_environment_commands(
|
12
|
+
print_environment_commands(env, project_name)
|
14
13
|
end
|
15
14
|
print_pipelines_commands(project_name)
|
16
15
|
end
|
17
16
|
|
18
17
|
private
|
19
18
|
|
20
|
-
def print_environment_commands(
|
19
|
+
def print_environment_commands(env, project_name)
|
21
20
|
heroku_name = "#{project_name}-#{env}"
|
22
|
-
say "heroku apps:create --region eu #{heroku_name}"
|
21
|
+
say "heroku apps:create --region eu #{heroku_name} -t staff"
|
23
22
|
say "heroku domains:add #{heroku_name}.renuoapp.ch --app #{heroku_name}"
|
24
23
|
say "heroku domains:add #{project_name}-#{MASTER}.renuoapp.ch --app #{heroku_name}" if env == MAIN
|
25
24
|
say "heroku addons:create heroku-postgresql --app #{heroku_name}"
|
26
25
|
say "heroku addons:create papertrail --app #{heroku_name}"
|
27
26
|
say "heroku labs:enable runtime-dyno-metadata --app #{heroku_name}"
|
28
27
|
say "heroku pg:backups:schedule DATABASE_URL --at '02:00 Europe/Zurich' --app #{heroku_name}"
|
29
|
-
print_ownership_commands(emails, heroku_name)
|
30
28
|
end
|
31
29
|
|
32
30
|
def print_pipelines_commands(project_name)
|
33
31
|
say "heroku pipelines:create #{project_name} --app #{project_name}-#{MAIN} -s production -t staff"
|
34
32
|
say "heroku pipelines:add #{project_name} --app #{project_name}-#{DEVELOP} -s staging"
|
35
|
-
say "heroku pipelines:add #{project_name} --app #{project_name}-#{TESTING} -s staging"
|
36
|
-
say "\n"
|
37
|
-
end
|
38
|
-
|
39
|
-
def print_ownership_commands(emails, heroku_name)
|
40
|
-
say "\n"
|
41
|
-
emails.each do |email|
|
42
|
-
say "heroku access:add #{email} --app #{heroku_name}"
|
43
|
-
end
|
44
|
-
say "heroku access:add #{ADMIN_EMAIL} --app #{heroku_name}"
|
45
|
-
say "heroku apps:transfer -a #{heroku_name} #{ADMIN_EMAIL}"
|
46
33
|
say "\n"
|
47
34
|
end
|
48
35
|
end
|
@@ -15,7 +15,7 @@ class NameDisplay
|
|
15
15
|
|
16
16
|
private
|
17
17
|
|
18
|
-
HEROKU_APP_NAME = '-a renuo-dashboard-
|
18
|
+
HEROKU_APP_NAME = '-a renuo-dashboard-main'.freeze
|
19
19
|
HEROKU_CLI = 'heroku run'.freeze
|
20
20
|
RENUO_CLI = 'rails renuo:welcome'.freeze
|
21
21
|
SLIDES = 'https://docs.google.com/presentation/d/1mPhQjArZnlUWUa2ik5R9IlGmdCKCwc2_H8Qq-AWgV-A/edit'.freeze
|
@@ -1,7 +1,6 @@
|
|
1
1
|
class CloudfrontConfigService
|
2
|
-
def initialize(bucket,
|
2
|
+
def initialize(bucket, tags = [])
|
3
3
|
@bucket = bucket
|
4
|
-
@bucket_alias = bucket_alias
|
5
4
|
@tags = tags
|
6
5
|
end
|
7
6
|
|
@@ -16,7 +15,6 @@ class CloudfrontConfigService
|
|
16
15
|
{
|
17
16
|
"DistributionConfig": {
|
18
17
|
"CallerReference": unique_caller_reference,
|
19
|
-
"Aliases": bucket_aliases,
|
20
18
|
"Origins": {
|
21
19
|
"Quantity": 1,
|
22
20
|
"Items": [
|
@@ -116,11 +114,4 @@ class CloudfrontConfigService
|
|
116
114
|
def unique_caller_reference
|
117
115
|
"#{Time.now.getutc.to_i}-#{@bucket}"
|
118
116
|
end
|
119
|
-
|
120
|
-
def bucket_aliases
|
121
|
-
{
|
122
|
-
"Quantity": @bucket_alias ? 1 : 0,
|
123
|
-
"Items": @bucket_alias ? [@bucket_alias] : []
|
124
|
-
}
|
125
|
-
end
|
126
117
|
end
|
@@ -5,22 +5,22 @@ do
|
|
5
5
|
case $cache_group in
|
6
6
|
|
7
7
|
rails)
|
8
|
-
cache restore nvm-$SEMAPHORE_GIT_BRANCH-$(checksum .nvmrc),nvm-$SEMAPHORE_GIT_BRANCH,nvm-develop
|
9
|
-
cache restore gems-$SEMAPHORE_GIT_BRANCH-$(checksum .ruby-version)-$(checksum Gemfile.lock),gems-develop-$(checksum .ruby-version)-$(checksum Gemfile.lock),gems-develop-$(checksum .ruby-version)
|
10
|
-
cache restore yarn-cache-$SEMAPHORE_GIT_BRANCH-$(checksum yarn.lock),yarn-cache-$SEMAPHORE_GIT_BRANCH,yarn-cache-develop
|
11
|
-
cache restore node-modules-$SEMAPHORE_GIT_BRANCH-$(checksum yarn.lock),node-modules-$SEMAPHORE_GIT_BRANCH,node-modules-develop
|
8
|
+
cache restore "nvm-$SEMAPHORE_GIT_BRANCH-$(checksum .nvmrc),nvm-$SEMAPHORE_GIT_BRANCH,nvm-develop"
|
9
|
+
cache restore "gems-$SEMAPHORE_GIT_BRANCH-$(checksum .ruby-version)-$(checksum Gemfile.lock),gems-develop-$(checksum .ruby-version)-$(checksum Gemfile.lock),gems-develop-$(checksum .ruby-version)"
|
10
|
+
cache restore "yarn-cache-$SEMAPHORE_GIT_BRANCH-$(checksum yarn.lock),yarn-cache-$SEMAPHORE_GIT_BRANCH,yarn-cache-develop"
|
11
|
+
cache restore "node-modules-$SEMAPHORE_GIT_BRANCH-$(checksum yarn.lock),node-modules-$SEMAPHORE_GIT_BRANCH,node-modules-develop"
|
12
12
|
;;
|
13
13
|
|
14
14
|
python)
|
15
|
-
cache restore requirements-$SEMAPHORE_GIT_BRANCH-$(checksum requirements.txt),requirements-$SEMAPHORE_GIT_BRANCH,requirements-develop
|
15
|
+
cache restore "requirements-$SEMAPHORE_GIT_BRANCH-$(checksum requirements.txt),requirements-$SEMAPHORE_GIT_BRANCH,requirements-develop"
|
16
16
|
;;
|
17
17
|
|
18
18
|
assets)
|
19
|
-
cache restore packs-$SEMAPHORE_GIT_BRANCH,packs-develop
|
20
|
-
cache restore packstest-$SEMAPHORE_GIT_BRANCH,packstest-develop
|
21
|
-
cache restore assets-$SEMAPHORE_GIT_BRANCH,assets-develop
|
22
|
-
cache restore sprocketscache-$SEMAPHORE_GIT_BRANCH,sprocketscache-develop
|
23
|
-
cache restore webpackercache-$SEMAPHORE_GIT_BRANCH,webpackercache-develop
|
19
|
+
cache restore "packs-$SEMAPHORE_GIT_BRANCH,packs-develop"
|
20
|
+
cache restore "packstest-$SEMAPHORE_GIT_BRANCH,packstest-develop"
|
21
|
+
cache restore "assets-$SEMAPHORE_GIT_BRANCH,assets-develop"
|
22
|
+
cache restore "sprocketscache-$SEMAPHORE_GIT_BRANCH,sprocketscache-develop"
|
23
|
+
cache restore "webpackercache-$SEMAPHORE_GIT_BRANCH,webpackercache-develop"
|
24
24
|
;;
|
25
25
|
|
26
26
|
*)
|
@@ -63,7 +63,8 @@ blocks:
|
|
63
63
|
- mkdir -p coverage
|
64
64
|
- artifact push job --expire-in 2w log
|
65
65
|
- artifact push job --expire-in 2w tmp/screenshots
|
66
|
-
-
|
66
|
+
- zip -r coverage-$SEMAPHORE_GIT_SHA coverage/
|
67
|
+
- artifact push job --expire-in 2w coverage-$SEMAPHORE_GIT_SHA.zip
|
67
68
|
- name: tests
|
68
69
|
execution_time_limit:
|
69
70
|
minutes: 10
|
@@ -98,10 +99,13 @@ blocks:
|
|
98
99
|
commands:
|
99
100
|
- mkdir -p log
|
100
101
|
- mkdir -p tmp/screenshots
|
102
|
+
- mkdir -p tmp/capybara
|
101
103
|
- mkdir -p coverage
|
102
104
|
- artifact push job log --expire-in 2w
|
103
105
|
- artifact push job tmp/screenshots --expire-in 2w
|
104
|
-
- artifact push job
|
106
|
+
- artifact push job tmp/capybara --expire-in 2w
|
107
|
+
- zip -r coverage-$SEMAPHORE_GIT_SHA coverage/
|
108
|
+
- artifact push job --expire-in 2w coverage-$SEMAPHORE_GIT_SHA.zip
|
105
109
|
promotions:
|
106
110
|
- name: develop
|
107
111
|
pipeline_file: develop-deploy.yml
|
@@ -111,7 +115,3 @@ promotions:
|
|
111
115
|
pipeline_file: main-deploy.yml
|
112
116
|
auto_promote:
|
113
117
|
when: "result = 'passed' and branch = 'main'"
|
114
|
-
- name: testing
|
115
|
-
pipeline_file: testing-deploy.yml
|
116
|
-
auto_promote:
|
117
|
-
when: "result = 'passed' and branch = 'testing'"
|
data/lib/renuo/cli/version.rb
CHANGED
data/lib/renuo/cli.rb
CHANGED
@@ -123,7 +123,7 @@ module Renuo
|
|
123
123
|
- whether you want to setup CloudFront to deliver assets via S3
|
124
124
|
|
125
125
|
The generated commands do the following:
|
126
|
-
- create an IAM user for each environment (main, develop
|
126
|
+
- create an IAM user for each environment (main, develop) and add it to the renuo apps group.
|
127
127
|
- create S3 buckets for each user who owns it
|
128
128
|
- tag the buckets
|
129
129
|
- enable versioning for main buckets
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: renuo-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.1.
|
4
|
+
version: 3.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Renuo AG
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-05-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activeresource
|
@@ -378,7 +378,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
378
378
|
- !ruby/object:Gem::Version
|
379
379
|
version: '0'
|
380
380
|
requirements: []
|
381
|
-
rubygems_version: 3.
|
381
|
+
rubygems_version: 3.1.6
|
382
382
|
signing_key:
|
383
383
|
specification_version: 4
|
384
384
|
summary: The Renuo CLI automates some common workflows.
|