diff --git a/devcontainers-cli/README.md b/devcontainers-cli/README.md index 5ed3aed8..11961cd7 100644 --- a/devcontainers-cli/README.md +++ b/devcontainers-cli/README.md @@ -16,7 +16,7 @@ The devcontainers-cli module provides an easy way to install [`@devcontainers/cl ```tf module "devcontainers-cli" { source = "registry.coder.com/modules/devcontainers-cli/coder" - version = "1.0.0" + version = "1.0.1" agent_id = coder_agent.example.id } ``` diff --git a/devcontainers-cli/main.test.ts b/devcontainers-cli/main.test.ts index 8872f181..85686c46 100644 --- a/devcontainers-cli/main.test.ts +++ b/devcontainers-cli/main.test.ts @@ -30,7 +30,7 @@ const executeScriptInContainerWithPackageManager = async ( await execContainer(id, [ shell, "-c", - "apk add nodejs npm && npm install -g pnpm", + `wget -qO- https://get.pnpm.io/install.sh | ENV="$HOME/.shrc" SHELL="$(which sh)" sh -`, ]); } else if (packageManager === "yarn") { await execContainer(id, [ @@ -86,7 +86,7 @@ describe("devcontainers-cli", async () => { expect(output.stdout[output.stdout.length - 1]).toEqual( "🥳 @devcontainers/cli has been installed into /usr/local/bin/devcontainer!", ); - }); + }, 15000); it("installs devcontainers-cli with yarn", async () => { const state = await runTerraformApply(import.meta.dir, { @@ -106,7 +106,7 @@ describe("devcontainers-cli", async () => { expect(output.stdout[output.stdout.length - 1]).toEqual( "🥳 @devcontainers/cli has been installed into /usr/local/bin/devcontainer!", ); - }); + }, 15000); it("displays warning if docker is not installed", async () => { const state = await runTerraformApply(import.meta.dir, { @@ -126,5 +126,5 @@ describe("devcontainers-cli", async () => { expect(output.stdout[output.stdout.length - 1]).toEqual( "🥳 @devcontainers/cli has been installed into /usr/local/bin/devcontainer!", ); - }); + }, 15000); }); diff --git a/devcontainers-cli/run.sh b/devcontainers-cli/run.sh index dce7a20e..03aac17f 100755 --- a/devcontainers-cli/run.sh +++ b/devcontainers-cli/run.sh @@ -12,26 +12,45 @@ if ! command -v docker > /dev/null 2>&1; then fi # Determine the package manager to use: npm, pnpm, or yarn -if command -v pnpm > /dev/null 2>&1; then - PACKAGE_MANAGER="pnpm" -elif command -v yarn > /dev/null 2>&1; then +if command -v yarn > /dev/null 2>&1; then PACKAGE_MANAGER="yarn" elif command -v npm > /dev/null 2>&1; then PACKAGE_MANAGER="npm" +elif command -v pnpm > /dev/null 2>&1; then + PACKAGE_MANAGER="pnpm" else echo "ERROR: No supported package manager (npm, pnpm, yarn) is installed. Please install one first." 1>&2 exit 1 fi -echo "Installing @devcontainers/cli using $PACKAGE_MANAGER..." +install() { + echo "Installing @devcontainers/cli using $PACKAGE_MANAGER..." + if [ "$PACKAGE_MANAGER" = "npm" ]; then + npm install -g @devcontainers/cli + elif [ "$PACKAGE_MANAGER" = "pnpm" ]; then + # Check if PNPM_HOME is set, if not, set it to the script's bin directory + # pnpm needs this to be set to install binaries + # coder agent ensures this part is part of the PATH + # so that the devcontainer command is available + if [ -z "$PNPM_HOME" ]; then + PNPM_HOME="$CODER_SCRIPT_BIN_DIR" + export M_HOME + fi + pnpm add -g @devcontainers/cli + elif [ "$PACKAGE_MANAGER" = "yarn" ]; then + yarn global add @devcontainers/cli + fi +} + +if ! install; then + echo "Failed to install @devcontainers/cli" >&2 + exit 1 +fi -# Install @devcontainers/cli using the selected package manager -if [ "$PACKAGE_MANAGER" = "npm" ] || [ "$PACKAGE_MANAGER" = "pnpm" ]; then - $PACKAGE_MANAGER install -g @devcontainers/cli \ - && echo "🥳 @devcontainers/cli has been installed into $(which devcontainer)!" -elif [ "$PACKAGE_MANAGER" = "yarn" ]; then - $PACKAGE_MANAGER global add @devcontainers/cli \ - && echo "🥳 @devcontainers/cli has been installed into $(which devcontainer)!" +if ! command -v devcontainer > /dev/null 2>&1; then + echo "Installation completed but 'devcontainer' command not found in PATH" >&2 + exit 1 fi +echo "🥳 @devcontainers/cli has been installed into $(which devcontainer)!" exit 0