Make devcontainer opt-in when creating a new application

For Rails 7.2 we will make devcontainer and opt-in feature for new applications. When creating a new app, you can generate a devcontainer by passing the --devcontainer flag.
This commit is contained in:
Andrew Novoselac 2024-05-17 10:18:05 -04:00 committed by Rafael Mendonça França
parent a8fdfffe18
commit a61bfe49a5
No known key found for this signature in database
GPG Key ID: FC23B6D0F1EEE948
6 changed files with 22 additions and 30 deletions

View File

@ -31,7 +31,7 @@ jobs:
bundler-cache: true
- name: Generate rails app sqlite3
run: bundle exec railties/exe/rails new myapp_sqlite --database="sqlite3" --dev
run: bundle exec railties/exe/rails new myapp_sqlite --database="sqlite3" --dev --devcontainer
- name: Remove old deprecated docker-compose
run: |
@ -52,7 +52,7 @@ jobs:
run: docker ps -q | xargs docker stop
- name: Generate rails app postgresql
run: bundle exec railties/exe/rails new myapp_postgresql --database="postgresql" --dev
run: bundle exec railties/exe/rails new myapp_postgresql --database="postgresql" --dev --devcontainer
- name: Test devcontainer postgresql
uses: devcontainers/ci@v0.3
@ -69,7 +69,7 @@ jobs:
run: docker ps -q | xargs docker stop
- name: Generate rails app mysql
run: bundle exec railties/exe/rails new myapp_mysql --database="mysql" --dev
run: bundle exec railties/exe/rails new myapp_mysql --database="mysql" --dev --devcontainer
- name: Test devcontainer mysql
uses: devcontainers/ci@v0.3
@ -86,7 +86,7 @@ jobs:
run: docker ps -q | xargs docker stop
- name: Generate rails app trilogy
run: bundle exec railties/exe/rails new myapp_trilogy --database="trilogy" --dev
run: bundle exec railties/exe/rails new myapp_trilogy --database="trilogy" --dev --devcontainer
- name: Test devcontainer trilogy
uses: devcontainers/ci@v0.3

View File

@ -67,7 +67,6 @@ If you wish to skip some files from being generated or skip some libraries, you
| `--skip-bootsnap` | Skip bootsnap gem |
| `--skip-dev-gems` | Skip adding development gems |
| `--skip-rubocop` | Skip RuboCop setup |
| `--skip-devcontainer` | Skip Dev Container setup |
These are just some of the options that `rails new` accepts. For a full list of options, type `rails new --help`.

View File

@ -198,7 +198,6 @@ of the files and folders that Rails creates by default:
|.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.|
|.rubocop.yml|This file contains the configuration for RuboCop.|
|.ruby-version|This file contains the default Ruby version.|
|.devcontainer/|This folder contains the Dev Container configuration|
Hello, Rails!
-------------

View File

@ -109,15 +109,15 @@ module Rails
class_option :skip_ci, type: :boolean, default: nil,
desc: "Skip GitHub CI files"
class_option :skip_devcontainer, type: :boolean, default: false,
desc: "Skip devcontainer files"
class_option :skip_kamal, type: :boolean, default: false,
desc: "Skip Kamal setup"
class_option :dev, type: :boolean, default: nil,
desc: "Set up the #{name} with Gemfile pointing to your Rails checkout"
class_option :devcontainer, type: :boolean, default: false,
desc: "Generate devcontainer files"
class_option :edge, type: :boolean, default: nil,
desc: "Set up the #{name} with a Gemfile pointing to the #{edge_branch} branch on the Rails repository"
@ -411,7 +411,7 @@ module Rails
end
def skip_devcontainer?
options[:skip_devcontainer]
!options[:devcontainer]
end
def skip_kamal?

View File

@ -18,7 +18,7 @@ default: &default
# For details on connection pooling, see Rails configuration guide
# https://guides.rubyonrails.org/configuring.html#database-pooling
pool: <%%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
<% unless options[:skip_devcontainer] -%>
<% if options[:devcontainer] -%>
<%% if ENV["DB_HOST"] %>
host: <%%= ENV["DB_HOST"] %>
username: postgres

View File

