From 127d8872867599ab560998cfb328874dc26d261d Mon Sep 17 00:00:00 2001 From: Emily Soth Date: Wed, 11 Dec 2024 14:46:29 -0800 Subject: [PATCH 01/12] download and distribute micromamba executable --- .github/workflows/build-and-test.yml | 17 ++++------------- workbench/electron-builder-config.js | 8 ++++++-- workbench/src/main/findBinaries.js | 7 +++---- workbench/src/main/setupAddRemovePlugin.js | 6 +++--- 4 files changed, 16 insertions(+), 22 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index a34fe6ee86..c200ffb7c6 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -367,22 +367,13 @@ jobs: yarn config set network-timeout 600000 -g yarn install - - name: Download mamba installer for distribution (MacOS) + - name: Download micromamba installer for distribution (MacOS) if: matrix.os == 'macos-13' - run: curl -fsSLo Miniforge3-MacOSX-x86_64.sh "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-x86_64.sh" + run: curl -Ls https://micro.mamba.pm/api/micromamba/osx-64/2.0.5.rc0 | tar -xvj bin/micromamba - - name: Install mamba for MacOS - if: matrix.os == 'macos-13' - run: bash Miniforge3-MacOSX-x86_64.sh -b -p dist/miniforge3 - - - name: Download mamba installer for distribution (Windows) - if: matrix.os == 'windows-latest' - run: curl -fsSLo Miniforge3-Windows-x86_64.exe "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Windows-x86_64.exe" - - - name: Install mamba for Windows + - name: Download micromamba installer for distribution (Windows) if: matrix.os == 'windows-latest' - shell: cmd - run: Miniforge3-Windows-x86_64.exe /InstallationType=JustMe /RegisterPython=0 /S /D=%cd%\dist\miniforge3 + run: curl -Ls https://micro.mamba.pm/api/micromamba/win-64/2.0.5.rc0 | tar -xvj bin/micromamba - name: Authenticate GCP if: github.event_name != 'pull_request' diff --git a/workbench/electron-builder-config.js b/workbench/electron-builder-config.js index 88b159796f..b126ff29a0 100644 --- a/workbench/electron-builder-config.js +++ b/workbench/electron-builder-config.js @@ -36,8 +36,12 @@ const config = { to: 'invest', }, { - from: '../dist/Miniforge3', - to: 'Miniforge3', + from: '../dist/bin/micromamba', // mac + to: 'micromamba', + }, + { + from: '../dist/micromamba.exe', // windows + to: 'micromamba', }, { from: '../dist/userguide', diff --git a/workbench/src/main/findBinaries.js b/workbench/src/main/findBinaries.js index bd16e8c1a3..672d0fa339 100644 --- a/workbench/src/main/findBinaries.js +++ b/workbench/src/main/findBinaries.js @@ -54,7 +54,6 @@ export function findInvestBinaries(isDevMode) { return investExe; } - /** * Return the available mamba executable. * @@ -64,13 +63,13 @@ export function findInvestBinaries(isDevMode) { export function findMambaExecutable(isDevMode) { let mambaExe; if (isDevMode) { - mambaExe = 'mamba'; // assume that mamba is available + mambaExe = 'micromamba'; // assume that micromamba is available } else { if (process.platform === 'win32') { - mambaExe = `"${upath.join(process.resourcesPath, 'miniforge3', 'condabin', 'mamba.bat')}"`; + mambaExe = `"${upath.join(process.resourcesPath, 'micromamba.exe')}"`; } else { // Quote the path in case of spaces - mambaExe = `"${upath.join(process.resourcesPath, 'miniforge3', 'condabin', 'mamba')}"`; + mambaExe = `"${upath.join(process.resourcesPath, 'micromamba')}"`; } } // Check that the executable is working diff --git a/workbench/src/main/setupAddRemovePlugin.js b/workbench/src/main/setupAddRemovePlugin.js index 09463b3b3d..c5cf7828fd 100644 --- a/workbench/src/main/setupAddRemovePlugin.js +++ b/workbench/src/main/setupAddRemovePlugin.js @@ -87,13 +87,13 @@ export function setupAddPlugin() { logger.info('created mamba env for plugin'); await spawnWithLogging( mamba, - ['run', '--verbose', '--no-capture-output', '--name', envName, 'pip', 'install', `git+${pluginURL}`] + ['run', '--name', envName, 'pip', 'install', `git+${pluginURL}`] ); logger.info('installed plugin into its env'); // Write plugin metadata to the workbench's config.json - const envInfo = execSync(`${mamba} info --envs`, { windowsHide: true }).toString(); + const envInfo = execSync(`${mamba} info --name ${envName}`, { windowsHide: true }).toString(); logger.info(`env info:\n${envInfo}`); - const regex = new RegExp(String.raw`^${envName} +(.+)$`, 'm'); + const regex = /env location : (.+)/; const envPath = envInfo.match(regex)[1]; logger.info(`env path:\n${envPath}`); logger.info('writing plugin info to settings store'); From 897fd85aae62539d5e507a70175dcb3a5ce8a23e Mon Sep 17 00:00:00 2001 From: Emily Soth Date: Wed, 11 Dec 2024 15:17:27 -0800 Subject: [PATCH 02/12] slightly different tar command for windows micromamba executable --- .github/workflows/build-and-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index c200ffb7c6..d7c25c1d3a 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -373,7 +373,7 @@ jobs: - name: Download micromamba installer for distribution (Windows) if: matrix.os == 'windows-latest' - run: curl -Ls https://micro.mamba.pm/api/micromamba/win-64/2.0.5.rc0 | tar -xvj bin/micromamba + run: curl -Ls https://micro.mamba.pm/api/micromamba/win-64/2.0.5.rc0 | tar -xf micromamba.tar.bz2 - name: Authenticate GCP if: github.event_name != 'pull_request' From d864705682b62d67a950184800a212bf96ce7a8e Mon Sep 17 00:00:00 2001 From: Emily Soth Date: Tue, 17 Dec 2024 12:10:59 -0800 Subject: [PATCH 03/12] use recommended powershell commands to download micromamba for win --- .github/workflows/build-and-test.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index d7c25c1d3a..76cc4959e4 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -367,13 +367,18 @@ jobs: yarn config set network-timeout 600000 -g yarn install - - name: Download micromamba installer for distribution (MacOS) + - name: Download micromamba for distribution (MacOS) if: matrix.os == 'macos-13' run: curl -Ls https://micro.mamba.pm/api/micromamba/osx-64/2.0.5.rc0 | tar -xvj bin/micromamba - - name: Download micromamba installer for distribution (Windows) + - name: Download micromamba for distribution (Windows) if: matrix.os == 'windows-latest' - run: curl -Ls https://micro.mamba.pm/api/micromamba/win-64/2.0.5.rc0 | tar -xf micromamba.tar.bz2 + shell: pwsh + run: | + Invoke-Webrequest -URI https://micro.mamba.pm/api/micromamba/win-64/latest -OutFile micromamba.tar.bz2 + tar xf micromamba.tar.bz2 + MOVE -Force Library\bin\micromamba.exe micromamba.exe + .\micromamba.exe --help - name: Authenticate GCP if: github.event_name != 'pull_request' From b67af89c79da5fb1d832127837160305ec2bc3ce Mon Sep 17 00:00:00 2001 From: Emily Soth Date: Tue, 17 Dec 2024 12:38:54 -0800 Subject: [PATCH 04/12] bump micromamba version to latest now that 2.0.5 is release --- .github/workflows/build-and-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 76cc4959e4..b80b5e4867 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -369,7 +369,7 @@ jobs: - name: Download micromamba for distribution (MacOS) if: matrix.os == 'macos-13' - run: curl -Ls https://micro.mamba.pm/api/micromamba/osx-64/2.0.5.rc0 | tar -xvj bin/micromamba + run: curl -Ls https://micro.mamba.pm/api/micromamba/osx-64/latest | tar -xvj bin/micromamba - name: Download micromamba for distribution (Windows) if: matrix.os == 'windows-latest' From 21275e20bf1ea3c11d1906e11f160f53f6aa724e Mon Sep 17 00:00:00 2001 From: Emily Soth Date: Tue, 17 Dec 2024 12:48:40 -0800 Subject: [PATCH 05/12] same micromamba location for mac and windows --- .github/workflows/build-and-test.yml | 5 ++++- workbench/electron-builder-config.js | 6 +----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index b80b5e4867..09a7ad8268 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -369,7 +369,10 @@ jobs: - name: Download micromamba for distribution (MacOS) if: matrix.os == 'macos-13' - run: curl -Ls https://micro.mamba.pm/api/micromamba/osx-64/latest | tar -xvj bin/micromamba + run: | + curl -Ls https://micro.mamba.pm/api/micromamba/osx-64/latest | tar -xvj bin/micromamba + mv bin/micromamba . + ./micromamba --help - name: Download micromamba for distribution (Windows) if: matrix.os == 'windows-latest' diff --git a/workbench/electron-builder-config.js b/workbench/electron-builder-config.js index b126ff29a0..b7839b2dc1 100644 --- a/workbench/electron-builder-config.js +++ b/workbench/electron-builder-config.js @@ -36,11 +36,7 @@ const config = { to: 'invest', }, { - from: '../dist/bin/micromamba', // mac - to: 'micromamba', - }, - { - from: '../dist/micromamba.exe', // windows + from: '../dist/micromamba*', to: 'micromamba', }, { From f35ad8e5a46b655c61822c61abda1fe7f5689cf8 Mon Sep 17 00:00:00 2001 From: Emily Soth Date: Tue, 17 Dec 2024 13:17:48 -0800 Subject: [PATCH 06/12] move micromamba executable to dist/ --- .github/workflows/build-and-test.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 09a7ad8268..3bcf7947e3 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -371,8 +371,8 @@ jobs: if: matrix.os == 'macos-13' run: | curl -Ls https://micro.mamba.pm/api/micromamba/osx-64/latest | tar -xvj bin/micromamba - mv bin/micromamba . - ./micromamba --help + mv bin/micromamba dist/ + ./dist/micromamba --help - name: Download micromamba for distribution (Windows) if: matrix.os == 'windows-latest' @@ -380,8 +380,8 @@ jobs: run: | Invoke-Webrequest -URI https://micro.mamba.pm/api/micromamba/win-64/latest -OutFile micromamba.tar.bz2 tar xf micromamba.tar.bz2 - MOVE -Force Library\bin\micromamba.exe micromamba.exe - .\micromamba.exe --help + MOVE -Force Library\bin\micromamba.exe dist\micromamba.exe + .\dist\micromamba.exe --help - name: Authenticate GCP if: github.event_name != 'pull_request' From 1461bbe6eb3d7438f4a9379ab5f862755cfea081 Mon Sep 17 00:00:00 2001 From: Emily Soth Date: Tue, 17 Dec 2024 13:35:18 -0800 Subject: [PATCH 07/12] try electron-builder resources without glob --- workbench/electron-builder-config.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/workbench/electron-builder-config.js b/workbench/electron-builder-config.js index b7839b2dc1..649c48ca3f 100644 --- a/workbench/electron-builder-config.js +++ b/workbench/electron-builder-config.js @@ -36,7 +36,11 @@ const config = { to: 'invest', }, { - from: '../dist/micromamba*', + from: '../dist/micromamba', // mac + to: 'micromamba', + }, + { + from: '../dist/micromamba.exe', // windows to: 'micromamba', }, { From 7652d63e11368b0650e5a21caec681a5ed2e18cc Mon Sep 17 00:00:00 2001 From: Emily Soth Date: Tue, 17 Dec 2024 16:41:42 -0800 Subject: [PATCH 08/12] update from mamba to micromamba in workbench --- .../src/main/createPythonFlaskProcess.js | 6 ++--- workbench/src/main/findBinaries.js | 22 +++++++++---------- workbench/src/main/main.js | 4 ++-- workbench/src/main/setupAddRemovePlugin.js | 14 ++++++------ workbench/src/main/setupInvestHandlers.js | 3 +-- 5 files changed, 24 insertions(+), 25 deletions(-) diff --git a/workbench/src/main/createPythonFlaskProcess.js b/workbench/src/main/createPythonFlaskProcess.js index 83759fc62c..f349ce3aee 100644 --- a/workbench/src/main/createPythonFlaskProcess.js +++ b/workbench/src/main/createPythonFlaskProcess.js @@ -123,14 +123,14 @@ export async function createPluginServerProcess(modelName, _port = undefined) { } logger.debug('creating invest plugin server process'); - const mamba = settingsStore.get('mamba'); + const micromamba = settingsStore.get('micromamba'); const modelEnvPath = settingsStore.get(`plugins.${modelName}.env`); const args = [ 'run', '--prefix', `"${modelEnvPath}"`, 'invest', '--debug', 'serve', '--port', port]; - logger.debug('spawning command:', mamba, args); + logger.debug('spawning command:', micromamba, args); // shell mode is necessary in dev mode & relying on a conda env - const pythonServerProcess = spawn(mamba, args, { shell: true }); + const pythonServerProcess = spawn(micromamba, args, { shell: true }); settingsStore.set(`plugins.${modelName}.port`, port); settingsStore.set(`plugins.${modelName}.pid`, pythonServerProcess.pid); diff --git a/workbench/src/main/findBinaries.js b/workbench/src/main/findBinaries.js index 672d0fa339..7257a0851a 100644 --- a/workbench/src/main/findBinaries.js +++ b/workbench/src/main/findBinaries.js @@ -55,30 +55,30 @@ export function findInvestBinaries(isDevMode) { } /** - * Return the available mamba executable. + * Return the available micromamba executable. * * @param {boolean} isDevMode - a boolean designating dev mode or not. - * @returns {string} mamba executable. + * @returns {string} micromamba executable. */ -export function findMambaExecutable(isDevMode) { - let mambaExe; +export function findMicromambaExecutable(isDevMode) { + let micromambaExe; if (isDevMode) { - mambaExe = 'micromamba'; // assume that micromamba is available + micromambaExe = 'micromamba'; // assume that micromamba is available } else { if (process.platform === 'win32') { - mambaExe = `"${upath.join(process.resourcesPath, 'micromamba.exe')}"`; + micromambaExe = `"${upath.join(process.resourcesPath, 'micromamba.exe')}"`; } else { // Quote the path in case of spaces - mambaExe = `"${upath.join(process.resourcesPath, 'micromamba')}"`; + micromambaExe = `"${upath.join(process.resourcesPath, 'micromamba')}"`; } } // Check that the executable is working - const { stderr, error } = spawnSync(mambaExe, ['--help'], { shell: true }); + const { stderr, error } = spawnSync(micromambaExe, ['--help'], { shell: true }); if (error) { logger.error(stderr.toString()); - logger.error('mamba executable is not where we expected it.'); + logger.error('micromamba executable is not where we expected it.'); throw error; } - logger.info(`using mamba executable '${mambaExe}'`); - return mambaExe; + logger.info(`using micromamba executable '${micromambaExe}'`); + return micromambaExe; } diff --git a/workbench/src/main/main.js b/workbench/src/main/main.js index a0911c57d6..9590909c4d 100644 --- a/workbench/src/main/main.js +++ b/workbench/src/main/main.js @@ -14,7 +14,7 @@ import { createCoreServerProcess, shutdownPythonProcess } from './createPythonFlaskProcess'; -import { findInvestBinaries, findMambaExecutable } from './findBinaries'; +import { findInvestBinaries, findMicromambaExecutable } from './findBinaries'; import setupDownloadHandlers from './setupDownloadHandlers'; import setupDialogs from './setupDialogs'; import setupContextMenu from './setupContextMenu'; @@ -80,7 +80,7 @@ export const createWindow = async () => { splashScreen.loadURL(path.join(BASE_URL, 'splash.html')); settingsStore.set('investExe', findInvestBinaries(ELECTRON_DEV_MODE)); - settingsStore.set('mamba', findMambaExecutable(ELECTRON_DEV_MODE)); + settingsStore.set('micromamba', findMicromambaExecutable(ELECTRON_DEV_MODE)); // No plugin server processes should persist between workbench sessions // In case any were left behind, remove them const plugins = settingsStore.get('plugins'); diff --git a/workbench/src/main/setupAddRemovePlugin.js b/workbench/src/main/setupAddRemovePlugin.js index c5cf7828fd..7a0480ad0e 100644 --- a/workbench/src/main/setupAddRemovePlugin.js +++ b/workbench/src/main/setupAddRemovePlugin.js @@ -55,7 +55,7 @@ export function setupAddPlugin() { async (e, pluginURL) => { try { logger.info('adding plugin at', pluginURL); - const mamba = settingsStore.get('mamba'); + const micromamba = settingsStore.get('micromamba'); // Create a temporary directory and check out the plugin's pyproject.toml const tmpPluginDir = fs.mkdtempSync(upath.join(tmpdir(), 'natcap-invest-')); await spawnWithLogging( @@ -81,17 +81,17 @@ export function setupAddPlugin() { // Create a conda env containing the plugin and its dependencies const envName = `invest_plugin_${pluginID}`; await spawnWithLogging( - mamba, + micromamba, ['create', '--yes', '--name', envName, '-c', 'conda-forge', '"python<3.12"', '"gdal<3.6"'] ); - logger.info('created mamba env for plugin'); + logger.info('created micromamba env for plugin'); await spawnWithLogging( - mamba, + micromamba, ['run', '--name', envName, 'pip', 'install', `git+${pluginURL}`] ); logger.info('installed plugin into its env'); // Write plugin metadata to the workbench's config.json - const envInfo = execSync(`${mamba} info --name ${envName}`, { windowsHide: true }).toString(); + const envInfo = execSync(`${micromamba} info --name ${envName}`, { windowsHide: true }).toString(); logger.info(`env info:\n${envInfo}`); const regex = /env location : (.+)/; const envPath = envInfo.match(regex)[1]; @@ -123,8 +123,8 @@ export function setupRemovePlugin() { try { // Delete the plugin's conda env const env = settingsStore.get(`plugins.${pluginID}.env`); - const mamba = settingsStore.get('mamba'); - await spawnWithLogging(mamba, ['remove', '--yes', '--prefix', `"${env}"`, '--all']); + const micromamba = settingsStore.get('micromamba'); + await spawnWithLogging(micromamba, ['remove', '--yes', '--prefix', `"${env}"`, '--all']); // Delete the plugin's data from storage settingsStore.delete(`plugins.${pluginID}`); logger.info('successfully removed plugin'); diff --git a/workbench/src/main/setupInvestHandlers.js b/workbench/src/main/setupInvestHandlers.js index 762446a5b0..47973983b5 100644 --- a/workbench/src/main/setupInvestHandlers.js +++ b/workbench/src/main/setupInvestHandlers.js @@ -91,11 +91,10 @@ export function setupInvestRunHandlers() { let port; const plugins = settingsStore.get('plugins'); if (plugins && Object.keys(plugins).includes(modelRunName)) { - cmd = settingsStore.get('mamba'); + cmd = settingsStore.get('micromamba'); cmdArgs = [ 'run', `--prefix "${settingsStore.get(`plugins.${modelRunName}.env`)}"`, - '--live-stream', 'invest', LOGLEVELMAP[loggingLevel], TGLOGLEVELMAP[taskgraphLoggingLevel], From d93a4ce3c54ad266b50d5f4d612d182a5515a032 Mon Sep 17 00:00:00 2001 From: Emily Soth Date: Wed, 18 Dec 2024 13:38:46 -0800 Subject: [PATCH 09/12] same micromamba path for windows and mac --- workbench/src/main/findBinaries.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/workbench/src/main/findBinaries.js b/workbench/src/main/findBinaries.js index 7257a0851a..7dc7401e98 100644 --- a/workbench/src/main/findBinaries.js +++ b/workbench/src/main/findBinaries.js @@ -65,12 +65,7 @@ export function findMicromambaExecutable(isDevMode) { if (isDevMode) { micromambaExe = 'micromamba'; // assume that micromamba is available } else { - if (process.platform === 'win32') { - micromambaExe = `"${upath.join(process.resourcesPath, 'micromamba.exe')}"`; - } else { - // Quote the path in case of spaces - micromambaExe = `"${upath.join(process.resourcesPath, 'micromamba')}"`; - } + micromambaExe = `"${upath.join(process.resourcesPath, 'micromamba')}"`; } // Check that the executable is working const { stderr, error } = spawnSync(micromambaExe, ['--help'], { shell: true }); From df213fbdfcbdea0397f5865659155d1782ee93fe Mon Sep 17 00:00:00 2001 From: Emily Soth Date: Thu, 19 Dec 2024 11:06:20 -0800 Subject: [PATCH 10/12] try bumping setup-micromamba action version to 2 --- .github/actions/setup_env/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/setup_env/action.yml b/.github/actions/setup_env/action.yml index 2678553f17..8b2b3a4b43 100644 --- a/.github/actions/setup_env/action.yml +++ b/.github/actions/setup_env/action.yml @@ -60,7 +60,7 @@ runs: cat environment.yml - name: Setup conda environment - uses: mamba-org/setup-micromamba@v1 + uses: mamba-org/setup-micromamba@v2 with: environment-file: environment.yml environment-name: env From 993944dd4efcb0ab1010a573a854b9b930f54055 Mon Sep 17 00:00:00 2001 From: Emily Soth Date: Fri, 20 Dec 2024 10:39:11 -0800 Subject: [PATCH 11/12] keep .exe extension on micromamba for windows --- workbench/electron-builder-config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workbench/electron-builder-config.js b/workbench/electron-builder-config.js index 649c48ca3f..51a6368065 100644 --- a/workbench/electron-builder-config.js +++ b/workbench/electron-builder-config.js @@ -41,7 +41,7 @@ const config = { }, { from: '../dist/micromamba.exe', // windows - to: 'micromamba', + to: 'micromamba.exe', }, { from: '../dist/userguide', From dbd6419fcf2639d7f795098a5427aefd315d9545 Mon Sep 17 00:00:00 2001 From: Emily Soth Date: Fri, 20 Dec 2024 14:05:06 -0800 Subject: [PATCH 12/12] add comment in build-and-test workflow --- .github/workflows/build-and-test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 3bcf7947e3..41f922a196 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -372,7 +372,7 @@ jobs: run: | curl -Ls https://micro.mamba.pm/api/micromamba/osx-64/latest | tar -xvj bin/micromamba mv bin/micromamba dist/ - ./dist/micromamba --help + ./dist/micromamba --help # make sure the executable works - name: Download micromamba for distribution (Windows) if: matrix.os == 'windows-latest' @@ -381,7 +381,7 @@ jobs: Invoke-Webrequest -URI https://micro.mamba.pm/api/micromamba/win-64/latest -OutFile micromamba.tar.bz2 tar xf micromamba.tar.bz2 MOVE -Force Library\bin\micromamba.exe dist\micromamba.exe - .\dist\micromamba.exe --help + .\dist\micromamba.exe --help # make sure the executable works - name: Authenticate GCP if: github.event_name != 'pull_request'