Skip to content

Commit cffd56f

Browse files
committed
Add custom docker image support
1 parent 31c864e commit cffd56f

File tree

4 files changed

+45
-12
lines changed

4 files changed

+45
-12
lines changed

Cargo.lock

+23-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ schemamama = "0.3"
4343
schemamama_postgres = "0.3"
4444
systemstat = "0.1.4"
4545
prometheus = { version = "0.10.0", default-features = false }
46-
rustwide = "0.11"
46+
rustwide = { path = "../rustwide" } # "0.11"
4747
mime_guess = "2"
4848
dotenv = "0.15"
4949
zstd = "0.5"

crates/metadata/lib.rs

+9
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ pub enum MetadataError {
9595
/// targets = [ "x86_64-apple-darwin", "x86_64-pc-windows-msvc" ]
9696
/// rustc-args = [ "--example-rustc-arg" ]
9797
/// rustdoc-args = [ "--example-rustdoc-arg" ]
98+
/// docker-image = "rustops/crates-build-env"
9899
/// ```
99100
///
100101
/// You can define one or more fields in your `Cargo.toml`.
@@ -128,6 +129,9 @@ pub struct Metadata {
128129
/// List of command line arguments for `rustdoc`.
129130
#[serde(default)]
130131
rustdoc_args: Vec<String>,
132+
133+
/// Custom docker image.
134+
docker_image: Option<String>,
131135
}
132136

133137
/// The targets that should be built for a crate.
@@ -277,6 +281,11 @@ impl Metadata {
277281
map.insert("DOCS_RS", "1".into());
278282
map
279283
}
284+
285+
/// Return the custom docker image, if provided.
286+
pub fn docker_image(&self) -> Option<String> {
287+
self.docker_image.clone()
288+
}
280289
}
281290

282291
impl std::str::FromStr for Metadata {

src/docbuilder/rustwide_builder.rs

+12-8
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,15 @@ impl RustwideBuilder {
106106
self.skip_build_if_exists = should;
107107
}
108108

109-
fn prepare_sandbox(&self, limits: &Limits) -> SandboxBuilder {
110-
SandboxBuilder::new()
109+
fn prepare_sandbox(&self, metadata: &Metadata, limits: &Limits) -> Result<SandboxBuilder> {
110+
let mut builder = SandboxBuilder::new()
111111
.cpu_limit(self.config.build_cpu_limit.map(|limit| limit as f32))
112112
.memory_limit(Some(limits.memory()))
113-
.enable_networking(limits.networking())
113+
.enable_networking(limits.networking());
114+
if let Some(image) = metadata.docker_image() {
115+
builder = builder.image(SandboxImage::remote(&image)?)
116+
}
117+
Ok(builder)
114118
}
115119

116120
pub fn update_toolchain(&mut self) -> Result<()> {
@@ -208,11 +212,11 @@ impl RustwideBuilder {
208212
let krate = Crate::crates_io(DUMMY_CRATE_NAME, DUMMY_CRATE_VERSION);
209213
krate.fetch(&self.workspace)?;
210214

215+
let metadata = Metadata::from_crate_root(&build_dir.build_dir())?;
216+
211217
build_dir
212-
.build(&self.toolchain, &krate, self.prepare_sandbox(&limits))
218+
.build(&self.toolchain, &krate, self.prepare_sandbox(&metadata, &limits)?)
213219
.run(|build| {
214-
let metadata = Metadata::from_crate_root(&build.host_source_dir())?;
215-
216220
let res = self.execute_build(HOST_TARGET, true, build, &limits, &metadata)?;
217221
if !res.result.successful {
218222
failure::bail!("failed to build dummy crate for {}", self.rustc_version);
@@ -322,14 +326,14 @@ impl RustwideBuilder {
322326

323327
let local_storage = tempfile::Builder::new().prefix("docsrs-docs").tempdir()?;
324328

329+
let metadata = Metadata::from_crate_root(&build_dir.build_dir())?;
325330
let res = build_dir
326-
.build(&self.toolchain, &krate, self.prepare_sandbox(&limits))
331+
.build(&self.toolchain, &krate, self.prepare_sandbox(&metadata, &limits)?)
327332
.run(|build| {
328333
use docsrs_metadata::BuildTargets;
329334

330335
let mut has_docs = false;
331336
let mut successful_targets = Vec::new();
332-
let metadata = Metadata::from_crate_root(&build.host_source_dir())?;
333337
let BuildTargets {
334338
default_target,
335339
other_targets,

0 commit comments

Comments
 (0)