From e1575dac74727a8ac407e5f8fde4290d1909d856 Mon Sep 17 00:00:00 2001 From: default Date: Fri, 25 Apr 2025 21:12:22 +0000 Subject: [PATCH] feat(code-server): Machine Settings option --- code-server/main.tf | 26 +++++++++----------------- code-server/run.sh | 18 ++++++------------ 2 files changed, 15 insertions(+), 29 deletions(-) diff --git a/code-server/main.tf b/code-server/main.tf index ca4ff3af..d3a3a03c 100644 --- a/code-server/main.tf +++ b/code-server/main.tf @@ -4,7 +4,7 @@ terraform { required_providers { coder = { source = "coder/coder" - version = ">= 2.1" + version = ">= 0.17" } } } @@ -39,11 +39,17 @@ variable "slug" { } variable "settings" { - type = any + type = map(string) description = "A map of settings to apply to code-server." default = {} } +variable "machine-settings" { + type = map(string) + description = "A map of template level machine settings to apply to code-server. This will be overwritten at each container start." + default = {} +} + variable "folder" { type = string description = "The folder to open in code-server." @@ -122,20 +128,6 @@ variable "subdomain" { default = false } -variable "open_in" { - type = string - description = <<-EOT - Determines where the app will be opened. Valid values are `"tab"` and `"slim-window" (default)`. - `"tab"` opens in a new tab in the same browser window. - `"slim-window"` opens a new browser window without navigation controls. - EOT - default = "slim-window" - validation { - condition = contains(["tab", "slim-window"], var.open_in) - error_message = "The 'open_in' variable must be one of: 'tab', 'slim-window'." - } -} - resource "coder_script" "code-server" { agent_id = var.agent_id display_name = "code-server" @@ -149,6 +141,7 @@ resource "coder_script" "code-server" { INSTALL_PREFIX : var.install_prefix, // This is necessary otherwise the quotes are stripped! SETTINGS : replace(jsonencode(var.settings), "\"", "\\\""), + MACHINE_SETTINGS : replace(jsonencode(var.machine-settings), "\"", "\\\""), OFFLINE : var.offline, USE_CACHED : var.use_cached, USE_CACHED_EXTENSIONS : var.use_cached_extensions, @@ -180,7 +173,6 @@ resource "coder_app" "code-server" { subdomain = var.subdomain share = var.share order = var.order - open_in = var.open_in healthcheck { url = "http://localhost:${var.port}/healthz" diff --git a/code-server/run.sh b/code-server/run.sh index 99b30c0e..e4ac816c 100755 --- a/code-server/run.sh +++ b/code-server/run.sh @@ -26,6 +26,11 @@ if [ ! -f ~/.local/share/code-server/User/settings.json ]; then echo "${SETTINGS}" > ~/.local/share/code-server/User/settings.json fi +# Apply/overwrite template based settings +echo "⚙️ Creating machine settings file..." +mkdir -p ~/.local/share/code-server/Machine +echo "${MACHINE_SETTINGS}" > ~/.local/share/code-server/Machine/settings.json + # Check if code-server is already installed for offline if [ "${OFFLINE}" = true ]; then if [ -f "$CODE_SERVER" ]; then @@ -42,11 +47,6 @@ fi if [ ! -f "$CODE_SERVER" ] || [ "${USE_CACHED}" != true ]; then printf "$${BOLD}Installing code-server!\n" - # Clean up from other install (in case install prefix changed). - if [ -n "$CODER_SCRIPT_BIN_DIR" ] && [ -e "$CODER_SCRIPT_BIN_DIR/code-server" ]; then - rm "$CODER_SCRIPT_BIN_DIR/code-server" - fi - ARGS=( "--method=standalone" "--prefix=${INSTALL_PREFIX}" @@ -63,11 +63,6 @@ if [ ! -f "$CODE_SERVER" ] || [ "${USE_CACHED}" != true ]; then printf "🥳 code-server has been installed in ${INSTALL_PREFIX}\n\n" fi -# Make the code-server available in PATH. -if [ -n "$CODER_SCRIPT_BIN_DIR" ] && [ ! -e "$CODER_SCRIPT_BIN_DIR/code-server" ]; then - ln -s "$CODE_SERVER" "$CODER_SCRIPT_BIN_DIR/code-server" -fi - # Get the list of installed extensions... LIST_EXTENSIONS=$($CODE_SERVER --list-extensions $EXTENSION_ARG) readarray -t EXTENSIONS_ARRAY <<< "$LIST_EXTENSIONS" @@ -114,8 +109,7 @@ if [ "${AUTO_INSTALL_EXTENSIONS}" = true ]; then if [ -f "$WORKSPACE_DIR/.vscode/extensions.json" ]; then printf "🧩 Installing extensions from %s/.vscode/extensions.json...\n" "$WORKSPACE_DIR" - # Use sed to remove single-line comments before parsing with jq - extensions=$(sed 's|//.*||g' "$WORKSPACE_DIR"/.vscode/extensions.json | jq -r '.recommendations[]') + extensions=$(jq -r '.recommendations[]' "$WORKSPACE_DIR"/.vscode/extensions.json) for extension in $extensions; do if extension_installed "$extension"; then continue