-
Notifications
You must be signed in to change notification settings - Fork 152
feat!: container-centric API with refactored underlying layer #575
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Quite large refactoring as part of project revamp #563, and also the long-awaited refactoring #386 Closes #386 Closes #326 Closes #475 Closes #508 Closes #392 Closes #561 Closes #559 MSRV was bumped to `1.70` in order to use `std::sync::OnceLock`. This should NOT be a problem, tests usually executed on more recent versions (also see [this ref](https://github.com/testcontainers/testcontainers-rs/pull/503/files#r1242651354)).
# Conflicts: # Cargo.toml # testcontainers/Cargo.toml
Update of underlying `testcontainers` core crate. It contains breaking changes of API, see testcontainers/testcontainers-rs#575
Update of underlying `testcontainers` core crate. It contains breaking changes of API, see testcontainers/testcontainers-rs#575
## 🤖 New release * `testcontainers`: 0.15.0 -> 0.16.0 (⚠️ API breaking changes) ###⚠️ `testcontainers` breaking changes ``` --- failure constructible_struct_adds_private_field: struct no longer constructible due to new private field --- Description: A struct constructible with a struct literal has a new non-public field. It can no longer be constructed using a struct literal outside of its crate. ref: https://doc.rust-lang.org/reference/expressions/struct-expr.html impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.31.0/src/lints/constructible_struct_adds_private_field.ron Failed in: field ExecCommand.cmd_ready_condition in /tmp/.tmp8FBROu/testcontainers-rs/testcontainers/src/core/image/exec_command.rs:6 field ExecCommand.container_ready_conditions in /tmp/.tmp8FBROu/testcontainers-rs/testcontainers/src/core/image/exec_command.rs:7 --- failure enum_missing: pub enum removed or renamed --- Description: A publicly-visible enum cannot be imported by its prior path. A `pub use` may have been removed, or the enum itself may have been renamed or removed entirely. ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.31.0/src/lints/enum_missing.ron Failed in: enum testcontainers::core::env::Command, previously in file /tmp/.tmpkl2iBT/testcontainers/src/core/env.rs:36 --- failure function_missing: pub fn removed or renamed --- Description: A publicly-visible function cannot be imported by its prior path. A `pub use` may have been removed, or the function itself may have been renamed or removed entirely. ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.31.0/src/lints/function_missing.ron Failed in: function testcontainers::core::env::command, previously in file /tmp/.tmpkl2iBT/testcontainers/src/core/env.rs:4 --- failure inherent_method_missing: pub method removed or renamed --- Description: A publicly-visible method or associated fn is no longer available under its prior name. It may have been renamed or removed entirely. ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.31.0/src/lints/inherent_method_missing.ron Failed in: ContainerAsync::get_host_port, previously in file /tmp/.tmpkl2iBT/testcontainers/src/core/container_async.rs:68 ContainerAsync::get_host_port, previously in file /tmp/.tmpkl2iBT/testcontainers/src/core/container_async.rs:68 Container::get_host_port, previously in file /tmp/.tmpkl2iBT/testcontainers/src/core/container.rs:124 Container::get_host_port, previously in file /tmp/.tmpkl2iBT/testcontainers/src/core/container.rs:124 ContainerState::host_port, previously in file /tmp/.tmpkl2iBT/testcontainers/src/core/image.rs:120 GenericImage::with_volume, previously in file /tmp/.tmpkl2iBT/testcontainers/src/images/generic.rs:45 RunnableImage::inner, previously in file /tmp/.tmpkl2iBT/testcontainers/src/core/image.rs:163 RunnableImage::volumes, previously in file /tmp/.tmpkl2iBT/testcontainers/src/core/image.rs:183 RunnableImage::with_volume, previously in file /tmp/.tmpkl2iBT/testcontainers/src/core/image.rs:255 RunnableImage::inner, previously in file /tmp/.tmpkl2iBT/testcontainers/src/core/image.rs:163 RunnableImage::volumes, previously in file /tmp/.tmpkl2iBT/testcontainers/src/core/image.rs:183 RunnableImage::with_volume, previously in file /tmp/.tmpkl2iBT/testcontainers/src/core/image.rs:255 --- failure module_missing: pub module removed or renamed --- Description: A publicly-visible module cannot be imported by its prior path. A `pub use` may have been removed, or the module may have been renamed, removed, or made non-public. ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.31.0/src/lints/module_missing.ron Failed in: mod testcontainers::core::env, previously in file /tmp/.tmpkl2iBT/testcontainers/src/core/env.rs:1 mod testcontainers::clients, previously in file /tmp/.tmpkl2iBT/testcontainers/src/clients.rs:1 --- failure struct_missing: pub struct removed or renamed --- Description: A publicly-visible struct cannot be imported by its prior path. A `pub use` may have been removed, or the struct itself may have been renamed or removed entirely. ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.31.0/src/lints/struct_missing.ron Failed in: struct testcontainers::core::env::Os, previously in file /tmp/.tmpkl2iBT/testcontainers/src/core/env.rs:26 struct testcontainers::clients::Http, previously in file /tmp/.tmpkl2iBT/testcontainers/src/clients/http.rs:23 struct testcontainers::core::Port, previously in file /tmp/.tmpkl2iBT/testcontainers/src/core/image.rs:312 struct testcontainers::clients::Cli, previously in file /tmp/.tmpkl2iBT/testcontainers/src/clients/cli.rs:22 --- failure struct_pub_field_missing: pub struct's pub field removed or renamed --- Description: A publicly-visible struct has at least one public field that is no longer available under its prior name. It may have been renamed or removed entirely. ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.31.0/src/lints/struct_pub_field_missing.ron Failed in: field cmd of struct ExecCommand, previously in file /tmp/.tmpkl2iBT/testcontainers/src/core/image.rs:101 field ready_conditions of struct ExecCommand, previously in file /tmp/.tmpkl2iBT/testcontainers/src/core/image.rs:103 --- failure struct_pub_field_now_doc_hidden: pub struct field is now #[doc(hidden)] --- Description: A pub field of a pub struct is now marked #[doc(hidden)] and is no longer part of the public API. ref: https://doc.rust-lang.org/rustdoc/write-documentation/the-doc-attribute.html#hidden impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.31.0/src/lints/struct_pub_field_now_doc_hidden.ron Failed in: field ExecCommand.cmd in file /tmp/.tmp8FBROu/testcontainers-rs/testcontainers/src/core/image/exec_command.rs:4 --- failure trait_method_missing: pub trait method removed or renamed --- Description: A trait method is no longer callable, and may have been renamed or removed entirely. ref: https://doc.rust-lang.org/cargo/reference/semver.html#major-any-change-to-trait-item-signatures impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.31.0/src/lints/trait_method_missing.ron Failed in: method volumes of trait Image, previously in file /tmp/.tmpkl2iBT/testcontainers/src/core/image.rs:70 method volumes of trait Image, previously in file /tmp/.tmpkl2iBT/testcontainers/src/core/image.rs:70 --- failure trait_missing: pub trait removed or renamed --- Description: A publicly-visible trait cannot be imported by its prior path. A `pub use` may have been removed, or the trait itself may have been renamed or removed entirely. ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.31.0/src/lints/trait_missing.ron Failed in: trait testcontainers::core::env::GetEnvValue, previously in file /tmp/.tmpkl2iBT/testcontainers/src/core/env.rs:20 ``` <details><summary><i><b>Changelog</b></i></summary><p> <blockquote> ## [0.16.0] - 2024-04-27 ### Details #### Bug Fixes - Use the binds option instead of volumes for mounts ([#581](#581)) #### Documentation - Mention a way to preserve running containers ([#586](#586)) #### Features - Support for docker cli flag `--add-host` ([#547](#547)) - Allow to override args in a `RunnableImage` ([#558](#558)) - Add `name` parameter to `RunnableImage` ([#549](#549)) - [❗] Container-centric API with refactored underlying layer ([#575](#575)) - Add ability to pull-image explicitly ([#579](#579)) #### Miscellaneous Tasks - Remove `spectral` from `dev-dependencies` ([#526](#526)) - Update reqwest requirement from 0.11.14 to 0.12.3 ([#569](#569)) - Update bollard and bollard-stubs ([#574](#574)) - Reuse workspace level configs ([#568](#568)) #### Refactor - [❗] Api for mounts and volumes ([#596](#596)) #### Styling - Derive `Default` to fix clippy lint ([#525](#525)) - Actualize formatting configs ([#567](#567)) - Enable `StdExternalCrate` grouping </blockquote> </p></details> --- This PR was generated with [release-plz](https://github.com/MarcoIeni/release-plz/). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
The CHANGELOG that references this PR:
does not contain enough information. The main way users were starting containers (Cli) was entirely removed, and the upgrade path had to be discovered in the comment of this PR. |
Hi @kaspar-p 👋 All the changes has been planned and performed more than year ago. I apologize if it's not clear enough, but we had, at least:
The thing is that changelog is automatically generated based on conventional commits and it highlights breaking changes. So the description of the PR is still relevant place too, because changelog refers to it. |
That's fine, just giving an experience of how I was driven to these changes. I did I think for folks new to testcontainers, your existing paths are good coverage, just giving an anecdote on how already-using users might see. Maybe the migration guide could be ported to the changelog? That would have been perfect for me. But if you feel most users know that that's where to look, I'm OK being the odd one out :). |
This is all fair, ofc. I think we can add links to the migration guides in the changelog. That way it's clear that there is a separate guide However, I have limited bandwidth and can't prioritize this ASAP, so any PRs are welcome 🙏 |
Quite large refactoring as part of project revamp #563, and also the long-awaited refactoring #386
Now it's really simple API, e.g:
I find this new API much easier to use, solves a lot of problems, and seems flexible enough to be extended.
This also works regardless of the tokio runtime flavor (multi-thread vs current-thread). And the sync API is still available, right under
blocking
feature (just likereqwest
does).From a maintainer's perspective this also simplifies the code, we don't have to worry about two different clients and their differences.
Docker host resolution
The host is resolved in the following order:
tc.host
property in the~/.testcontainers.properties
file.DOCKER_HOST
environment variable.~/.testcontainers.properties
file.Notes
1.70
in order to usestd::sync::OnceLock
. This should NOT be a problem, tests usually executed on more recent versions (also see this ref).Cli
client is removed, instead we providesync
(underblocking
feature) andasync
impls based on HTTP client (bollard)Migration guide
Cli
client)blocking
featureclients::Cli
use testcontainers::runners::SyncRunner;
client.run(image)
withimage.start()
Http
client)experimental
featureclients::Http
use testcontainers::runners::AsyncRunner;
client.run(image)
withimage.start()
TESTCONTAINERS
was renamed toTESTCONTAINERS_COMMAND
and still accepts eitherremove
(default to remove containers on drop) orkeep
ExecCommand
interface was changed to builder-like:ExecCommand::new(cmd)
instead ofExecCommand { ... }
cmd
isVec<String>
now, so make sure your commands are separatedwith_container_ready_conditions
&with_cmd_ready_condition
References
Closes #386
Closes #326
Closes #475
Closes #508
Closes #392
Closes #561
Closes #559
Closes #564
Closes #538
Closes #507
Closes #89
Closes #198