bard-new 0.1.0

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 (62) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yml +42 -0
  3. data/.gitignore +4 -0
  4. data/CLAUDE.md +55 -0
  5. data/Gemfile +10 -0
  6. data/Gemfile.lock +179 -0
  7. data/README.md +107 -0
  8. data/Rakefile +8 -0
  9. data/bard-new.gemspec +25 -0
  10. data/features/new.feature +12 -0
  11. data/features/provision.feature +10 -0
  12. data/features/step_definitions/bard_new_steps.rb +64 -0
  13. data/features/support/bard-coverage +16 -0
  14. data/features/support/env.rb +22 -0
  15. data/features/support/new_server.rb +136 -0
  16. data/features/support/provision_server.rb +282 -0
  17. data/lib/bard/new/cli/new.rb +102 -0
  18. data/lib/bard/new/cli/provision.rb +32 -0
  19. data/lib/bard/new/provision/app.rb +9 -0
  20. data/lib/bard/new/provision/apt.rb +15 -0
  21. data/lib/bard/new/provision/authorizedkeys.rb +23 -0
  22. data/lib/bard/new/provision/base.rb +17 -0
  23. data/lib/bard/new/provision/data.rb +23 -0
  24. data/lib/bard/new/provision/deploy.rb +9 -0
  25. data/lib/bard/new/provision/http.rb +15 -0
  26. data/lib/bard/new/provision/logrotation.rb +27 -0
  27. data/lib/bard/new/provision/masterkey.rb +17 -0
  28. data/lib/bard/new/provision/mysql.rb +21 -0
  29. data/lib/bard/new/provision/nginx.rb +31 -0
  30. data/lib/bard/new/provision/repo.rb +71 -0
  31. data/lib/bard/new/provision/rvm.rb +20 -0
  32. data/lib/bard/new/provision/ssh.rb +79 -0
  33. data/lib/bard/new/provision/swapfile.rb +21 -0
  34. data/lib/bard/new/provision/user.rb +43 -0
  35. data/lib/bard/new/rails_template.rb +213 -0
  36. data/lib/bard/new/version.rb +5 -0
  37. data/lib/bard/plugins/new.rb +2 -0
  38. data/spec/acceptance/docker/Dockerfile.new +68 -0
  39. data/spec/acceptance/docker/Dockerfile.provision +41 -0
  40. data/spec/acceptance/docker/entrypoint-new.sh +3 -0
  41. data/spec/acceptance/docker/test_key +27 -0
  42. data/spec/acceptance/docker/test_key.pub +1 -0
  43. data/spec/bard/new/cli/new_spec.rb +85 -0
  44. data/spec/bard/new/cli/provision_spec.rb +40 -0
  45. data/spec/bard/new/provision/app_spec.rb +33 -0
  46. data/spec/bard/new/provision/apt_spec.rb +39 -0
  47. data/spec/bard/new/provision/authorizedkeys_spec.rb +40 -0
  48. data/spec/bard/new/provision/base_spec.rb +34 -0
  49. data/spec/bard/new/provision/data_spec.rb +54 -0
  50. data/spec/bard/new/provision/deploy_spec.rb +33 -0
  51. data/spec/bard/new/provision/http_spec.rb +57 -0
  52. data/spec/bard/new/provision/logrotation_spec.rb +34 -0
  53. data/spec/bard/new/provision/masterkey_spec.rb +62 -0
  54. data/spec/bard/new/provision/mysql_spec.rb +55 -0
  55. data/spec/bard/new/provision/nginx_spec.rb +81 -0
  56. data/spec/bard/new/provision/repo_spec.rb +208 -0
  57. data/spec/bard/new/provision/rvm_spec.rb +49 -0
  58. data/spec/bard/new/provision/ssh_spec.rb +242 -0
  59. data/spec/bard/new/provision/swapfile_spec.rb +33 -0
  60. data/spec/bard/new/provision/user_spec.rb +103 -0
  61. data/spec/spec_helper.rb +19 -0
  62. metadata +214 -0
