çŸä»£ã®ãœãããŠã§ã¢éçºã«ããã課é¡ã® 1 ã€ã¯ããœãããŠã§ã¢ãé »ç¹ã«èªä¿¡ãæã£ãŠãªãªãŒã¹ã§ããããšã§ãã ããã¯ããœãããŠã§ã¢ããã¹ããã人éã®ä»å ¥ãæå°éã«æããŠãªãªãŒã¹ã§ããåªããCI/CDã»ããã¢ãããæŽã£ãŠããå Žåã«ã®ã¿å®çŸã§ããŸãã ããããææ°ã®ãœãããŠã§ã¢ã¢ããªã±ãŒã·ã§ã³ã¯ãããŸããŸãªãµãŒãããŒãã£ã®äŸåé¢ä¿ã䜿çšããŠãããå€ãã®å Žåãè€æ°ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãšã¢ãŒããã¯ãã£ã§å®è¡ããå¿ èŠããããŸããÂ
ãã®æçš¿ã§ã¯ã Bazel ãš Testcontainers ã®çµã¿åãããã å¯éåãã«ã ã·ã¹ãã ãæäŸããããšã§ãéçºè ããœãããŠã§ã¢ããã«ãããŠãªãªãŒã¹ããã®ã«ã©ã®ããã«åœ¹ç«ã€ãã説æããŸãã

