From e1575dac74727a8ac407e5f8fde4290d1909d856 Mon Sep 17 00:00:00 2001 From: default Date: Fri, 25 Apr 2025 21:12:22 +0000 Subject: [PATCH 1/5] 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 From c76ec5ea5a8760b8c1d04b5060d37fbe513e7919 Mon Sep 17 00:00:00 2001 From: default Date: Thu, 8 May 2025 13:47:36 +0000 Subject: [PATCH 2/5] Resolve bad fetch/sync --- code-server/main.tf | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/code-server/main.tf b/code-server/main.tf index d3a3a03c..7b9e49cb 100644 --- a/code-server/main.tf +++ b/code-server/main.tf @@ -4,7 +4,7 @@ terraform { required_providers { coder = { source = "coder/coder" - version = ">= 0.17" + version = ">= 2.1" } } } @@ -39,13 +39,13 @@ variable "slug" { } variable "settings" { - type = map(string) + type = any description = "A map of settings to apply to code-server." default = {} } variable "machine-settings" { - type = map(string) + type = any description = "A map of template level machine settings to apply to code-server. This will be overwritten at each container start." default = {} } @@ -128,6 +128,20 @@ 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" @@ -173,10 +187,11 @@ 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" interval = 5 threshold = 6 } -} +} \ No newline at end of file From 733cb089579983505d2170601adfe1f410d8a279 Mon Sep 17 00:00:00 2001 From: default Date: Thu, 8 May 2025 14:08:04 +0000 Subject: [PATCH 3/5] If JQ prettify the settings JSON --- code-server/run.sh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/code-server/run.sh b/code-server/run.sh index e4ac816c..ba0f7d2f 100755 --- a/code-server/run.sh +++ b/code-server/run.sh @@ -23,13 +23,21 @@ function run_code_server() { if [ ! -f ~/.local/share/code-server/User/settings.json ]; then echo "⚙️ Creating settings file..." mkdir -p ~/.local/share/code-server/User - echo "${SETTINGS}" > ~/.local/share/code-server/User/settings.json + if command -v jq &> /dev/null; then + echo "${SETTINGS}" | jq '.' > ~/.local/share/code-server/User/settings.json + else + echo "${SETTINGS}" > ~/.local/share/code-server/User/settings.json + fi 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 +if command -v jq &> /dev/null; then + echo "${MACHINE_SETTINGS}" | jq '.' > ~/.local/share/code-server/Machine/settings.json +else + echo "${MACHINE_SETTINGS}" > ~/.local/share/code-server/Machine/settings.json +fi # Check if code-server is already installed for offline if [ "${OFFLINE}" = true ]; then From 65d94e729fbfd645255bd623929690fb6f74f6ee Mon Sep 17 00:00:00 2001 From: default Date: Thu, 8 May 2025 14:19:26 +0000 Subject: [PATCH 4/5] Fix bad sync --- code-server/run.sh | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/code-server/run.sh b/code-server/run.sh index ba0f7d2f..c87fd94e 100755 --- a/code-server/run.sh +++ b/code-server/run.sh @@ -55,6 +55,11 @@ 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}" @@ -71,6 +76,11 @@ 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" @@ -117,7 +127,8 @@ 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" - extensions=$(jq -r '.recommendations[]' "$WORKSPACE_DIR"/.vscode/extensions.json) + # Use sed to remove single-line comments before parsing with jq + extensions=$(sed 's|//.*||g' "$WORKSPACE_DIR"/.vscode/extensions.json | jq -r '.recommendations[]') for extension in $extensions; do if extension_installed "$extension"; then continue @@ -127,4 +138,4 @@ if [ "${AUTO_INSTALL_EXTENSIONS}" = true ]; then fi fi -run_code_server +run_code_server \ No newline at end of file From cd8990705a58bcb6af8208c9ea0fb137e1c5e57a Mon Sep 17 00:00:00 2001 From: default Date: Thu, 8 May 2025 14:39:45 +0000 Subject: [PATCH 5/5] prettier --- code-server/run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code-server/run.sh b/code-server/run.sh index c87fd94e..73bcd689 100755 --- a/code-server/run.sh +++ b/code-server/run.sh @@ -138,4 +138,4 @@ if [ "${AUTO_INSTALL_EXTENSIONS}" = true ]; then fi fi -run_code_server \ No newline at end of file +run_code_server