@ -5,9 +5,6 @@ require "rails/generators/rails/app/app_generator"
require "generators/shared_generator_tests"
DEFAULT_APP_FILES = %w(
.devcontainer/Dockerfile
.devcontainer/compose.yaml
.devcontainer/devcontainer.json
.dockerignore
.git
.gitattributes
@ -1050,9 +1047,6 @@ class AppGeneratorTest < Rails::Generators::TestCase
ruby_version = "#{Gem::Version.new(Gem::VERSION) >= Gem::Version.new("3.3.13") ? Gem.ruby_version : RUBY_VERSION}"
assert_file ".devcontainer/Dockerfile" do |content|
assert_match(/ARG RUBY_VERSION=#{ruby_version}$/, content)
end
assert_file "Dockerfile" do |content|
assert_match(/ARG RUBY_VERSION=#{ruby_version}/, content)
end
@ -1275,7 +1269,7 @@ class AppGeneratorTest < Rails::Generators::TestCase
end
def test_devcontainer
run_generator [destination_root, "--name=my-app"]
run_generator [destination_root, "--devcontainer", "--name=my-app"]
assert_devcontainer_json_file do |content|
assert_equal "my_app", content["name"]
@ -1329,7 +1323,7 @@ class AppGeneratorTest < Rails::Generators::TestCase
end
def test_devcontainer_no_redis_skipping_action_cable_and_active_job
run_generator [ destination_root, "--skip-action-cable", "--skip-active-job" ]
run_generator [ destination_root, "--devcontainer", "--skip-action-cable", "--skip-active-job" ]
assert_compose_file do |compose_config|
assert_not_includes compose_config["services"]["rails-app"]["depends_on"], "redis"
@ -1343,7 +1337,7 @@ class AppGeneratorTest < Rails::Generators::TestCase
end
def test_devcontainer_postgresql
run_generator [ destination_root, "-d", "postgresql" ]
run_generator [ destination_root, "--devcontainer", "-d", "postgresql" ]
assert_compose_file do |compose_config|
assert_includes compose_config["services"]["rails-app"]["depends_on"], "postgres"
@ -1373,7 +1367,7 @@ class AppGeneratorTest < Rails::Generators::TestCase
end
def test_devcontainer_mysql
run_generator [ destination_root, "-d", "mysql" ]
run_generator [ destination_root, "--devcontainer", "-d", "mysql" ]
assert_compose_file do |compose_config|
assert_includes compose_config["services"]["rails-app"]["depends_on"], "mysql"
@ -1403,7 +1397,7 @@ class AppGeneratorTest < Rails::Generators::TestCase
end
def test_devcontainer_mariadb
run_generator [ destination_root, "-d", "trilogy" ]
run_generator [ destination_root, "--devcontainer", "-d", "trilogy" ]
assert_compose_file do |compose_config|
assert_includes compose_config["services"]["rails-app"]["depends_on"], "mariadb"
@ -1430,7 +1424,7 @@ class AppGeneratorTest < Rails::Generators::TestCase
end
def test_devcontainer_no_selenium_when_skipping_system_test
run_generator [ destination_root, "--skip-system-test" ]
run_generator [ destination_root, "--devcontainer", "--skip-system-test" ]
assert_compose_file do |compose_config|
assert_not_includes compose_config["services"]["rails-app"]["depends_on"], "selenium"
@ -1442,7 +1436,7 @@ class AppGeneratorTest < Rails::Generators::TestCase
end
def test_devcontainer_no_feature_when_skipping_active_storage
run_generator [ destination_root, "--skip-active-storage" ]
run_generator [ destination_root, "--devcontainer", "--skip-active-storage" ]
assert_devcontainer_json_file do |content|
assert_nil content["features"]["ghcr.io/rails/devcontainer/features/activestorage"]
@ -1450,7 +1444,7 @@ class AppGeneratorTest < Rails::Generators::TestCase
end
def test_devcontainer_no_depends_on_when_no_dependencies
run_generator [ destination_root, "--minimal" ]
run_generator [ destination_root, "--devcontainer", "--minimal" ]
assert_compose_file do |compose_config|
assert_not_includes compose_config["services"]["rails-app"].keys, "depends_on"
@ -1458,7 +1452,7 @@ class AppGeneratorTest < Rails::Generators::TestCase
end
def test_devcontainer_adds_node_tooling_when_required
run_generator [destination_root, "--javascript=esbuild"]
run_generator [destination_root, "--devcontainer", "--javascript=esbuild"]
assert_devcontainer_json_file do |devcontainer_config|
assert_includes devcontainer_config["features"].keys, "ghcr.io/devcontainers/features/node:1"
@ -1466,7 +1460,7 @@ class AppGeneratorTest < Rails::Generators::TestCase
end
def test_devcontainer_does_not_add_node_tooling_when_not_required
run_generator [destination_root]
run_generator [destination_root, "--devcontainer"]
assert_devcontainer_json_file do |devcontainer_config|
assert_not_includes devcontainer_config["features"].keys, "ghcr.io/devcontainers/features/node:1"
@ -1474,7 +1468,7 @@ class AppGeneratorTest < Rails::Generators::TestCase
end
def test_devcontainer_dev_flag_mounts_local_rails_repo
run_generator_using_prerelease [ destination_root, "--dev" ]
run_generator_using_prerelease [ destination_root, "--devcontainer", "--dev" ]
assert_devcontainer_json_file do |devcontainer_config|
rails_mount = devcontainer_config["mounts"].sole
@ -1485,8 +1479,8 @@ class AppGeneratorTest < Rails::Generators::TestCase
end
end
def test_skip_devcontainer
run_generator [ destination_root, "--skip-devcontainer" ]
def test_no_devcontainer_by_default
run_generator [ destination_root ]
assert_no_file(".devcontainer/devcontainer.json")
assert_no_file(".devcontainer/Dockerfile")