Skip to main content

shuttle_builder/
lib.rs

1use askama::Template;
2use shuttle_common::models::deployment::BuildArgsRust;
3
4#[derive(Template)]
5#[template(path = "rust.Dockerfile.jinja2", escape = "none")]
6pub struct RustDockerfile<'a> {
7    /// local or remote image name for the chef image
8    pub chef_image: &'a str,
9    /// content of inlined chef dockerfile
10    pub cargo_chef_dockerfile: Option<&'a str>,
11    /// local or remote image name for the runtime image
12    pub runtime_image: &'a str,
13    /// content of inlined runtime dockerfile
14    pub runtime_base_dockerfile: Option<&'a str>,
15    pub build_args: &'a BuildArgsRust,
16}
17
18pub fn render_rust_dockerfile(build_args: &BuildArgsRust) -> String {
19    RustDockerfile {
20        chef_image: "cargo-chef",
21        cargo_chef_dockerfile: Some(include_str!("../templates/cargo-chef.Dockerfile")),
22        runtime_image: "runtime-base",
23        runtime_base_dockerfile: Some(include_str!("../templates/runtime-base.Dockerfile")),
24        build_args,
25    }
26    .render()
27    .unwrap()
28}
29
30#[cfg(test)]
31mod tests {
32    use super::*;
33    use pretty_assertions::assert_str_eq;
34
35    #[test]
36    fn rust_basic() {
37        let t = RustDockerfile {
38            chef_image: "chef",
39            cargo_chef_dockerfile: Some("foo"),
40            runtime_image: "rt",
41            runtime_base_dockerfile: Some("bar"),
42            build_args: &BuildArgsRust {
43                package_name: Some("hello".into()),
44                features: Some("asdf".into()),
45                ..Default::default()
46            },
47        };
48
49        let s = t.render().unwrap();
50
51        assert!(s.contains("foo\n\n"));
52        assert!(s.contains("bar\n\n"));
53        assert!(s.contains("FROM chef AS chef"));
54        assert!(s.contains("FROM rt AS runtime"));
55        assert!(s.contains("RUN cargo chef cook --release --package hello --features asdf\n"));
56        assert!(s.contains("mv /app/target/release/hello"));
57    }
58
59    #[test]
60    fn rust_full() {
61        let s = render_rust_dockerfile(&BuildArgsRust {
62            package_name: Some("hello".into()),
63            features: Some("asdf".into()),
64            ..Default::default()
65        });
66        assert_str_eq!(s, include_str!("../tests/rust.Dockerfile"));
67    }
68}