@@ -0,0 +1,103 @@
1
+ require "spec_helper"
2
+ require "bard/new/provision/base"
3
+ require "bard/new/provision/user"
4
+
5
+ describe Bard::Provision::User do
6
+ let(:old_ssh_uri) { double("old_ssh_uri", user: "root", host: "example.com", port: 22) }
7
+ let(:new_ssh_uri) { double("new_ssh_uri", user: "deploy", host: "example.com", port: 22) }
8
+ let(:target) { double("target", ssh_uri: new_ssh_uri) }
9
+ let(:config) { { production: target } }
10
+ let(:ssh_url) { "root@example.com" }
11
+ let(:provision_server) { double("provision_server", ssh_uri: old_ssh_uri) }
12
+ let(:user_provisioner) { Bard::Provision::User.new(config, ssh_url) }
13
+
14
+ before do
15
+ allow(user_provisioner).to receive(:target).and_return(target)
16
+ allow(user_provisioner).to receive(:provision_server).and_return(provision_server)
17
+ allow(user_provisioner).to receive(:print)
18
+ allow(user_provisioner).to receive(:puts)
19
+ allow(user_provisioner).to receive(:system)
20
+ end
21
+
22
+ describe "#call" do
23
+ context "when new user already exists" do
24
+ it "skips user creation" do
25
+ allow(user_provisioner).to receive(:ssh_with_user?).with(old_ssh_uri, user: "deploy").and_return(true)
26
+
27
+ expect(provision_server).not_to receive(:run!)
28
+
29
+ user_provisioner.call
30
+ end
31
+ end
32
+
33
+ context "when new user doesn't exist but old user works" do
34
+ it "creates the new user" do
35
+ allow(user_provisioner).to receive(:ssh_with_user?).with(old_ssh_uri, user: "deploy").and_return(false)
36
+ allow(user_provisioner).to receive(:ssh_with_user?).with(old_ssh_uri).and_return(true)
37
+
38
+ expected_commands = [
39
+ "sudo useradd -m -s /bin/bash deploy",
40
+ "sudo usermod -aG sudo deploy",
41
+ "echo \"deploy ALL=(ALL) NOPASSWD:ALL\" | sudo tee -a /etc/sudoers",
42
+ "sudo mkdir -p ~deploy/.ssh",
43
+ "sudo cp ~/.ssh/authorized_keys ~deploy/.ssh/authorized_keys",
44
+ "sudo chown -R deploy:deploy ~deploy/.ssh",
45
+ "sudo chmod +rx ~deploy"
46
+ ].join("; ")
47
+
48
+ expect(provision_server).to receive(:run!).with(expected_commands, home: true)
49
+
50
+ user_provisioner.call
51
+ end
52
+
53
+ it "prints status messages during user creation" do
54
+ allow(user_provisioner).to receive(:ssh_with_user?).with(old_ssh_uri, user: "deploy").and_return(false)
55
+ allow(user_provisioner).to receive(:ssh_with_user?).with(old_ssh_uri).and_return(true)
56
+ allow(provision_server).to receive(:run!)
57
+
58
+ expect(user_provisioner).to receive(:print).with("User:")
59
+ expect(user_provisioner).to receive(:print).with(" Adding user deploy,")
60
+ expect(user_provisioner).to receive(:puts).with(" ✓")
61
+
62
+ user_provisioner.call
63
+ end
64
+ end
65
+
66
+ context "when neither old nor new user can SSH" do
67
+ it "raises an error" do
68
+ allow(user_provisioner).to receive(:ssh_with_user?).with(old_ssh_uri, user: "deploy").and_return(false)
69
+ allow(user_provisioner).to receive(:ssh_with_user?).with(old_ssh_uri).and_return(false)
70
+
71
+ expect { user_provisioner.call }.to raise_error("can't ssh in with user deploy or root")
72
+ end
73
+ end
74
+ end
75
+
76
+ describe "#ssh_with_user?" do
77
+ it "tests SSH connection with specified user" do
78
+ expect(user_provisioner).to receive(:system).with(/ssh.*-o ConnectTimeout=2.*-p22 deploy@example\.com : >\/dev\/null/)
79
+
80
+ user_provisioner.send(:ssh_with_user?, old_ssh_uri, user: "deploy")
81
+ end
82
+
83
+ it "uses default user from SSH URI if not specified" do
84
+ expect(user_provisioner).to receive(:system).with(/ssh.*-o ConnectTimeout=2.*-p22 root@example\.com : >\/dev\/null/)
85
+
86
+ user_provisioner.send(:ssh_with_user?, old_ssh_uri)
87
+ end
88
+ end
89
+
90
+ describe "private methods" do
91
+ describe "#new_user" do
92
+ it "returns the target user from target SSH URI" do
93
+ expect(user_provisioner.send(:new_user)).to eq("deploy")
94
+ end
95
+ end
96
+
97
+ describe "#old_user" do
98
+ it "returns the current user from provision server SSH URI" do
99
+ expect(user_provisioner.send(:old_user)).to eq("root")
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,19 @@
1
+ require "simplecov"
2
+ SimpleCov.start do
3
+ command_name "RSpec"
4
+ track_files "lib/**/*.rb"
5
+ add_filter "spec/"
6
+ add_filter "features/"
7
+ end
8
+
9
+ require "webmock/rspec"
10
+
11
+ $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
12
+ require "debug/prelude"
13
+ require "bard/cli"
14
+ require "bard/plugins/new"
15
+
16
+ RSpec.configure do |config|
17
+ config.filter_run focus: true
18
+ config.run_all_when_everything_filtered = true
19
+ end
metadata ADDED
@@ -0,0 +1,214 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bard-new
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Micah Geisel
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 2026-05-17 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: bard
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: rake
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: rspec
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: debug
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: cucumber
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: testcontainers
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ email:
97
+ - micah@botandrose.com
98
+ executables: []
99
+ extensions: []
100
+ extra_rdoc_files: []
101
+ files:
102
+ - ".github/workflows/ci.yml"
103
+ - ".gitignore"
104
+ - CLAUDE.md
105
+ - Gemfile
106
+ - Gemfile.lock
107
+ - README.md
108
+ - Rakefile
109
+ - bard-new.gemspec
110
+ - features/new.feature
111
+ - features/provision.feature
112
+ - features/step_definitions/bard_new_steps.rb
113
+ - features/support/bard-coverage
114
+ - features/support/env.rb
115
+ - features/support/new_server.rb
116
+ - features/support/provision_server.rb
117
+ - lib/bard/new/cli/new.rb
118
+ - lib/bard/new/cli/provision.rb
119
+ - lib/bard/new/provision/app.rb
120
+ - lib/bard/new/provision/apt.rb
121
+ - lib/bard/new/provision/authorizedkeys.rb
122
+ - lib/bard/new/provision/base.rb
123
+ - lib/bard/new/provision/data.rb
124
+ - lib/bard/new/provision/deploy.rb
125
+ - lib/bard/new/provision/http.rb
126
+ - lib/bard/new/provision/logrotation.rb
127
+ - lib/bard/new/provision/masterkey.rb
128
+ - lib/bard/new/provision/mysql.rb
129
+ - lib/bard/new/provision/nginx.rb
130
+ - lib/bard/new/provision/repo.rb
131
+ - lib/bard/new/provision/rvm.rb
132
+ - lib/bard/new/provision/ssh.rb
133
+ - lib/bard/new/provision/swapfile.rb
134
+ - lib/bard/new/provision/user.rb
135
+ - lib/bard/new/rails_template.rb
136
+ - lib/bard/new/version.rb
137
+ - lib/bard/plugins/new.rb
138
+ - spec/acceptance/docker/Dockerfile.new
139
+ - spec/acceptance/docker/Dockerfile.provision
140
+ - spec/acceptance/docker/entrypoint-new.sh
141
+ - spec/acceptance/docker/test_key
142
+ - spec/acceptance/docker/test_key.pub
143
+ - spec/bard/new/cli/new_spec.rb
144
+ - spec/bard/new/cli/provision_spec.rb
145
+ - spec/bard/new/provision/app_spec.rb
146
+ - spec/bard/new/provision/apt_spec.rb
147
+ - spec/bard/new/provision/authorizedkeys_spec.rb
148
+ - spec/bard/new/provision/base_spec.rb
149
+ - spec/bard/new/provision/data_spec.rb
150
+ - spec/bard/new/provision/deploy_spec.rb
151
+ - spec/bard/new/provision/http_spec.rb
152
+ - spec/bard/new/provision/logrotation_spec.rb
153
+ - spec/bard/new/provision/masterkey_spec.rb
154
+ - spec/bard/new/provision/mysql_spec.rb
155
+ - spec/bard/new/provision/nginx_spec.rb
156
+ - spec/bard/new/provision/repo_spec.rb
157
+ - spec/bard/new/provision/rvm_spec.rb
158
+ - spec/bard/new/provision/ssh_spec.rb
159
+ - spec/bard/new/provision/swapfile_spec.rb
160
+ - spec/bard/new/provision/user_spec.rb
161
+ - spec/spec_helper.rb
162
+ homepage: http://github.com/botandrose/bard-new
163
+ licenses:
164
+ - MIT
165
+ metadata: {}
166
+ rdoc_options: []
167
+ require_paths:
168
+ - lib
169
+ required_ruby_version: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ required_rubygems_version: !ruby/object:Gem::Requirement
175
+ requirements:
176
+ - - ">="
177
+ - !ruby/object:Gem::Version
178
+ version: '0'
179
+ requirements: []
180
+ rubygems_version: 3.6.2
181
+ specification_version: 4
182
+ summary: Project creation and server provisioning for bard.
183
+ test_files:
184
+ - features/new.feature
185
+ - features/provision.feature
186
+ - features/step_definitions/bard_new_steps.rb
187
+ - features/support/bard-coverage
188
+ - features/support/env.rb
189
+ - features/support/new_server.rb
190
+ - features/support/provision_server.rb
191
+ - spec/acceptance/docker/Dockerfile.new
192
+ - spec/acceptance/docker/Dockerfile.provision
193
+ - spec/acceptance/docker/entrypoint-new.sh
194
+ - spec/acceptance/docker/test_key
195
+ - spec/acceptance/docker/test_key.pub
196
+ - spec/bard/new/cli/new_spec.rb
197
+ - spec/bard/new/cli/provision_spec.rb
198
+ - spec/bard/new/provision/app_spec.rb
199
+ - spec/bard/new/provision/apt_spec.rb
200
+ - spec/bard/new/provision/authorizedkeys_spec.rb
201
+ - spec/bard/new/provision/base_spec.rb
202
+ - spec/bard/new/provision/data_spec.rb
203
+ - spec/bard/new/provision/deploy_spec.rb
204
+ - spec/bard/new/provision/http_spec.rb
205
+ - spec/bard/new/provision/logrotation_spec.rb
206
+ - spec/bard/new/provision/masterkey_spec.rb
207
+ - spec/bard/new/provision/mysql_spec.rb
208
+ - spec/bard/new/provision/nginx_spec.rb
209
+ - spec/bard/new/provision/repo_spec.rb
210
+ - spec/bard/new/provision/rvm_spec.rb
211
+ - spec/bard/new/provision/ssh_spec.rb
212
+ - spec/bard/new/provision/swapfile_spec.rb
213
+ - spec/bard/new/provision/user_spec.rb
214
+ - spec/spec_helper.rb