Переглянути джерело

Allow passing env vars to verifiable build container (#2325)

riordanp 2 роки тому
батько
коміт
8856aee7df
2 змінених файлів з 59 додано та 1 видалено
  1. 4 0
      CHANGELOG.md
  2. 55 1
      cli/src/lib.rs

+ 4 - 0
CHANGELOG.md

@@ -10,6 +10,10 @@ The minor version will be incremented upon a breaking change and the patch versi
 
 ## [Unreleased]
 
+### Features
+
+- cli: Add `env` option to verifiable builds ([#2325](https://github.com/coral-xyz/anchor/pull/2325)).
+
 ## [0.26.0] - 2022-12-15
 
 ### Features

+ 55 - 1
cli/src/lib.rs

@@ -101,6 +101,9 @@ pub enum Command {
         /// verifiable builds. Only works for debian-based images.
         #[clap(value_enum, short, long, default_value = "none")]
         bootstrap: BootstrapMode,
+        /// Environment variables to pass into the docker container
+        #[clap(short, long, required = false)]
+        env: Vec<String>,
         /// Arguments to pass to the underlying `cargo build-bpf` command
         #[clap(required = false, last = true)]
         cargo_args: Vec<String>,
@@ -141,6 +144,9 @@ pub enum Command {
         /// verifiable builds. Only works for debian-based images.
         #[clap(value_enum, short, long, default_value = "none")]
         bootstrap: BootstrapMode,
+        /// Environment variables to pass into the docker container
+        #[clap(short, long, required = false)]
+        env: Vec<String>,
         /// Arguments to pass to the underlying `cargo build-bpf` command.
         #[clap(required = false, last = true)]
         cargo_args: Vec<String>,
@@ -172,6 +178,9 @@ pub enum Command {
         #[clap(long)]
         run: Vec<String>,
         args: Vec<String>,
+        /// Environment variables to pass into the docker container
+        #[clap(short, long, required = false)]
+        env: Vec<String>,
         /// Arguments to pass to the underlying `cargo build-bpf` command.
         #[clap(required = false, last = true)]
         cargo_args: Vec<String>,
@@ -237,6 +246,9 @@ pub enum Command {
     Publish {
         /// The name of the program to publish.
         program: String,
+        /// Environment variables to pass into the docker container
+        #[clap(short, long, required = false)]
+        env: Vec<String>,
         /// Arguments to pass to the underlying `cargo build-bpf` command.
         #[clap(required = false, last = true)]
         cargo_args: Vec<String>,
@@ -264,6 +276,9 @@ pub enum Command {
         /// no "CHECK" comments where normally required
         #[clap(long)]
         skip_lint: bool,
+        /// Environment variables to pass into the docker container
+        #[clap(short, long, required = false)]
+        env: Vec<String>,
         /// Arguments to pass to the underlying `cargo build-bpf` command.
         #[clap(required = false, last = true)]
         cargo_args: Vec<String>,
@@ -387,6 +402,7 @@ pub fn entry(opts: Opts) -> Result<()> {
             docker_image,
             bootstrap,
             cargo_args,
+            env,
             skip_lint,
             no_docs,
         } => build(
@@ -401,6 +417,7 @@ pub fn entry(opts: Opts) -> Result<()> {
             bootstrap,
             None,
             None,
+            env,
             cargo_args,
             no_docs,
         ),
@@ -410,6 +427,7 @@ pub fn entry(opts: Opts) -> Result<()> {
             solana_version,
             docker_image,
             bootstrap,
+            env,
             cargo_args,
         } => verify(
             &opts.cfg_override,
@@ -418,6 +436,7 @@ pub fn entry(opts: Opts) -> Result<()> {
             solana_version,
             docker_image,
             bootstrap,
+            env,
             cargo_args,
         ),
         Command::Clean => clean(&opts.cfg_override),
@@ -442,6 +461,7 @@ pub fn entry(opts: Opts) -> Result<()> {
             detach,
             run,
             args,
+            env,
             cargo_args,
             skip_lint,
         } => test(
@@ -453,6 +473,7 @@ pub fn entry(opts: Opts) -> Result<()> {
             detach,
             run,
             args,
+            env,
             cargo_args,
         ),
         #[cfg(feature = "dev")]
@@ -466,20 +487,23 @@ pub fn entry(opts: Opts) -> Result<()> {
         Command::Login { token } => login(&opts.cfg_override, token),
         Command::Publish {
             program,
+            env,
             cargo_args,
             skip_build,
-        } => publish(&opts.cfg_override, program, cargo_args, skip_build),
+        } => publish(&opts.cfg_override, program, env, cargo_args, skip_build),
         Command::Keys { subcmd } => keys(&opts.cfg_override, subcmd),
         Command::Localnet {
             skip_build,
             skip_deploy,
             skip_lint,
+            env,
             cargo_args,
         } => localnet(
             &opts.cfg_override,
             skip_build,
             skip_deploy,
             skip_lint,
+            env,
             cargo_args,
         ),
         Command::Account {
@@ -790,6 +814,7 @@ pub fn build(
     bootstrap: BootstrapMode,
     stdout: Option<File>, // Used for the package registry server.
     stderr: Option<File>, // Used for the package registry server.
+    env_vars: Vec<String>,
     cargo_args: Vec<String>,
     no_docs: bool,
 ) -> Result<()> {
@@ -835,6 +860,7 @@ pub fn build(
             &build_config,
             stdout,
             stderr,
+            env_vars,
             cargo_args,
             skip_lint,
             no_docs,
@@ -848,6 +874,7 @@ pub fn build(
             &build_config,
             stdout,
             stderr,
+            env_vars,
             cargo_args,
             skip_lint,
             no_docs,
@@ -861,6 +888,7 @@ pub fn build(
             &build_config,
             stdout,
             stderr,
+            env_vars,
             cargo_args,
             skip_lint,
             no_docs,
@@ -881,6 +909,7 @@ fn build_all(
     build_config: &BuildConfig,
     stdout: Option<File>, // Used for the package registry server.
     stderr: Option<File>, // Used for the package registry server.
+    env_vars: Vec<String>,
     cargo_args: Vec<String>,
     skip_lint: bool,
     no_docs: bool,
@@ -898,6 +927,7 @@ fn build_all(
                     build_config,
                     stdout.as_ref().map(|f| f.try_clone()).transpose()?,
                     stderr.as_ref().map(|f| f.try_clone()).transpose()?,
+                    env_vars.clone(),
                     cargo_args.clone(),
                     skip_lint,
                     no_docs,
@@ -920,6 +950,7 @@ fn build_cwd(
     build_config: &BuildConfig,
     stdout: Option<File>,
     stderr: Option<File>,
+    env_vars: Vec<String>,
     cargo_args: Vec<String>,
     skip_lint: bool,
     no_docs: bool,
@@ -937,6 +968,7 @@ fn build_cwd(
             stdout,
             stderr,
             skip_lint,
+            env_vars,
             cargo_args,
             no_docs,
         ),
@@ -953,6 +985,7 @@ fn build_cwd_verifiable(
     stdout: Option<File>,
     stderr: Option<File>,
     skip_lint: bool,
+    env_vars: Vec<String>,
     cargo_args: Vec<String>,
     no_docs: bool,
 ) -> Result<()> {
@@ -975,6 +1008,7 @@ fn build_cwd_verifiable(
         build_config,
         stdout,
         stderr,
+        env_vars,
         cargo_args,
     );
 
@@ -1014,6 +1048,7 @@ fn build_cwd_verifiable(
     result
 }
 
+#[allow(clippy::too_many_arguments)]
 fn docker_build(
     cfg: &WithPath<Config>,
     container_name: &str,
@@ -1021,6 +1056,7 @@ fn docker_build(
     build_config: &BuildConfig,
     stdout: Option<File>,
     stderr: Option<File>,
+    env_vars: Vec<String>,
     cargo_args: Vec<String>,
 ) -> Result<()> {
     let binary_name = Manifest::from_path(&cargo_toml)?.lib_name()?;
@@ -1074,6 +1110,7 @@ fn docker_build(
             binary_name,
             stdout,
             stderr,
+            env_vars,
             cargo_args,
         )
     });
@@ -1137,6 +1174,7 @@ fn docker_build_bpf(
     binary_name: String,
     stdout: Option<File>,
     stderr: Option<File>,
+    env_vars: Vec<String>,
     cargo_args: Vec<String>,
 ) -> Result<()> {
     let manifest_path =
@@ -1154,6 +1192,13 @@ fn docker_build_bpf(
             "exec",
             "--env",
             "PATH=/root/.local/share/solana/install/active_release/bin:/root/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
+        ])
+        .args(env_vars
+            .iter()
+            .map(|x| ["--env", x.as_str()])
+            .collect::<Vec<[&str; 2]>>()
+            .concat())
+        .args([
             container_name,
             "cargo",
             "build-bpf",
@@ -1292,6 +1337,7 @@ fn _build_cwd(
     Ok(())
 }
 
+#[allow(clippy::too_many_arguments)]
 fn verify(
     cfg_override: &ConfigOverride,
     program_id: Pubkey,
@@ -1299,6 +1345,7 @@ fn verify(
     solana_version: Option<String>,
     docker_image: Option<String>,
     bootstrap: BootstrapMode,
+    env_vars: Vec<String>,
     cargo_args: Vec<String>,
 ) -> Result<()> {
     // Change to the workspace member directory, if needed.
@@ -1324,6 +1371,7 @@ fn verify(
         bootstrap,                                             // bootstrap docker image
         None,                                                  // stdout
         None,                                                  // stderr
+        env_vars,
         cargo_args,
         false,
     )?;
@@ -2116,6 +2164,7 @@ fn test(
     detach: bool,
     tests_to_run: Vec<String>,
     extra_args: Vec<String>,
+    env_vars: Vec<String>,
     cargo_args: Vec<String>,
 ) -> Result<()> {
     let test_paths = tests_to_run
@@ -2142,6 +2191,7 @@ fn test(
                 BootstrapMode::None,
                 None,
                 None,
+                env_vars,
                 cargo_args,
                 false,
             )?;
@@ -3120,6 +3170,7 @@ fn login(_cfg_override: &ConfigOverride, token: String) -> Result<()> {
 fn publish(
     cfg_override: &ConfigOverride,
     program_name: String,
+    env_vars: Vec<String>,
     cargo_args: Vec<String>,
     skip_build: bool,
 ) -> Result<()> {
@@ -3250,6 +3301,7 @@ fn publish(
             BootstrapMode::None,
             None,
             None,
+            env_vars,
             cargo_args,
             true,
         )?;
@@ -3332,6 +3384,7 @@ fn localnet(
     skip_build: bool,
     skip_deploy: bool,
     skip_lint: bool,
+    env_vars: Vec<String>,
     cargo_args: Vec<String>,
 ) -> Result<()> {
     with_workspace(cfg_override, |cfg| {
@@ -3349,6 +3402,7 @@ fn localnet(
                 BootstrapMode::None,
                 None,
                 None,
+                env_vars,
                 cargo_args,
                 false,
             )?;