bard 2.0.0.beta → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +6 -1
  3. data/CLAUDE.md +76 -0
  4. data/MIGRATION_GUIDE.md +24 -9
  5. data/PLUGINS.md +99 -0
  6. data/README.md +14 -6
  7. data/Rakefile +3 -1
  8. data/bard.gemspec +2 -1
  9. data/cucumber.yml +1 -0
  10. data/features/ci.feature +63 -0
  11. data/features/data.feature +13 -0
  12. data/features/deploy.feature +14 -0
  13. data/features/deploy_git_workflow.feature +89 -0
  14. data/features/run.feature +14 -0
  15. data/features/step_definitions/bard_steps.rb +136 -0
  16. data/features/support/bard-coverage +16 -0
  17. data/features/support/env.rb +14 -39
  18. data/features/support/test_server.rb +216 -0
  19. data/lib/bard/cli.rb +14 -31
  20. data/lib/bard/command.rb +10 -69
  21. data/lib/bard/config.rb +40 -183
  22. data/lib/bard/copy.rb +28 -103
  23. data/lib/bard/plugins/data.rb +56 -0
  24. data/lib/bard/{ci → plugins/deploy/ci}/github_actions.rb +3 -4
  25. data/lib/bard/plugins/deploy/ci/jenkins.rb +176 -0
  26. data/lib/bard/{ci → plugins/deploy/ci}/local.rb +7 -7
  27. data/lib/bard/{ci → plugins/deploy/ci}/runner.rb +38 -4
  28. data/lib/bard/plugins/deploy/ci.rb +38 -0
  29. data/lib/bard/plugins/deploy/ssh_strategy.rb +27 -0
  30. data/lib/bard/{deploy_strategy.rb → plugins/deploy/strategy.rb} +1 -1
  31. data/lib/bard/plugins/deploy.rb +240 -0
  32. data/lib/bard/{git.rb → plugins/git.rb} +6 -3
  33. data/lib/bard/{github.rb → plugins/github.rb} +4 -6
  34. data/lib/bard/{deploy_strategy/github_pages.rb → plugins/github_pages/strategy.rb} +41 -13
  35. data/lib/bard/plugins/github_pages.rb +30 -0
  36. data/lib/bard/plugins/hurt.rb +13 -0
  37. data/{install_files → lib/bard/plugins/install}/.github/dependabot.yml +2 -1
  38. data/{install_files → lib/bard/plugins/install}/.github/workflows/cache-ci.yml +1 -1
  39. data/{install_files → lib/bard/plugins/install}/.github/workflows/ci.yml +2 -2
  40. data/lib/bard/plugins/install.rb +9 -0
  41. data/lib/bard/plugins/open.rb +20 -0
  42. data/lib/bard/{ping.rb → plugins/ping/check.rb} +4 -4
  43. data/lib/bard/plugins/ping/target_methods.rb +23 -0
  44. data/lib/bard/plugins/ping.rb +10 -0
  45. data/lib/bard/plugins/run.rb +19 -0
  46. data/lib/bard/plugins/setup.rb +54 -0
  47. data/lib/bard/plugins/ssh/connection.rb +75 -0
  48. data/lib/bard/plugins/ssh/copy.rb +95 -0
  49. data/lib/bard/{ssh_server.rb → plugins/ssh/server.rb} +17 -42
  50. data/lib/bard/plugins/ssh/target_methods.rb +20 -0
  51. data/lib/bard/plugins/ssh.rb +10 -0
  52. data/lib/bard/plugins/url/target_methods.rb +23 -0
  53. data/lib/bard/plugins/url.rb +1 -0
  54. data/lib/bard/plugins/vim.rb +6 -0
  55. data/lib/bard/retryable.rb +25 -0
  56. data/lib/bard/secrets.rb +10 -0
  57. data/lib/bard/target.rb +27 -185
  58. data/lib/bard/version.rb +1 -1
  59. data/lib/bard.rb +1 -3
  60. data/spec/acceptance/docker/Dockerfile +3 -2
  61. data/spec/bard/capability_spec.rb +8 -50
  62. data/spec/bard/ci/github_actions_spec.rb +117 -14
  63. data/spec/bard/ci/jenkins_spec.rb +139 -0
  64. data/spec/bard/ci/runner_spec.rb +61 -0
  65. data/spec/bard/ci_spec.rb +1 -1
  66. data/spec/bard/cli/ci_spec.rb +34 -27
  67. data/spec/bard/cli/data_spec.rb +7 -26
  68. data/spec/bard/cli/deploy_spec.rb +87 -46
  69. data/spec/bard/cli/hurt_spec.rb +3 -9
  70. data/spec/bard/cli/install_spec.rb +5 -11
  71. data/spec/bard/cli/master_key_spec.rb +5 -19
  72. data/spec/bard/cli/open_spec.rb +14 -30
  73. data/spec/bard/cli/ping_spec.rb +8 -23
  74. data/spec/bard/cli/run_spec.rb +27 -21
  75. data/spec/bard/cli/setup_spec.rb +10 -27
  76. data/spec/bard/cli/ssh_spec.rb +10 -25
  77. data/spec/bard/cli/stage_spec.rb +28 -23
  78. data/spec/bard/cli/vim_spec.rb +3 -9
  79. data/spec/bard/command_spec.rb +1 -8
  80. data/spec/bard/config_spec.rb +78 -98
  81. data/spec/bard/copy_spec.rb +54 -18
  82. data/spec/bard/deploy_strategy/ssh_spec.rb +65 -7
  83. data/spec/bard/deploy_strategy_spec.rb +1 -1
  84. data/spec/bard/dynamic_dsl_spec.rb +18 -98
  85. data/spec/bard/git_spec.rb +9 -5
  86. data/spec/bard/github_spec.rb +2 -2
  87. data/spec/bard/ping_spec.rb +5 -5
  88. data/spec/bard/ssh_copy_spec.rb +44 -0
  89. data/spec/bard/ssh_server_spec.rb +8 -101
  90. data/spec/bard/target_spec.rb +66 -109
  91. data/spec/spec_helper.rb +6 -1
  92. metadata +79 -143
  93. data/README.rdoc +0 -15
  94. data/features/bard_check.feature +0 -94
  95. data/features/bard_deploy.feature +0 -18
  96. data/features/bard_pull.feature +0 -112
  97. data/features/bard_push.feature +0 -112
  98. data/features/podman_testcontainers.feature +0 -16
  99. data/features/step_definitions/check_steps.rb +0 -47
  100. data/features/step_definitions/git_steps.rb +0 -73
  101. data/features/step_definitions/global_steps.rb +0 -56
  102. data/features/step_definitions/podman_steps.rb +0 -23
  103. data/features/step_definitions/rails_steps.rb +0 -44
  104. data/features/step_definitions/submodule_steps.rb +0 -110
  105. data/features/support/grit_ext.rb +0 -13
  106. data/features/support/io.rb +0 -32
  107. data/features/support/podman.rb +0 -153
  108. data/lib/bard/ci/jenkins.rb +0 -105
  109. data/lib/bard/ci/retryable.rb +0 -27
  110. data/lib/bard/ci.rb +0 -50
  111. data/lib/bard/cli/ci.rb +0 -66
  112. data/lib/bard/cli/command.rb +0 -26
  113. data/lib/bard/cli/data.rb +0 -45
  114. data/lib/bard/cli/deploy.rb +0 -85
  115. data/lib/bard/cli/hurt.rb +0 -20
  116. data/lib/bard/cli/install.rb +0 -16
  117. data/lib/bard/cli/master_key.rb +0 -17
  118. data/lib/bard/cli/new.rb +0 -101
  119. data/lib/bard/cli/new_rails_template.rb +0 -197
  120. data/lib/bard/cli/open.rb +0 -22
  121. data/lib/bard/cli/ping.rb +0 -18
  122. data/lib/bard/cli/provision.rb +0 -34
  123. data/lib/bard/cli/run.rb +0 -24
  124. data/lib/bard/cli/setup.rb +0 -56
  125. data/lib/bard/cli/ssh.rb +0 -14
  126. data/lib/bard/cli/stage.rb +0 -27
  127. data/lib/bard/cli/vim.rb +0 -13
  128. data/lib/bard/default_config.rb +0 -35
  129. data/lib/bard/deploy_strategy/ssh.rb +0 -19
  130. data/lib/bard/github_pages.rb +0 -134
  131. data/lib/bard/provision/app.rb +0 -10
  132. data/lib/bard/provision/apt.rb +0 -16
  133. data/lib/bard/provision/authorizedkeys.rb +0 -25
  134. data/lib/bard/provision/data.rb +0 -27
  135. data/lib/bard/provision/deploy.rb +0 -10
  136. data/lib/bard/provision/http.rb +0 -16
  137. data/lib/bard/provision/logrotation.rb +0 -30
  138. data/lib/bard/provision/masterkey.rb +0 -18
  139. data/lib/bard/provision/mysql.rb +0 -22
  140. data/lib/bard/provision/passenger.rb +0 -37
  141. data/lib/bard/provision/repo.rb +0 -72
  142. data/lib/bard/provision/rvm.rb +0 -22
  143. data/lib/bard/provision/ssh.rb +0 -72
  144. data/lib/bard/provision/swapfile.rb +0 -21
  145. data/lib/bard/provision/user.rb +0 -42
  146. data/lib/bard/provision.rb +0 -16
  147. data/lib/bard/server.rb +0 -117
  148. data/spec/bard/cli/command_spec.rb +0 -50
  149. data/spec/bard/cli/new_spec.rb +0 -73
  150. data/spec/bard/cli/provision_spec.rb +0 -42
  151. data/spec/bard/github_pages_spec.rb +0 -143
  152. data/spec/bard/provision/app_spec.rb +0 -33
  153. data/spec/bard/provision/apt_spec.rb +0 -39
  154. data/spec/bard/provision/authorizedkeys_spec.rb +0 -40
  155. data/spec/bard/provision/data_spec.rb +0 -54
  156. data/spec/bard/provision/deploy_spec.rb +0 -33
  157. data/spec/bard/provision/http_spec.rb +0 -57
  158. data/spec/bard/provision/logrotation_spec.rb +0 -34
  159. data/spec/bard/provision/masterkey_spec.rb +0 -63
  160. data/spec/bard/provision/mysql_spec.rb +0 -55
  161. data/spec/bard/provision/passenger_spec.rb +0 -81
  162. data/spec/bard/provision/repo_spec.rb +0 -208
  163. data/spec/bard/provision/rvm_spec.rb +0 -49
  164. data/spec/bard/provision/ssh_spec.rb +0 -229
  165. data/spec/bard/provision/swapfile_spec.rb +0 -32
  166. data/spec/bard/provision/user_spec.rb +0 -103
  167. data/spec/bard/provision_spec.rb +0 -28
  168. data/spec/bard/server_spec.rb +0 -127
  169. /data/lib/bard/{ci → plugins/deploy/ci}/state.rb +0 -0
  170. /data/{install_files → lib/bard/plugins/install}/apt_dependencies.rb +0 -0
  171. /data/{install_files → lib/bard/plugins/install}/ci +0 -0
  172. /data/{install_files → lib/bard/plugins/install}/setup +0 -0
  173. /data/{install_files → lib/bard/plugins/install}/specified_bundler.rb +0 -0
  174. /data/{install_files → lib/bard/plugins/install}/specified_ruby.rb +0 -0
