Skip to content

Commit 62501c7

Browse files
authored
Merge pull request rails#51880 from Shopify/devcontainer-generator
Make devcontainers opt in and create a devcontainer command
2 parents a8fdfff + df203b2 commit 62501c7

File tree

18 files changed

+290
-165
lines changed

18 files changed

+290
-165
lines changed

.github/workflows/devcontainer-smoke-test.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ jobs:
3131
bundler-cache: true
3232

3333
- name: Generate rails app sqlite3
34-
run: bundle exec railties/exe/rails new myapp_sqlite --database="sqlite3" --dev
34+
run: bundle exec railties/exe/rails new myapp_sqlite --database="sqlite3" --dev --devcontainer
3535

3636
- name: Remove old deprecated docker-compose
3737
run: |
@@ -52,7 +52,7 @@ jobs:
5252
run: docker ps -q | xargs docker stop
5353

5454
- name: Generate rails app postgresql
55-
run: bundle exec railties/exe/rails new myapp_postgresql --database="postgresql" --dev
55+
run: bundle exec railties/exe/rails new myapp_postgresql --database="postgresql" --dev --devcontainer
5656

5757
- name: Test devcontainer postgresql
5858
uses: devcontainers/[email protected]
@@ -69,7 +69,7 @@ jobs:
6969
run: docker ps -q | xargs docker stop
7070

7171
- name: Generate rails app mysql
72-
run: bundle exec railties/exe/rails new myapp_mysql --database="mysql" --dev
72+
run: bundle exec railties/exe/rails new myapp_mysql --database="mysql" --dev --devcontainer
7373

7474
- name: Test devcontainer mysql
7575
uses: devcontainers/[email protected]
@@ -86,7 +86,7 @@ jobs:
8686
run: docker ps -q | xargs docker stop
8787

8888
- name: Generate rails app trilogy
89-
run: bundle exec railties/exe/rails new myapp_trilogy --database="trilogy" --dev
89+
run: bundle exec railties/exe/rails new myapp_trilogy --database="trilogy" --dev --devcontainer
9090

9191
- name: Test devcontainer trilogy
9292
uses: devcontainers/[email protected]

guides/source/command_line.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ If you wish to skip some files from being generated or skip some libraries, you
6767
| `--skip-bootsnap` | Skip bootsnap gem |
6868
| `--skip-dev-gems` | Skip adding development gems |
6969
| `--skip-rubocop` | Skip RuboCop setup |
70-
| `--skip-devcontainer` | Skip Dev Container setup |
7170

7271
These are just some of the options that `rails new` accepts. For a full list of options, type `rails new --help`.
7372