Bazel ã³ã³ãããš Testcontainers ãäžç·ã«äœ¿çšãã
Bazel ã¯ãå€èšèªããã«ããã©ãããã©ãŒã ãããžã§ã¯ãããã«ãããã³ãã¹ãããããã« Google ã«ãã£ãŠéçºããããªãŒãã³ãœãŒã¹ã®ãã«ã ããŒã«ã§ãã ããã€ãã®å€§æITäŒæ¥ã¯ã次ã®ãããªããŸããŸãªçç±ã§ã¢ãã¬ããæ¡çšããŠããŸãã
- ã³ãŒãã®å ±æãšåå©çšæ§Â
- ãããžã§ã¯ãéã®ãªãã¡ã¯ã¿ãªã³ã°Â
- äžè²«æ§ã®ãããã«ããšäŸåé¢ä¿ã®ç®¡çÂ
- ããŒãžã§ã³ç®¡çãšãªãªãŒã¹ç®¡ç
å€èšèªãµããŒããšåçŸå¯èœãªãã«ãã«éç¹ã眮ãã Bazel ã¯ããã®ãããªã¢ãã¬ãã®æ§ç¯ã«åªããŠããŸãã
Bazel ã®éèŠãªæŠå¿µã¯ å¯éæ§ã§ãããããã¯ããã¹ãŠã®å ¥åã宣èšããããšãã«ããã«ãã·ã¹ãã ãåºåãåæ§ç¯ããå¿ èŠãããã¿ã€ãã³ã°ãç¥ãããšãã§ããããšãæå³ããŸãã ãã®ã¢ãããŒãã¯ãåãå ¥åãœãŒã¹ ã³ãŒããšè£œåæ§æãäžããããå Žåããã«ãããã¹ã ã·ã¹ãã ãžã®å€æŽããåé¢ããããšã§ãåžžã«åãåºåãè¿ããšããæ±ºå®è«ããããããŸãã
Testcontainers ã¯ãéçºããã³ãã¹ãã®ãŠãŒã¹ ã±ãŒã¹çšã«äœ¿ãæšãŠã®ãªã³ããã³ã ã³ã³ãããŒãããããžã§ãã³ã°ããããã®ãªãŒãã³ ãœãŒã¹ ãã¬ãŒã ã¯ãŒã¯ã§ãã ãã¹ãã³ã³ããã䜿çšãããšãããŒã¿ããŒã¹ãã¡ãã»ãŒãžãããŒã«ãŒãWebãã©ãŠã¶ããŸãã¯Dockerã³ã³ããã§å®è¡ã§ããã»ãŒãã¹ãŠã®ãã®ãç°¡åã«æäœã§ããŸãã
Bazel ãš Testcontainers ãäžç·ã«äœ¿çšãããšãæ¬¡ã®æ©èœãæäŸãããŸãã
- Bazel ã¯ãCãC++ãJavaãGoãPythonãNode.js ãªã©ã®ããŸããŸãªããã°ã©ãã³ã°èšèªã䜿çšããŠãããžã§ã¯ãããã«ãã§ããŸãã
- Bazel ã¯ãåé¢ããããã«ã / ãã¹ãç°å¢ãç®çã®èšèªããŒãžã§ã³ã§åçã«ããããžã§ãã³ã°ã§ããŸãã
- Testcontainerã¯ãå¿ èŠãªäŸåé¢ä¿ãDockerã³ã³ãããšããŠããããžã§ãã³ã°ã§ããããããã¹ãã¹ã€ãŒãã¯èªå·±å®çµåã«ãªããŸãã ããŒã¿ããŒã¹ãã¡ãã»ãŒãžãããŒã«ãŒãªã©ãå¿ èŠãªãµãŒãã¹ãæåã§äºåããããžã§ãã³ã°ããå¿ èŠã¯ãããŸãããÂ
- ãã¹ãŠã®ãã¹ãã®äŸåé¢ä¿ã¯ãTestcontainers API ã䜿çšããŠã³ãŒãã§è¡šçŸã§ãããã¹ãéã§ãã®ãããªãªãœãŒã¹ãå ±æããããšã§ãæ°å¯æ§ãæãªããªã¹ã¯ãåé¿ã§ããŸãã
Bazel ãš Testcontainers ã䜿çšããŠãããŸããŸãªèšèªã䜿çšããã¢ãžã¥ãŒã«ã§ã¢ãã¬ãããã«ãããã³ãã¹ãããæ¹æ³ãèŠãŠã¿ãŸãããã
Javaproductsã䜿çšããã¢ãžã¥ãŒã«ãšGoã䜿çšããã¢ãžã¥ãŒã«ãå«ãcustomersã¢ãã¬ããæ¢çŽ¢ããŸããã©ã¡ãã®ã¢ãžã¥ãŒã«ããªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹(PostgreSQL)ãšå¯Ÿè©±ãããã¹ãã«Testcontainersã䜿çšããŸãã
Bazel ã䜿ã£ãŠã¿ã
ãŸããBazel ã®åºæ¬æŠå¿µã«ã€ããŠçè§£ããŠãããŸããããBazel ãã€ã³ã¹ããŒã«ããæåã®æ¹æ³ã¯ã Bazelisk ã䜿çšããããšã§ãã å ¬åŒã®ã€ã³ã¹ããŒã«æé ã«åŸã£ãŠãBazeliskãã€ã³ã¹ããŒã«ããŸããã€ã³ã¹ããŒã«ãå®äºãããšãBazelisk version ã³ãã³ããš Bazel version ã³ãã³ããå®è¡ã§ããããã«ãªããŸãã
$ brew install bazelisk
$ bazel version
Bazelisk version: v1.12.0
Build label: 7.0.0
Bazel ã䜿çšããŠãããžã§ã¯ãããã«ãããåã«ããã®ã¯ãŒã¯ã¹ããŒã¹ãèšå®ããå¿ èŠããããŸããÂ
ã¯ãŒã¯ã¹ããŒã¹ã¯ããããžã§ã¯ãã®ãœãŒã¹ãã¡ã€ã«ãä¿æãããã£ã¬ã¯ããªã§ãããæ¬¡ã®ãã¡ã€ã«ãå«ãŸããŠããŸãã
- ãã®
WORKSPACE.bazelãã¡ã€ã«ã¯ããã£ã¬ã¯ããªãšãã®å 容ã Bazel ã¯ãŒã¯ã¹ããŒã¹ãšããŠèå¥ãããããžã§ã¯ãã®ãã£ã¬ã¯ããªæ§é ã®ã«ãŒãã«ãããŸãã MODULE.bazelBazel ãã©ã°ã€ã³ãžã®äŸåé¢ä¿ã宣èšãããã¡ã€ã«(ãã«ãŒã«ã»ããããšåŒã°ããŸã)ã- 1 ã€ä»¥äž
BUILD(ãŸãã¯BUILD.bazel) ãã¡ã€ã«ã«ã¯ããããžã§ã¯ãã®ããŸããŸãªéšåã®ãœãŒã¹ãšäŸåé¢ä¿ãèšè¿°ãããŠããŸãã ãã¡ã€ã«ãå«ãBUILDã¯ãŒã¯ã¹ããŒã¹å ã®ãã£ã¬ã¯ããªã¯ããã±ãŒãžã§ãã
æãåçŽãªã±ãŒã¹ã§ã¯ã MODULE.bazel ãã¡ã€ã«ã¯ç©ºã®ãã¡ã€ã«ã§ããããã¡ã€ã« BUILD ã«ã¯æ¬¡ã®ããã« 1 ã€ä»¥äžã®æ±çšã¿ãŒã²ãããå«ããããšãã§ããŸãã
genrule(
name = "foo",
outs = ["foo.txt"],
cmd_bash = "sleep 2 && echo 'Hello World' >$@",
)
genrule(
name = "bar",
outs = ["bar.txt"],
cmd_bash = "sleep 2 && echo 'Bye bye' >$@",
)
ããã§ã¯ããš ã® 2 ã€ã®ã¿ãŒã²ããããããŸãã foo barããã§ã次ã®ããã« Bazel ã䜿çšããŠãããã®ã¿ãŒã²ããããã«ãã§ããŸãã
$ bazel build //:foo <- runs only foo target, // indicates root workspace
$ bazel build //:bar <- runs only bar target
$ bazel build //... <- runs all targets
ã¢ãã¬ãã§ã® Bazel ãã«ãã®æ§æ
ããã§ã¯ãtestcontainers-bazel-demo ãªããžããªã§ Bazel ã®äœ¿çšã«ã€ããŠèª¬æããŸãããã®ãªããžããªã¯ãJavaã䜿çšããã¢ãžã¥ãŒã«ãšproductsGoã䜿çšããã¢ãžã¥ãŒã«ãå«ãcustomersã¢ãã¬ãã§ãããã®æ§é ã¯æ¬¡ã®ããã«ãªããŸãã
testcontainers-bazel-demo
|____customers
| |____BUILD.bazel
| |____src
|____products
| |____go.mod
| |____go.sum
| |____repo.go
| |____repo_test.go
| |____BUILD.bazel
|____MODULE.bazel
Bazel ã§ã¯ããããžã§ã¯ãã®çš®é¡ããšã«ç°ãªãã«ãŒã«ã䜿çšããŠãã«ãããŸãã Bazel ã¯ãJava ããã±ãŒãžã®æ§ç¯ãGo ããã±ãŒãžã®æ§ç¯ã rules_go rules_python Python ããã±ãŒãžã®æ§ç¯ãªã©ã«äœ¿çšããŸã rules_java ã
ãŸããè¿œå æ©èœãæäŸãã远å ã®ã«ãŒã«ãèªã¿èŸŒãå¿
èŠãããå ŽåããããŸãã Javaããã±ãŒãžããã«ãããã«ã¯ãå€éšã®MavenäŸåé¢ä¿ã䜿çšãããã¹ãã®å®è¡ã«JUnit 5 ã䜿çšããå ŽåããããŸãã ãã®å ŽåãMavenã®äŸåé¢ä¿ã䜿çšã§ããããã«ããŒã rules_jvm_external ããå¿
èŠããããŸããÂ
æ°ããå€éšäŸåé¢ä¿ãµãã·ã¹ãã ã§ãã Bzlmod ã䜿çšããŠãå€éšäŸåé¢ä¿ãããŒãããŸãã MODULE.bazelãã¡ã€ã«ã§ã¯ã次ã®ããã«è¿œå ã®rules_jvm_externalãã®ãcontrib_rules_jvmããŒãã§ããŸãã
bazel_dep(name = "contrib_rules_jvm", version = "0.21.4")
bazel_dep(name = "rules_jvm_external", version = "5.3")
maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven")
maven.install(
name = "maven",
artifacts = [
"org.postgresql:postgresql:42.6.0",
"ch.qos.logback:logback-classic:1.4.6",
"org.testcontainers:postgresql:1.19.3",
"org.junit.platform:junit-platform-launcher:1.10.1",
"org.junit.platform:junit-platform-reporting:1.10.1",
"org.junit.jupiter:junit-jupiter-api:5.10.1",
"org.junit.jupiter:junit-jupiter-params:5.10.1",
"org.junit.jupiter:junit-jupiter-engine:5.10.1",
],
)
use_repo(maven, "maven")
ãã¡ã€ã«å
ã® MODULE.bazel äžèšã®æ§æãçè§£ããŸãããã
- Bazel Central ã¬ãžã¹ã㪠ãã ã«ãŒã«ã
rules_jvm_externalããŒããããµãŒãããŒãã£ã® Maven äŸåé¢ä¿ã䜿çšããããã®æ¡åŒµæ©èœãããŒãããŸããã - ã¢ãŒãã£ãã¡ã¯ãæ§æã§
maven.installMaven座æšã䜿çšããŠããã¹ãŠã®Javaã¢ããªã±ãŒã·ã§ã³ã®äŸåé¢ä¿ãæ§æããŸããã - JUnit 5ãã¹ãã®å®è¡ããµããŒãããã«ãŒã«ãã¹ã€ãŒããšããŠããŒã
contrib_rules_jvmããŠããŸãã
ããã§ãããã°ã©ã ãå®è¡ã㊠@maven//:pin ãæšç§»çãªäŸåé¢ä¿ã®JSONããã¯ãã¡ã€ã«ããåŸã§äœ¿çšã§ãã圢åŒã§ rules_jvm_external äœæã§ããŸãã
bazel run @maven//:pin
çæããããã¡ã€ã«rules_jvm_external~4.5~maven~maven_install.jsonmaven_install.jsonã®ååã ã«å€æŽããŸããæ¬¡ã«ãäŸåé¢ä¿ãåºå®ããããšãåæ ããŠããæŽæ°ã MODULE.bazel ãŸãã
lock_file屿§maven.install()ã ãããŠã use_repo äŸåé¢ä¿ã®æŽæ°ã«äœ¿çšããããªããžããªãå
¬é unpinned_maven ããããã«åŒã³åºããæŽæ°ããŸãã
maven.install(
...
lock_file = "//:maven_install.json",
)
use_repo(maven, "maven", "unpinned_maven")
ããã§ãäŸåé¢ä¿ãæŽæ°ãããšãã«ã次ã®ã³ãã³ããå®è¡ããŠããã¯ãã¡ã€ã«ãæŽæ°ã§ããŸãã
ââbazel run @unpinned_maven//:pin
ãã¡ã€ã«ã§ customers/BUILD.bazel ãã«ãã¿ãŒã²ãããæ¬¡ã®ããã«æ§æããŸãããã
load(
"@bazel_tools//tools/jdk:default_java_toolchain.bzl",
"default_java_toolchain", "DEFAULT_TOOLCHAIN_CONFIGURATION", "BASE_JDK9_JVM_OPTS", "DEFAULT_JAVACOPTS"
)
default_java_toolchain(
name = "repository_default_toolchain",
configuration = DEFAULT_TOOLCHAIN_CONFIGURATION,
java_runtime = "@bazel_tools//tools/jdk:remotejdk_17",
jvm_opts = BASE_JDK9_JVM_OPTS + ["--enable-preview"],
javacopts = DEFAULT_JAVACOPTS + ["--enable-preview"],
source_version = "17",
target_version = "17",
)
load("@rules_jvm_external//:defs.bzl", "artifact")
load("@contrib_rules_jvm//java:defs.bzl", "JUNIT5_DEPS", "java_test_suite")
java_library(
name = "customers-lib",
srcs = glob(["src/main/java/**/*.java"]),
deps = [
artifact("org.postgresql:postgresql"),
artifact("ch.qos.logback:logback-classic"),
],
)
java_library(
name = "customers-test-resources",
resources = glob(["src/test/resources/**/*"]),
)
java_test_suite(
name = "customers-lib-tests",
srcs = glob(["src/test/java/**/*.java"]),
runner = "junit5",
test_suffixes = [
"Test.java",
"Tests.java",
],
runtime_deps = JUNIT5_DEPS,
deps = [
":customers-lib",
":customers-test-resources",
artifact("org.junit.jupiter:junit-jupiter-api"),
artifact("org.junit.jupiter:junit-jupiter-params"),
artifact("org.testcontainers:postgresql"),
],
)
ãã® BUILD æ§æãçè§£ããŸãããã
- JavaããŒãžã§ã³ãããŒã
default_java_toolchainããŠæ§æããŸãã 17. - æ¬çªjarãã¡ã€ã«ããã«ãããåå
customers-libã®ã¿ãŒã²ãããæ§æãjava_libraryãŸããã - ãã¹ãŠã®ãã¹ããå®è¡ãããã¹ãã¹ã€ãŒããå®çŸ©ããåå
customers-lib-testsãæã€ã¿ãŒã²ãããå®çŸ©ãjava_test_suiteãŸããããŸããä»ã®ã¿ãŒã²ããcustomers-libãšå€éšã®äŸåé¢ä¿ãžã®äŸåé¢ä¿ãæ§æããŸããã - ãŸããJava以å€ã®ãœãŒã¹(ãã°èšå®ãã¡ã€ã«ãªã©)ãäŸåé¢ä¿ãšããŠãã¹ãã¹ã€ãŒãã¿ãŒã²ããã«è¿œå ããããã«ãå¥ã®
customers-test-resourcesã¿ãŒã²ãããååã§å®çŸ©ããŸããã
customersããã±ãŒãžã«ã¯ã顧客ã®è©³çްã PostgreSQL ããŒã¿ããŒã¹ã«æ ŒçŽããã³ååŸããã¯ã©ã¹ããããŸãCustomerServiceããããŠã ã䜿çšããŠã¡ãœããTestcontainersããã¹ããCustomerServiceãŸãCustomerServiceTestãå®å
šãªã³ãŒãã«ã€ããŠã¯ã GitHub ãªããžã㪠ãåç
§ããŠãã ããã
æèšïŒ Bazel ãã«ã ãã¡ã€ã« ãžã§ãã¬ãŒã¿ã§ãã Gazelle ã䜿çšããŠãæåã§ãã¡ã€ã«ãæžã蟌ã代ããã«ãã¡ã€ã«ãçæ BUILD.bazel ã§ããŸãã
Testcontainers ãã¹ãã®å®è¡
Testcontainers ãã¹ããå®è¡ããã«ã¯ãTestcontainers ããµããŒãããã³ã³ãã㌠ã©ã³ã¿ã€ã ãå¿ èŠã§ãã Docker Desktop ã䜿çšããŠããŒã«ã«ã® Docker ãã€ã³ã¹ããŒã«ãããŠãããšããŸãã
ããã§ãBazel ãã«ãæ§æã§ãããã±ãŒãžã customers ãã«ãããŠãã¹ãããæºåãæŽããŸããã
# to run all build targets of customers package
$ bazel build //customers/...
# to run a specific build target of customers package
$ bazel build //customers:customers-lib
# to run all test targets of customers package
$ bazel test //customers/...
# to run a specific test target of customers package
$ bazel test //customers:customers-lib-tests
ãã«ããåããŠå®è¡ãããšãã¯ãå¿ èŠãªäŸåé¢ä¿ãããŠã³ããŒãããŠããã¿ãŒã²ãããå®è¡ããã®ã«æéãããããŸãã ãã ããã³ãŒããæ§æã倿Žããã«ãã«ããŸãã¯ãã¹ããå詊è¡ãããšãBazel ã¯ãã«ããŸãã¯ãã¹ããåå®è¡ããããã£ãã·ã¥ãããçµæã衚瀺ããŸãã Bazel ã«ã¯ãã³ãŒãã®å€æŽãæ€åºããå®è¡ã«å¿ èŠãªã¿ãŒã²ããã®ã¿ãå®è¡ãã匷åãªãã£ãã·ã¥ ã¡ã«ããºã ããããŸãã
Testcontainers ã䜿çšããéã«ã¯ãDocker ã€ã¡ãŒãžåãšã¿ã° (Postgres:16ãªã©) ã䜿çšããŠãå¿ èŠãªäŸåé¢ä¿ãã³ãŒãã®äžéšãšããŠå®çŸ©ããŸãã ãã®ãããã³ãŒã(Docker ã€ã¡ãŒãžåãã¿ã°ãªã©)ã倿ŽããªãéããBazel ã¯ãã¹ãçµæããã£ãã·ã¥ããŸãã
åæ§ã«ãGo ããã±ãŒãžçšã« Bazel ãã«ããæ§æããããã« Gazelle ã䜿çšã§ããŸã rules_go ã Go ããã±ãŒãžã§ã® Bazel ã®æ§æã®è©³çްã«ã€ããŠã¯ã MODULE.bazel ãš products/BUILD.bazel ãã¡ã€ã«ãåç
§ããŠãã ããã
åè¿°ããããã«ãTestcontainers ãã¹ããå®è¡ããã«ã¯ãTestcontainers ã§ãµããŒããããŠããã³ã³ãã㌠ã©ã³ã¿ã€ã ãå¿ èŠã§ãã è€é㪠CI ãã©ãããã©ãŒã ã« Docker ãã€ã³ã¹ããŒã«ããã®ã¯å°é£ãªå Žåããããè€é㪠Docker-in-Docker ã»ããã¢ããã䜿çšããå¿ èŠãããå ŽåããããŸãã ããã«ãäžéšã®Dockerã€ã¡ãŒãžã¯ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¢ãŒããã¯ãã£ãšäºææ§ããªãå ŽåããããŸã(äŸ:Apple M1)ãÂ
Testcontainers Cloud ã¯ãlocalhostãŸãã¯CIã©ã³ããŒã«Dockerãé 眮ããã¯ã©ãŠãVMäžã§ã³ã³ãããééçã«å®è¡ããå¿ èŠæ§ãæé€ããããšã§ããããã®åé¡ã解決ããŸãã
GitHub Actions ã䜿çšã㊠Testcontainers Cloud ã§ Bazel ã䜿çšã㊠Testcontainers ãã¹ããå®è¡ããäŸã次ã«ç€ºããŸãã
name: CI
on:
push:
branches:
- '**'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Configure TestContainers cloud
uses: atomicjar/testcontainers-cloud-setup-action@main
with:
wait: true
token: ${{ secrets.TC_CLOUD_TOKEN }}
- name: Cache Bazel
uses: actions/cache@v3
with:
path: |
~/.cache/bazel
key: ${{ runner.os }}-bazel-${{ hashFiles('.bazelversion', '.bazelrc', 'WORKSPACE', 'WORKSPACE.bazel', 'MODULE.bazel') }}
restore-keys: |
${{ runner.os }}-bazel-
- name: Build and Test
run: bazel test --test_output=all //...
GitHub Actions ã©ã³ããŒã«ã¯ãã§ã« Bazelisk ãã€ã³ã¹ããŒã«ãããŠãããããããã« Bazel ã䜿çšã§ããŸãã Secretsã䜿çšããŠç°å¢å€æ°ãèšå®ã TC_CLOUD_TOKEN ãTestcontainers CloudãšãŒãžã§ã³ããéå§ããŸããã ãã«ããã°ã確èªãããšãTestcontainers Cloudã䜿çšããŠãã¹ããå®è¡ãããŠããããšãããããŸãã
æŠèŠ
Bazel ãã«ãã·ã¹ãã ã䜿çšããŠãç°ãªãããã°ã©ãã³ã°èšèªã䜿çšããè€æ°ã®ã¢ãžã¥ãŒã«ã§ã¢ãã¬ãããã«ãããã³ãã¹ãããæ¹æ³ã瀺ããŸããã Testcontainers ãšçµã¿åãããããšã§ããã«ããèªå·±å®çµåã§å¯éåã«ããããšãã§ããŸãã
Bazel ãš Testcontainers ã¯èªå·±å®çµåã®ãã«ãã«åœ¹ç«ã¡ãŸãããå¯éåãã«ãã«ããã«ã¯è¿œå ã®å¯Ÿçãè¬ããå¿ èŠããããŸããÂ
- Bazel ã¯ãJDK 17ã Go 1ãªã©ãç¹å®ã®ããŒãžã§ã³ã® SDK ã䜿çšããããã«èšå®ã§ããŸãã20ãªã©ããã«ãããã¹ããã·ã³ã«ã€ã³ã¹ããŒã«ãããŠããããŒãžã§ã³ã§ã¯ãªããåžžã«åãããŒãžã§ã³ã䜿çšããããã«ããŸããÂ
- Testcontainers ãã¹ãã§ã¯ãã³ã³ãããŒã®äŸåé¢ä¿ã« Docker ã¿ã° latest ã䜿çšãããšãéæ±ºå®è«çãªåäœãçºçããå¯èœæ§ããããŸãã ãŸããäžéšã® Docker ã€ã¡ãŒãžçºè¡å ã¯ãåãã¿ã°ã䜿çšããŠæ¢åã®ã€ã¡ãŒãžããªãŒããŒã©ã€ãããŸãã ãã«ã/ãã¹ããæ±ºå®è«çã«ããã«ã¯ãåžžã« Docker ã€ã¡ãŒãž ãã€ãžã§ã¹ãã䜿çšããŠããã«ããšãã¹ãã§åžžã«ãŸã£ããåãããŒãžã§ã³ã®ã€ã¡ãŒãžã䜿çšããåçŸå¯èœã§å¯éããããã«ããæäŸããããã«ããŸãã
- Testcontainers Cloud ã䜿çšã㊠Testcontainers ãã¹ããå®è¡ãããšãDocker ã»ããã¢ããã®è€éãã軜æžãããæ±ºå®è«çãªã³ã³ãã㌠ã©ã³ã¿ã€ã ç°å¢ãæäŸãããŸãã
詳现ã«ã€ããŠã¯ã Testcontainers ã® Web ãµã€ã ã«ã¢ã¯ã»ã¹ãã ç¡æã®ã¢ã«ãŠã³ããäœæã㊠Testcontainers Cloud ã®äœ¿çšãéå§ããŠãã ããã
ããã«è©³ãã
- Testcontainers ã® Web ãµã€ãã«ã¢ã¯ã»ã¹ããŸãã
- ç¡æã¢ã«ãŠã³ããäœæããŠãTestcontainers Cloud ã®äœ¿çšãéå§ããŠãã ããã
- Docker ãã¹ã¯ãããã®ææ°ãªãªãŒã¹ãå ¥æããŸãã
- 質åããããŸãã? Docker ã³ãã¥ããã£ããæäŒãããŸãã
- ããã«ãŒã¯åããŠã§ãã? å§ããŸãããã