@@ -1,85 +0,0 @@
1
- require "bard/git"
2
- require "bard/command"
3
- require "bard/github_pages"
4
-
5
- module Bard::CLI::Deploy
6
- def self.included mod
7
- mod.class_eval do
8
-
9
- option :"skip-ci", type: :boolean
10
- option :"local-ci", type: :boolean
11
- option :clone, type: :boolean
12
- desc "deploy [TO=production]", "checks that current branch is a ff with master, checks with ci, merges into master, deploys to target, and then deletes branch."
13
- def deploy to=:production
14
- branch = Bard::Git.current_branch
15
-
16
- if branch == "master"
17
- if !Bard::Git.up_to_date_with_remote?(branch)
18
- run! "git push origin #{branch}:#{branch}"
19
- end
20
- invoke :ci, [branch], options.slice("local-ci") unless options["skip-ci"]
21
-
22
- else
23
- run! "git fetch origin master:master"
24
-
25
- unless Bard::Git.fast_forward_merge?("origin/master", branch)
26
- puts "The master branch has advanced. Attempting rebase..."
27
- run! "git rebase origin/master"
28
- end
29
-
30
- run! "git push -f origin #{branch}:#{branch}"
31
-
32
- invoke :ci, [branch], options.slice("local-ci") unless options["skip-ci"]
33
-
34
- run! "git push origin #{branch}:master"
35
- run! "git fetch origin master:master"
36
- end
37
-
38
- if `git remote` =~ /\bgithub\b/
39
- run! "git push github"
40
- end
41
-
42
- if options[:clone]
43
- config[to].run! "git clone git@github.com:botandrosedesign/#{project_name} #{config[to].path}", home: true
44
- invoke :master_key, [], from: "local", to: to
45
- config[to].run! "bin/setup && bard setup"
46
- else
47
- # Use deployment strategy for v2.0 Targets, or fallback for v1.x Servers
48
- target = config[to]
49
- if target.respond_to?(:deploy_strategy) && target.deploy_strategy
50
- require "bard/deploy_strategy/#{target.deploy_strategy}"
51
- strategy = target.deploy_strategy_instance
52
- strategy.deploy
53
- elsif target.respond_to?(:github_pages) && target.github_pages
54
- # Old v1.x github_pages support
55
- require "bard/github_pages"
56
- Bard::GithubPages.new(self).deploy(target)
57
- else
58
- # Default SSH deployment
59
- target.run! "git pull origin master && bin/setup"
60
- end
61
- end
62
-
63
- puts green("Deploy Succeeded")
64
-
65
- if branch != "master"
66
- puts "Deleting branch: #{branch}"
67
- run! "git push --delete origin #{branch}"
68
-
69
- if branch == Bard::Git.current_branch
70
- run! "git checkout master"
71
- end
72
-
73
- run! "git branch -D #{branch}"
74
- end
75
-
76
- ping to
77
- rescue Bard::Command::Error => e
78
- puts red("!!! ") + "Running command failed: #{yellow(e.message)}"
79
- exit 1
80
- end
81
-
82
- end
83
- end
84
- end
85
-
data/lib/bard/cli/hurt.rb DELETED
@@ -1,20 +0,0 @@
1
- module Bard::CLI::Hurt
2
- def self.included mod
3
- mod.class_eval do
4
-
5
- desc "hurt <command>", "reruns a command until it fails"
6
- def hurt *args
7
- (1..).each do |count|
8
- puts "Running attempt #{count}"
9
- system *args
10
- unless $?.success?
11
- puts "Ran #{count-1} times before failing"
12
- break
13
- end
14
- end
15
- end
16
-
17
- end
18
- end
19
- end
20
-
@@ -1,16 +0,0 @@
1
- module Bard::CLI::Install
2
- def self.included mod
3
- mod.class_eval do
4
-
5
- desc "install", "copies bin/setup and bin/ci scripts into current project."
6
- def install
7
- install_files_path = File.expand_path(File.join(__dir__, "../../../install_files"))
8
-
9
- system "cp -R #{install_files_path}/* bin/"
10
- system "cp -R #{install_files_path}/.github ./"
11
- end
12
-
13
- end
14
- end
15
- end
16
-
@@ -1,17 +0,0 @@
1
- module Bard::CLI::MasterKey
2
- def self.included mod
3
- mod.class_eval do
4
-
5
- desc "master_key --from=production --to=local", "copy master key from from to to"
6
- option :from, default: "production"
7
- option :to, default: "local"
8
- def master_key
9
- from = config[options[:from]]
10
- to = config[options[:to]]
11
- from.copy_file "config/master.key", to:
12
- end
13
-
14
- end
15
- end
16
- end
17
-
data/lib/bard/cli/new.rb DELETED
@@ -1,101 +0,0 @@
1
- require "bard/cli/command"
2
- require "bard/github"
3
-
4
- class Bard::CLI::New < Bard::CLI::Command
5
- RAILS_REQUIREMENT = "~> 8.0.0"
6
- desc "new <project-name>", "creates new bard app named <project-name>"
7
- def new project_name
8
- @project_name = project_name
9
- validate
10
- create_project
11
- push_to_github
12
- stage
13
- puts green("Project #{project_name} created!")
14
- puts "Please cd ../#{project_name}"
15
- end
16
-
17
- attr_accessor :project_name
18
-
19
- private
20
-
21
- def validate
22
- if project_name !~ /^[a-z][a-z0-9]*\Z/
23
- puts red("!!! ") + "Invalid project name: #{yellow(project_name)}."
24
- puts "The first character must be a lowercase letter, and all following characters must be a lowercase letter or number."
25
- exit 1
26
- end
27
- end
28
-
29
- def create_project
30
- run! build_create_project_script
31
- end
32
-
33
- def build_create_project_script
34
- build_bash_env do
35
- build_rvm_setup +
36
- build_gem_install("rails", RAILS_REQUIREMENT) +
37
- build_rails_new
38
- end
39
- end
40
-
41
- def build_bash_env
42
- script = yield
43
- <<~SH
44
- env -i bash -lc '
45
- export HOME=~
46
- source ~/.rvm/scripts/rvm
47
- #{script}
48
- '
49
- SH
50
- end
51
-
52
- def build_rvm_setup
53
- <<~SH
54
- cd ..
55
- rvm use --create #{ruby_version}@#{project_name}
56
- SH
57
- end
58
-
59
- def build_gem_install(gem_name, version_requirement)
60
- <<~SH
61
- GEM_VERSION=$(gem install #{gem_name} -v \"#{version_requirement}\" --no-document 2>&1 | grep -oP \"Successfully installed #{gem_name}-\\K[0-9.]+\")
62
- SH
63
- end
64
-
65
- def build_rails_new
66
- <<~SH
67
- rails _${GEM_VERSION}_ new #{project_name} --skip-git --skip-kamal --skip-test -m #{template_path}
68
- SH
69
- end
70
-
71
- def push_to_github
72
- api = Bard::Github.new(project_name)
73
- api.create_repo
74
- run! <<~SH
75
- cd ../#{project_name}
76
- git init -b master
77
- git add -A
78
- git commit -m"initial commit."
79
- git remote add origin git@github.com:botandrosedesign/#{project_name}
80
- git push -u origin master
81
- SH
82
- api.add_master_key File.read("../#{project_name}/config/master.key")
83
- api.add_master_branch_protection
84
- api.patch(nil, allow_auto_merge: true)
85
- end
86
-
87
- def stage
88
- run! <<~SH
89
- cd ../#{project_name}
90
- bard deploy --clone
91
- SH
92
- end
93
-
94
- def ruby_version
95
- "ruby-3.4.2"
96
- end
97
-
98
- def template_path
99
- File.expand_path("new_rails_template.rb", __dir__)
100
- end
101
- end
@@ -1,197 +0,0 @@
1
- ruby_version, project_name = (`rvm current name`.chomp).split("@")
2
- rails_version = Gem.loaded_specs["railties"].version
3
-
4
- file ".ruby-version", ruby_version
5
- file ".ruby-gemset", project_name
6
- file ".gitignore", <<~GITIGNORE
7
- # See https://help.github.com/articles/ignoring-files for more about ignoring files.
8
- #
9
- # If you find yourself ignoring temporary files generated by your text editor
10
- # or operating system, you probably want to add a global ignore instead:
11
- # git config --global core.excludesfile '~/.gitignore_global'
12
-
13
- # Ignore bundler config.
14
- /.bundle
15
-
16
- # Ignore all logfiles and tempfiles.
17
- /log/*
18
- /tmp/*
19
- !/log/.keep
20
- !/tmp/.keep
21
-
22
- # Ignore master key for decrypting credentials and more.
23
- /config/master.key
24
-
25
- # ignore coverage reports
26
- /coverage
27
-
28
- # Ignore database dumps
29
- /db/data.*
30
-
31
- # Ignore storage (uploaded files in development and any SQLite databases).
32
- /storage/*
33
-
34
- # Ignore Syncthing
35
- .stfolder/
36
-
37
- # Thank Apple!
38
- .DS_Store
39
- GITIGNORE
40
-
41
- file "Gemfile", <<~RUBY
42
- source "https://rubygems.org"
43
-
44
- gem "bootsnap", require: false
45
- gem "rails", "~> #{rails_version}"
46
- gem "solid_cache"
47
- gem "solid_queue"
48
- gem "solid_cable"
49
- gem "bard-rails"
50
- gem "sqlite3"
51
- gem "image_processing"
52
- gem "puma"
53
- gem "exception_notification"
54
-
55
- # css
56
- gem "sprockets-rails"
57
- gem "dartsass-sprockets"
58
- gem "bard-sass"
59
-
60
- # js
61
- gem "importmap-rails"
62
- gem "turbo-rails"
63
- gem "stimulus-rails"
64
-
65
- group :development do
66
- gem "web-console"
67
- end
68
-
69
- group :development, :test do
70
- gem "debug", require: "debug/prelude"
71
- # gem "parallel_tests", "~>3.9.0" # 3.10 pegs CPU
72
- gem "brakeman", require: false
73
- gem "rubocop-rails-omakase", require: false
74
- end
75
-
76
- group :test do
77
- gem "cucumber-rails", require: false
78
- gem "cuprite-downloads"
79
- gem "capybara-screenshot"
80
- gem "database_cleaner"
81
- gem "chop"
82
- gem "email_spec"
83
- gem "timecop"
84
- gem "rspec-rails"
85
- end
86
-
87
- group :production do
88
- gem "foreman-export-systemd_user"
89
- end
90
- RUBY
91
-
92
- file "config/initializers/exception_notification.rb", <<~RUBY
93
- require "exception_notification/rails"
94
-
95
- ExceptionNotification.configure do |config|
96
- config.ignored_exceptions = []
97
-
98
- # Adds a condition to decide when an exception must be ignored or not.
99
- # The ignore_if method can be invoked multiple times to add extra conditions.
100
- config.ignore_if do |exception, options|
101
- not Rails.env.production?
102
- end
103
-
104
- config.ignore_if do |exception, options|
105
- %w[
106
- ActiveRecord::RecordNotFound
107
- AbstractController::ActionNotFound
108
- ActionController::RoutingError
109
- ActionController::InvalidAuthenticityToken
110
- ActionView::MissingTemplate
111
- ActionController::BadRequest
112
- ActionDispatch::Http::Parameters::ParseError
113
- ActionDispatch::Http::MimeNegotiation::InvalidType
114
- ].include?(exception.class.to_s)
115
- end
116
-
117
- config.add_notifier :email, {
118
- email_prefix: "[\#{File.basename(Dir.pwd)}] ",
119
- exception_recipients: "micah@botandrose.com",
120
- smtp_settings: Rails.application.credentials.exception_notification_smtp_settings,
121
- }
122
- end
123
-
124
- if defined?(Rake::Application)
125
- Rake::Application.prepend Module.new {
126
- def display_error_message error
127
- ExceptionNotifier.notify_exception(error)
128
- super
129
- end
130
-
131
- def invoke_task task_name
132
- super
133
- rescue RuntimeError => exception
134
- if exception.message.starts_with?("Don't know how to build task")
135
- ExceptionNotifier.notify_exception(exception)
136
- end
137
- raise exception
138
- end
139
- }
140
- end
141
-
142
- ActionController::Live.prepend Module.new {
143
- def log_error exception
144
- ExceptionNotifier.notify_exception exception, env: request.env
145
- super
146
- end
147
- }
148
- RUBY
149
-
150
- file "app/assets/config/manifest.js", <<~RUBY
151
- //= link_tree ../images
152
- //= link_directory ../stylesheets .css
153
- //= link_tree ../../javascript .js
154
- RUBY
155
-
156
- run "rm -f app/assets/stylesheets/application.css"
157
-
158
- file "app/assets/stylesheets/application.sass", <<~SASS
159
- body
160
- border: 10px solid red
161
- SASS
162
-
163
- gsub_file "app/views/layouts/application.html.erb", " <%# Includes all stylesheet files in app/assets/stylesheets %>\n", ''
164
- gsub_file "app/views/layouts/application.html.erb", 'stylesheet_link_tag :app,', 'stylesheet_link_tag :application,'
165
-
166
- file "app/views/static/index.html.slim", <<~SLIM
167
- h1 #{project_name}
168
- SLIM
169
-
170
- insert_into_file "config/database.yml", <<~YAML, after: "database: storage/test.sqlite3"
171
-
172
- staging:
173
- <<: *default
174
- database: storage/staging.sqlite3
175
- YAML
176
-
177
- insert_into_file "config/database.yml", <<-YAML, after: "# database: path/to/persistent/storage/production.sqlite3"
178
-
179
- cable:
180
- <<: *default
181
- # database: path/to/persistent/storage/production_cable.sqlite3
182
- migrations_paths: db/cable_migrate
183
- queue:
184
- <<: *default
185
- # database: path/to/persistent/storage/production_queue.sqlite3
186
- migrations_paths: db/queue_migrate
187
- YAML
188
-
189
- gsub_file "config/database.yml", "path/to/persistent/", ""
190
-
191
- gsub_file "config/environments/production.rb", / (config\.logger.+STDOUT.*)$/, ' # \1'
192
-
193
- after_bundle do
194
- run "bard install"
195
- run "bin/setup"
196
- run "bard setup"
197
- end
data/lib/bard/cli/open.rb DELETED
@@ -1,22 +0,0 @@
1
- module Bard::CLI::Open
2
- def self.included mod
3
- mod.class_eval do
4
-
5
- desc "open [server=production]", "opens the url in the web browser."
6
- def open server=:production
7
- exec "xdg-open #{open_url server}"
8
- end
9
-
10
- private
11
-
12
- def open_url server
13
- if server.to_sym == :ci
14
- "https://github.com/botandrosedesign/#{project_name}/actions/workflows/ci.yml"
15
- else
16
- config[server].ping.first
17
- end
18
- end
19
- end
20
- end
21
- end
22
-
data/lib/bard/cli/ping.rb DELETED
@@ -1,18 +0,0 @@
1
- require "bard/ping"
2
-
3
- module Bard::CLI::Ping
4
- def self.included mod
5
- mod.class_eval do
6
-
7
- desc "ping [server=production]", "hits the server over http to verify that its up."
8
- def ping server=:production
9
- server = config[server]
10
- down_urls = Bard::Ping.call(config[server])
11
- down_urls.each { |url| puts "#{url} is down!" }
12
- exit 1 if down_urls.any?
13
- end
14
-
15
- end
16
- end
17
- end
18
-
@@ -1,34 +0,0 @@
1
- require "bard/cli/command"
2
- require "bard/provision"
3
-
4
- class Bard::CLI::Provision < Bard::CLI::Command
5
- STEPS = %w[
6
- SSH
7
- User
8
- AuthorizedKeys
9
- Swapfile
10
- Apt
11
- MySQL
12
- Repo
13
- MasterKey
14
- RVM
15
- App
16
- Passenger
17
- HTTP
18
- LogRotation
19
- Data
20
- Deploy
21
- ]
22
-
23
- desc "provision [ssh_url] --steps=all", "takes an optional ssh url to a raw ubuntu 22.04 install, and readies it in the shape of :production"
24
- option :steps, type: :array, default: STEPS
25
- def provision ssh_url=config[:production].ssh
26
- # unfreeze the string for later mutation
27
- ssh_url = ssh_url.dup
28
- options[:steps].each do |step|
29
- require "bard/provision/#{step.downcase}"
30
- Bard::Provision.const_get(step).call(config, ssh_url)
31
- end
32
- end
33
- end
34
-
data/lib/bard/cli/run.rb DELETED
@@ -1,24 +0,0 @@
1
- require "bard/command"
2
-
3
- module Bard::CLI::Run
4
- def self.included mod
5
- mod.class_eval do
6
-
7
- # HACK: we don't use Thor::Base#run, so its okay to stomp on it here
8
- original_verbose, $VERBOSE = $VERBOSE, nil
9
- Thor::THOR_RESERVED_WORDS -= ["run"]
10
- $VERBOSE = original_verbose
11
-
12
- desc "run <command>", "run the given command on production"
13
- def run *args
14
- server = config[:production]
15
- server.run! *args.join(" "), verbose: true
16
- rescue Bard::Command::Error => e
17
- puts red("!!! ") + "Running command failed: #{yellow(e.message)}"
18
- exit 1
19
- end
20
-
21
- end
22
- end
23
- end
24
-
@@ -1,56 +0,0 @@
1
- require "uri"
2
-
3
- module Bard::CLI::Setup
4
- def self.included mod
5
- mod.class_eval do
6
-
7
- desc "setup", "installs app in nginx"
8
- def setup
9
- system "sudo tee /etc/nginx/snippets/common.conf >/dev/null <<-EOF
10
- listen 80;
11
-
12
- passenger_enabled on;
13
-
14
- location ~* \\.(ico|css|js|gif|jp?g|png|webp) {
15
- access_log off;
16
- if (\\$request_filename ~ \"-[0-9a-f]{32,}\\.\") {
17
- expires max;
18
- add_header Cache-Control public;
19
- }
20
- }
21
-
22
- gzip_static on;
23
- EOF"
24
-
25
- path = "/etc/nginx/sites-available/#{project_name}"
26
- system "sudo tee #{path} >/dev/null <<-EOF
27
- server {
28
- include /etc/nginx/snippets/common.conf;
29
- server_name #{nginx_server_name};
30
- root #{Dir.pwd}/public;
31
- }
32
- EOF"
33
-
34
- dest_path = path.sub("sites-available", "sites-enabled")
35
- system "sudo ln -sf #{path} #{dest_path}" if !File.exist?(dest_path)
36
-
37
- system "sudo service nginx restart"
38
- end
39
-
40
- private
41
-
42
- def nginx_server_name
43
- case ENV["RAILS_ENV"]
44
- when "production"
45
- (config[:production].ping.map do |str|
46
- "*.#{URI.parse(str).host}"
47
- end + ["_"]).join(" ")
48
- when "staging" then "#{project_name}.botandrose.com"
49
- else "#{project_name}.localhost"
50
- end
51
- end
52
-
53
- end
54
- end
55
- end
56
-
data/lib/bard/cli/ssh.rb DELETED
@@ -1,14 +0,0 @@
1
- module Bard::CLI::SSH
2
- def self.included mod
3
- mod.class_eval do
4
-
5
- option :home, type: :boolean
6
- desc "ssh [to=production]", "logs into the specified server via SSH"
7
- def ssh to=:production
8
- config[to].exec! "exec $SHELL -l", home: options[:home]
9
- end
10
-
11
- end
12
- end
13
- end
14
-
@@ -1,27 +0,0 @@
1
- require "bard/git"
2
- require "bard/command"
3
-
4
- module Bard::CLI::Stage
5
- def self.included mod
6
- mod.class_eval do
7
-
8
- desc "stage [branch=HEAD]", "pushes current branch, and stages it"
9
- def stage branch=Bard::Git.current_branch
10
- unless config.servers.key?(:production)
11
- raise Thor::Error.new("`bard stage` is disabled until a production server is defined. Until then, please use `bard deploy` to deploy to the staging server.")
12
- end
13
-
14
- run! "git push -u origin #{branch}", verbose: true
15
- config[:staging].run! "git fetch && git checkout -f origin/#{branch} && bin/setup"
16
- puts green("Stage Succeeded")
17
-
18
- ping :staging
19
- rescue Bard::Command::Error => e
20
- puts red("!!! ") + "Running command failed: #{yellow(e.message)}"
21
- exit 1
22
- end
23
-
24
- end
25
- end
26
- end
27
-
data/lib/bard/cli/vim.rb DELETED
@@ -1,13 +0,0 @@
1
- module Bard::CLI::Vim
2
- def self.included mod
3
- mod.class_eval do
4
-
5
- desc "vim [branch=master]", "open all files that have changed since master"
6
- def vim branch="master"
7
- exec "vim -p `(git diff #{branch} --name-only; git ls-files --others --exclude-standard) | grep -v '^app/assets/images/' | grep -v '^app/assets/stylesheets/' | while read f; do [ -f \"$f\" ] && ! file -b \"$f\" | grep -q \"binary\" && echo \"$f\"; done | tac`"
8
- end
9
-
10
- end
11
- end
12
- end
13
-
@@ -1,35 +0,0 @@
1
- module Bard
2
- # Default configuration that is loaded before user's bard.rb
3
- # Users can override any of these targets in their bard.rb
4
- DEFAULT_CONFIG = lambda do |config, project_name|
5
- # Local development target
6
- config.instance_eval do
7
- target :local do
8
- ssh false
9
- path "./"
10
- ping "#{project_name}.local"
11
- end
12
-
13
- # Bot and Rose cloud server
14
- target :gubs do
15
- ssh "botandrose@cloud.hackett.world:22022",
16
- path: "Sites/#{project_name}"
17
- ping false
18
- end
19
-
20
- # CI target (Jenkins)
21
- target :ci do
22
- ssh "jenkins@staging.botandrose.com:22022",
23
- path: "jobs/#{project_name}/workspace"
24
- ping false
25
- end
26
-
27
- # Staging server
28
- target :staging do
29
- ssh "www@staging.botandrose.com:22022",
30
- path: project_name
31
- ping "#{project_name}.botandrose.com"
32
- end
33
- end
34
- end
35
- end