guides/source/getting_started.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,6 @@ of the files and folders that Rails creates by default:
198198
|.gitignore|This file tells git which files (or patterns) it should ignore. See [GitHub - Ignoring files](https://help.github.com/articles/ignoring-files) for more information about ignoring files.|
199199
|.rubocop.yml|This file contains the configuration for RuboCop.|
200200
|.ruby-version|This file contains the default Ruby version.|
201-
|.devcontainer/|This folder contains the Dev Container configuration|
202201

203202
Hello, Rails!
204203
-------------
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# frozen_string_literal: true
2+
3+
require "rails/generators"
4+
require "rails/generators/rails/devcontainer/devcontainer_generator"
5+
6+
module Rails
7+
module Command
8+
class DevcontainerCommand < Base # :nodoc:
9+
desc "devcontainer", "Generate a Dev Container setup based on current application configuration"
10+
def perform(*)
11+
boot_application!
12+
13+
say "Generating Dev Container with the following options:"
14+
devcontainer_options.each do |option, value|
15+
say "#{option}: #{value}"
16+
end
17+
18+
Rails::Generators::DevcontainerGenerator.new([], devcontainer_options).invoke_all
19+
end
20+
21+
private
22+
def devcontainer_options
23+
@devcontainer_options ||= {
24+
app_name: Rails.application.railtie_name.chomp("_application"),
25+
database: !!defined?(ActiveRecord) && ActiveRecord::Base.connection_db_config.adapter,
26+
active_storage: !!defined?(ActiveStorage),
27+
redis: !!(defined?(ActionCable) || defined?(ActiveJob)),
28+
system_test: File.exist?("test/application_system_test_case.rb"),
29+
node: File.exist?(".node-version"),
30+
}
31+
end
32+
end
33+
end
34+
end

railties/lib/rails/generators/app_base.rb

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
module Rails
1313
module Generators
1414
class AppBase < Base # :nodoc:
15-
include Devcontainer
1615
include AppName
1716

1817
NODE_LTS_VERSION = "20.11.1"
@@ -109,15 +108,15 @@ def self.add_shared_options_for(name)
109108
class_option :skip_ci, type: :boolean, default: nil,
110109
desc: "Skip GitHub CI files"
111110

112-
class_option :skip_devcontainer, type: :boolean, default: false,
113-
desc: "Skip devcontainer files"
114-
115111
class_option :skip_kamal, type: :boolean, default: false,
116112
desc: "Skip Kamal setup"
117113

118114
class_option :dev, type: :boolean, default: nil,
119115
desc: "Set up the #{name} with Gemfile pointing to your Rails checkout"
120116

117+
class_option :devcontainer, type: :boolean, default: false,
118+
desc: "Generate devcontainer files"
119+
121120
class_option :edge, type: :boolean, default: nil,
122121
desc: "Set up the #{name} with a Gemfile pointing to the #{edge_branch} branch on the Rails repository"
123122

@@ -411,7 +410,11 @@ def skip_ci?
411410
end
412411

413412
def skip_devcontainer?
414-
options[:skip_devcontainer]
413+
!options[:devcontainer]
414+
end
415+
416+
def devcontainer?
417+
options[:devcontainer]
415418
end
416419

417420
def skip_kamal?
@@ -454,10 +457,6 @@ def to_s
454457
end
455458
end
456459

457-
def gem_ruby_version
458-
Gem::Version.new(Gem::VERSION) >= Gem::Version.new("3.3.13") ? Gem.ruby_version : RUBY_VERSION
459-
end
460-
461460
def rails_prerelease?
462461
options.dev? || options.edge? || options.main?
463462
end

railties/lib/rails/generators/base.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,10 @@ def self.default_generator_root # :doc:
423423
path = File.expand_path(File.join(base_name, generator_name), base_root)
424424
path if File.exist?(path)
425425
end
426+
427+
def gem_ruby_version
428+
Gem::Version.new(Gem::VERSION) >= Gem::Version.new("3.3.13") ? Gem.ruby_version : RUBY_VERSION
429+
end
426430
end
427431
end
428432
end

railties/lib/rails/generators/devcontainer.rb

Lines changed: 0 additions & 96 deletions
This file was deleted.

railties/lib/rails/generators/rails/app/app_generator.rb

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# frozen_string_literal: true
22

33
require "rails/generators/app_base"
4+
require "rails/generators/rails/devcontainer/devcontainer_generator"
45

56
module Rails
67
module ActionMethods # :nodoc:
@@ -268,11 +269,17 @@ def config_target_version
268269
end
269270

270271
def devcontainer
271-
empty_directory ".devcontainer"
272-
273-
template ".devcontainer/devcontainer.json"
274-
template ".devcontainer/Dockerfile"
275-
template ".devcontainer/compose.yaml"
272+
devcontainer_options = {
273+
database: options[:database],
274+
redis: !(options[:skip_action_cable] && options[:skip_active_job]),
275+
system_test: depends_on_system_test?,
276+
active_storage: !options[:skip_active_storage],
277+
dev: options[:dev],
278+
node: using_node?,
279+
app_name: app_name
280+
}
281+
282+
Rails::Generators::DevcontainerGenerator.new([], devcontainer_options).invoke_all
276283
end
277284
end
278285

railties/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml.tt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ default: &default
1818
# For details on connection pooling, see Rails configuration guide
1919
# https://guides.rubyonrails.org/configuring.html#database-pooling
2020
pool: <%%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
21-
<% unless options[:skip_devcontainer] -%>
21+
<% if devcontainer? -%>
2222
<%% if ENV["DB_HOST"] %>
2323
host: <%%= ENV["DB_HOST"] %>
2424
username: postgres
Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,5 @@
11
require "test_helper"
22

33
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
4-
<% if skip_devcontainer? -%>
54
driven_by :selenium, using: :headless_chrome, screen_size: [ 1400, 1400 ]
6-
<% else -%>
7-
if ENV["CAPYBARA_SERVER_PORT"]
8-
served_by host: "rails-app", port: ENV["CAPYBARA_SERVER_PORT"]
9-
10-
driven_by :selenium, using: :headless_chrome, screen_size: [ 1400, 1400 ], options: {
11-
browser: :remote,
12-
url: "http://#{ENV["SELENIUM_HOST"]}:4444"
13-
}
14-
else
15-
driven_by :selenium, using: :headless_chrome, screen_size: [ 1400, 1400 ]
16-
end
17-
<% end -%>
185
end

0 commit comments

Comments
 (0)