Skip to content

Commit aa090ea

Browse files
viktorianerrafaelfranca
authored andcommitted
Add bundler-cache feature in dev container.
Addresses the issue of caching bundler dependencies in a Dev Container setup, which can significantly speed up container startup times by avoiding the need to reinstall gems on every new container creation.
1 parent 1c7c7b5 commit aa090ea

3 files changed

Lines changed: 27 additions & 11 deletions

File tree

‎railties/lib/rails/generators/rails/devcontainer/templates/devcontainer/compose.yaml.tt‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ services:
88

99
volumes:
1010
- ../../<%= app_folder %>:/workspaces/<%= app_folder %>:cached
11+
- bundle-cache:/home/vscode/.local/share
1112

1213
# Overrides default command so things don't shut down after the process ends.
1314
command: sleep infinity
@@ -39,8 +40,10 @@ services:
3940

4041
<%- end -%>
4142
<%= devcontainer_db_service_yaml(indentation: 4) %>
42-
<%- if !volumes.empty? -%>
43+
4344
volumes:
45+
bundle-cache:
46+
<%- if !volumes.empty? -%>
4447
<%- volumes.each do |volume| -%>
4548
<%= volume %>:
4649
<%- end -%>

‎railties/test/generators/app_generator_test.rb‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1576,7 +1576,7 @@ def test_devcontainer
15761576
"context" => "..",
15771577
"dockerfile" => ".devcontainer/Dockerfile"
15781578
},
1579-
"volumes" => ["../../tmp:/workspaces/tmp:cached"],
1579+
"volumes" => ["../../tmp:/workspaces/tmp:cached", "bundle-cache:/home/vscode/.local/share"],
15801580
"command" => "sleep infinity",
15811581
"depends_on" => ["selenium"]
15821582
}
@@ -1629,7 +1629,7 @@ def test_devcontainer_no_redis_skipping_solid_action_cable_and_active_job
16291629
assert_compose_file do |compose_config|
16301630
assert_not_includes compose_config["services"]["rails-app"]["depends_on"], "redis"
16311631
assert_nil compose_config["services"]["redis"]
1632-
assert_nil compose_config["volumes"]
1632+
assert_includes compose_config["volumes"].keys, "bundle-cache"
16331633
end
16341634

16351635
assert_devcontainer_json_file do |content|

‎railties/test/generators/devcontainer_generator_test.rb‎

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,19 @@ def test_app_folder_option
7575
end
7676
end
7777

78+
def test_app_volumes
79+
run_generator
80+
81+
assert_compose_file do |compose|
82+
expected_volumes = ["../../rails_app:/workspaces/rails_app:cached", "bundle-cache:/home/vscode/.local/share"]
83+
actual_volumes = compose["services"]["rails-app"]["volumes"]
84+
expected_volumes.each do |volume|
85+
assert_includes actual_volumes, volume
86+
end
87+
assert_equal ["bundle-cache", "redis-data"], compose["volumes"].keys
88+
end
89+
end
90+
7891
def test_database_default_sqlite3
7992
run_generator
8093

@@ -100,7 +113,7 @@ def test_database_mariadb_mysql
100113
},
101114
}
102115
assert_equal expected_mariadb_config, compose["services"]["mariadb"]
103-
assert_includes compose["volumes"].keys, "mariadb-data"
116+
assert_equal ["bundle-cache", "redis-data", "mariadb-data"], compose["volumes"].keys
104117
assert_includes compose["services"]["rails-app"]["depends_on"], "mariadb"
105118
end
106119

@@ -127,7 +140,7 @@ def test_database_mariadb_trilogy
127140
},
128141
}
129142
assert_equal expected_mariadb_config, compose["services"]["mariadb"]
130-
assert_includes compose["volumes"].keys, "mariadb-data"
143+
assert_equal ["bundle-cache", "redis-data", "mariadb-data"], compose["volumes"].keys
131144
assert_includes compose["services"]["rails-app"]["depends_on"], "mariadb"
132145
end
133146

@@ -154,7 +167,7 @@ def test_database_mysql
154167
"networks" => ["default"],
155168
}
156169
assert_equal expected_mysql_config, compose["services"]["mysql"]
157-
assert_includes compose["volumes"].keys, "mysql-data"
170+
assert_equal ["bundle-cache", "redis-data", "mysql-data"], compose["volumes"].keys
158171
assert_includes compose["services"]["rails-app"]["depends_on"], "mysql"
159172
end
160173

@@ -188,7 +201,7 @@ def test_database_postgresql
188201
}
189202
}
190203
assert_equal expected_postgres_config, compose["services"]["postgres"]
191-
assert_includes compose["volumes"].keys, "postgres-data"
204+
assert_equal ["bundle-cache", "redis-data", "postgres-data"], compose["volumes"].keys
192205
assert_includes compose["services"]["rails-app"]["depends_on"], "postgres"
193206
end
194207

@@ -216,7 +229,7 @@ def test_database_trilogy
216229
"networks" => ["default"],
217230
}
218231
assert_equal expected_mysql_config, compose["services"]["mysql"]
219-
assert_includes compose["volumes"].keys, "mysql-data"
232+
assert_equal ["bundle-cache", "redis-data", "mysql-data"], compose["volumes"].keys
220233
assert_includes compose["services"]["rails-app"]["depends_on"], "mysql"
221234
end
222235

@@ -275,7 +288,7 @@ def test_redis_option_default
275288
"volumes" => ["redis-data:/data"]
276289
}
277290
assert_equal expected_redis_config, compose["services"]["redis"]
278-
assert_equal ["redis-data"], compose["volumes"].keys
291+
assert_equal ["bundle-cache", "redis-data"], compose["volumes"].keys
279292
end
280293

281294
assert_devcontainer_json_file do |devcontainer_json|
@@ -291,7 +304,7 @@ def test_redis_option_skip
291304
assert_compose_file do |compose|
292305
assert_not_includes compose["services"]["rails-app"]["depends_on"], "redis"
293306
assert_nil compose["services"]["redis"]
294-
assert_nil compose["volumes"]
307+
assert_equal ["bundle-cache"], compose["volumes"].keys
295308
end
296309

297310
assert_devcontainer_json_file do |devcontainer_json|
@@ -380,7 +393,7 @@ def test_common_config_with_folder(folder_name)
380393
"context" => "..",
381394
"dockerfile" => ".devcontainer/Dockerfile"
382395
},
383-
"volumes" => ["../../#{folder_name}:/workspaces/#{folder_name}:cached"],
396+
"volumes" => ["../../#{folder_name}:/workspaces/#{folder_name}:cached", "bundle-cache:/home/vscode/.local/share"],
384397
"command" => "sleep infinity"
385398
}
386399
actual_independent_config = compose["services"]["rails-app"].except("depends_on")

0 commit comments

Comments
 (0)