Skip to content
This repository was archived by the owner on May 15, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion devcontainers-cli/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
```
8 changes: 4 additions & 4 deletions devcontainers-cli/main.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 -`,
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Purely testing purpose, done to not rely on NPM.

]);
} else if (packageManager === "yarn") {
await execContainer(id, [
Expand Down Expand Up @@ -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, {
Expand All @@ -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, {
Expand All @@ -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);
});
41 changes: 30 additions & 11 deletions devcontainers-cli/run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,26 +12,45 @@ if ! command -v docker > /dev/null 2>&1; then
fi

# Determine the package manager to use: npm, pnpm, or yarn
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed the ordering to use PNPM as a last option, if NPM is installed too.

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
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Main part of the fix, adding $PNPM_HOME if not set yet.

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