Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7d6c526146 | ||
|
|
a3dc364227 | ||
|
|
f335a62891 | ||
|
|
8ed13be726 | ||
|
|
b90f6f9de8 | ||
|
|
948280600a | ||
|
|
407738b2be | ||
|
|
08adb4a839 |
1
.icons/node.svg
Normal file
1
.icons/node.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg width="2270" height="2500" viewBox="0 0 256 282" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet"><g fill="#8CC84B"><path d="M116.504 3.58c6.962-3.985 16.03-4.003 22.986 0 34.995 19.774 70.001 39.517 104.99 59.303 6.581 3.707 10.983 11.031 10.916 18.614v118.968c.049 7.897-4.788 15.396-11.731 19.019-34.88 19.665-69.742 39.354-104.616 59.019-7.106 4.063-16.356 3.75-23.24-.646-10.457-6.062-20.932-12.094-31.39-18.15-2.137-1.274-4.546-2.288-6.055-4.36 1.334-1.798 3.719-2.022 5.657-2.807 4.365-1.388 8.374-3.616 12.384-5.778 1.014-.694 2.252-.428 3.224.193 8.942 5.127 17.805 10.403 26.777 15.481 1.914 1.105 3.852-.362 5.488-1.274 34.228-19.345 68.498-38.617 102.72-57.968 1.268-.61 1.969-1.956 1.866-3.345.024-39.245.006-78.497.012-117.742.145-1.576-.767-3.025-2.192-3.67-34.759-19.575-69.5-39.18-104.253-58.76a3.621 3.621 0 0 0-4.094-.006C91.2 39.257 56.465 58.88 21.712 78.454c-1.42.646-2.373 2.071-2.204 3.653.006 39.245 0 78.497 0 117.748a3.329 3.329 0 0 0 1.89 3.303c9.274 5.259 18.56 10.481 27.84 15.722 5.228 2.814 11.647 4.486 17.407 2.33 5.083-1.823 8.646-7.01 8.549-12.407.048-39.016-.024-78.038.036-117.048-.127-1.732 1.516-3.163 3.2-3 4.456-.03 8.918-.06 13.374.012 1.86-.042 3.14 1.823 2.91 3.568-.018 39.263.048 78.527-.03 117.79.012 10.464-4.287 21.85-13.966 26.97-11.924 6.177-26.662 4.867-38.442-1.056-10.198-5.09-19.93-11.097-29.947-16.55C5.368 215.886.555 208.357.604 200.466V81.497c-.073-7.74 4.504-15.197 11.29-18.85C46.768 42.966 81.636 23.27 116.504 3.58z"/><path d="M146.928 85.99c15.21-.979 31.493-.58 45.18 6.913 10.597 5.742 16.472 17.793 16.659 29.566-.296 1.588-1.956 2.464-3.472 2.355-4.413-.006-8.827.06-13.24-.03-1.872.072-2.96-1.654-3.195-3.309-1.268-5.633-4.34-11.212-9.642-13.929-8.139-4.075-17.576-3.87-26.451-3.785-6.479.344-13.446.905-18.935 4.715-4.214 2.886-5.494 8.712-3.99 13.404 1.418 3.369 5.307 4.456 8.489 5.458 18.33 4.794 37.754 4.317 55.734 10.626 7.444 2.572 14.726 7.572 17.274 15.366 3.333 10.446 1.872 22.932-5.56 31.318-6.027 6.901-14.805 10.657-23.56 12.697-11.647 2.597-23.734 2.663-35.562 1.51-11.122-1.268-22.696-4.19-31.282-11.768-7.342-6.375-10.928-16.308-10.572-25.895.085-1.619 1.697-2.748 3.248-2.615 4.444-.036 8.888-.048 13.332.006 1.775-.127 3.091 1.407 3.182 3.08.82 5.367 2.837 11 7.517 14.182 9.032 5.827 20.365 5.428 30.707 5.591 8.568-.38 18.186-.495 25.178-6.158 3.689-3.23 4.782-8.634 3.785-13.283-1.08-3.925-5.186-5.754-8.712-6.95-18.095-5.724-37.736-3.647-55.656-10.12-7.275-2.571-14.31-7.432-17.105-14.906-3.9-10.578-2.113-23.662 6.098-31.765 8.006-8.06 19.563-11.164 30.551-12.275z"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 2.5 KiB |
@@ -4,7 +4,7 @@ terraform {
|
|||||||
required_providers {
|
required_providers {
|
||||||
coder = {
|
coder = {
|
||||||
source = "coder/coder"
|
source = "coder/coder"
|
||||||
version = ">= 0.12"
|
version = ">= 0.17"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -50,6 +50,12 @@ variable "mutable" {
|
|||||||
description = "Whether the parameter is mutable."
|
description = "Whether the parameter is mutable."
|
||||||
default = true
|
default = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
variable "order" {
|
||||||
|
type = number
|
||||||
|
description = "The order determines the position of app in the UI presentation. The lowest order is shown first and apps with equal order are sorted by name (ascending order)."
|
||||||
|
default = null
|
||||||
|
}
|
||||||
# Add other variables here
|
# Add other variables here
|
||||||
|
|
||||||
|
|
||||||
@@ -72,6 +78,7 @@ resource "coder_app" "MODULE_NAME" {
|
|||||||
icon = local.icon_url
|
icon = local.icon_url
|
||||||
subdomain = false
|
subdomain = false
|
||||||
share = "owner"
|
share = "owner"
|
||||||
|
order = var.order
|
||||||
|
|
||||||
# Remove if the app does not have a healthcheck endpoint
|
# Remove if the app does not have a healthcheck endpoint
|
||||||
healthcheck {
|
healthcheck {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ terraform {
|
|||||||
required_providers {
|
required_providers {
|
||||||
coder = {
|
coder = {
|
||||||
source = "coder/coder"
|
source = "coder/coder"
|
||||||
version = ">= 0.12"
|
version = ">= 0.17"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -77,6 +77,12 @@ variable "share" {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
variable "order" {
|
||||||
|
type = number
|
||||||
|
description = "The order determines the position of app in the UI presentation. The lowest order is shown first and apps with equal order are sorted by name (ascending order)."
|
||||||
|
default = null
|
||||||
|
}
|
||||||
|
|
||||||
resource "coder_script" "code-server" {
|
resource "coder_script" "code-server" {
|
||||||
agent_id = var.agent_id
|
agent_id = var.agent_id
|
||||||
display_name = "code-server"
|
display_name = "code-server"
|
||||||
@@ -84,6 +90,7 @@ resource "coder_script" "code-server" {
|
|||||||
script = templatefile("${path.module}/run.sh", {
|
script = templatefile("${path.module}/run.sh", {
|
||||||
VERSION : var.install_version,
|
VERSION : var.install_version,
|
||||||
EXTENSIONS : join(",", var.extensions),
|
EXTENSIONS : join(",", var.extensions),
|
||||||
|
APP_NAME : var.display_name,
|
||||||
PORT : var.port,
|
PORT : var.port,
|
||||||
LOG_PATH : var.log_path,
|
LOG_PATH : var.log_path,
|
||||||
INSTALL_PREFIX : var.install_prefix,
|
INSTALL_PREFIX : var.install_prefix,
|
||||||
@@ -101,6 +108,7 @@ resource "coder_app" "code-server" {
|
|||||||
icon = "/icon/code.svg"
|
icon = "/icon/code.svg"
|
||||||
subdomain = false
|
subdomain = false
|
||||||
share = var.share
|
share = var.share
|
||||||
|
order = var.order
|
||||||
|
|
||||||
healthcheck {
|
healthcheck {
|
||||||
url = "http://localhost:${var.port}/healthz"
|
url = "http://localhost:${var.port}/healthz"
|
||||||
|
|||||||
@@ -47,4 +47,4 @@ fi
|
|||||||
|
|
||||||
echo "👷 Running code-server in the background..."
|
echo "👷 Running code-server in the background..."
|
||||||
echo "Check logs at ${LOG_PATH}!"
|
echo "Check logs at ${LOG_PATH}!"
|
||||||
$CODE_SERVER --auth none --port ${PORT} > ${LOG_PATH} 2>&1 &
|
$CODE_SERVER --auth none --port ${PORT} --app-name "${APP_NAME}" > ${LOG_PATH} 2>&1 &
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ terraform {
|
|||||||
required_providers {
|
required_providers {
|
||||||
coder = {
|
coder = {
|
||||||
source = "coder/coder"
|
source = "coder/coder"
|
||||||
version = ">= 0.12"
|
version = ">= 0.17"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -52,6 +52,12 @@ variable "share" {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
variable "order" {
|
||||||
|
type = number
|
||||||
|
description = "The order determines the position of app in the UI presentation. The lowest order is shown first and apps with equal order are sorted by name (ascending order)."
|
||||||
|
default = null
|
||||||
|
}
|
||||||
|
|
||||||
resource "coder_script" "filebrowser" {
|
resource "coder_script" "filebrowser" {
|
||||||
agent_id = var.agent_id
|
agent_id = var.agent_id
|
||||||
display_name = "File Browser"
|
display_name = "File Browser"
|
||||||
@@ -74,4 +80,5 @@ resource "coder_app" "filebrowser" {
|
|||||||
icon = "https://raw.githubusercontent.com/filebrowser/logo/master/icon_raw.svg"
|
icon = "https://raw.githubusercontent.com/filebrowser/logo/master/icon_raw.svg"
|
||||||
subdomain = true
|
subdomain = true
|
||||||
share = var.share
|
share = var.share
|
||||||
|
order = var.order
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,9 +15,10 @@ This module lets you fetch all or selective secrets from a [HCP Vault Secrets](h
|
|||||||
```tf
|
```tf
|
||||||
module "vault" {
|
module "vault" {
|
||||||
source = "registry.coder.com/modules/hcp-vault-secrets/coder"
|
source = "registry.coder.com/modules/hcp-vault-secrets/coder"
|
||||||
version = "1.0.3"
|
version = "1.0.7"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
app_name = "demo-app"
|
app_name = "demo-app"
|
||||||
|
project_id = "aaa-bbb-ccc"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -29,6 +30,7 @@ To configure the HCP Vault Secrets module, follow these steps,
|
|||||||
2. Create an HCP Service Principal from the HCP Vault Secrets app in the HCP console. This will give you the `HCP_CLIENT_ID` and `HCP_CLIENT_SECRET` that you need to authenticate with HCP Vault Secrets.
|
2. Create an HCP Service Principal from the HCP Vault Secrets app in the HCP console. This will give you the `HCP_CLIENT_ID` and `HCP_CLIENT_SECRET` that you need to authenticate with HCP Vault Secrets.
|
||||||

|

|
||||||
3. Set `HCP_CLIENT_ID` and `HCP_CLIENT_SECRET` variables on the coder provisioner (recommended) or supply them as input to the module.
|
3. Set `HCP_CLIENT_ID` and `HCP_CLIENT_SECRET` variables on the coder provisioner (recommended) or supply them as input to the module.
|
||||||
|
4. Set the `project_id`. This is the ID of the project where the HCP Vault Secrets app is running.
|
||||||
|
|
||||||
> See the [HCP Vault Secrets documentation](https://developer.hashicorp.com/hcp/docs/vault-secrets) for more information.
|
> See the [HCP Vault Secrets documentation](https://developer.hashicorp.com/hcp/docs/vault-secrets) for more information.
|
||||||
|
|
||||||
@@ -39,9 +41,10 @@ To fetch all secrets from the HCP Vault Secrets app, skip the `secrets` input.
|
|||||||
```tf
|
```tf
|
||||||
module "vault" {
|
module "vault" {
|
||||||
source = "registry.coder.com/modules/hcp-vault-secrets/coder"
|
source = "registry.coder.com/modules/hcp-vault-secrets/coder"
|
||||||
version = "1.0.3"
|
version = "1.0.7"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
app_name = "demo-app"
|
app_name = "demo-app"
|
||||||
|
project_id = "aaa-bbb-ccc"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -52,9 +55,10 @@ To fetch selective secrets from the HCP Vault Secrets app, set the `secrets` inp
|
|||||||
```tf
|
```tf
|
||||||
module "vault" {
|
module "vault" {
|
||||||
source = "registry.coder.com/modules/hcp-vault-secrets/coder"
|
source = "registry.coder.com/modules/hcp-vault-secrets/coder"
|
||||||
version = "1.0.3"
|
version = "1.0.7"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
app_name = "demo-app"
|
app_name = "demo-app"
|
||||||
|
project_id = "aaa-bbb-ccc"
|
||||||
secrets = ["MY_SECRET_1", "MY_SECRET_2"]
|
secrets = ["MY_SECRET_1", "MY_SECRET_2"]
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -66,9 +70,10 @@ Set `client_id` and `client_secret` as module inputs.
|
|||||||
```tf
|
```tf
|
||||||
module "vault" {
|
module "vault" {
|
||||||
source = "registry.coder.com/modules/hcp-vault-secrets/coder"
|
source = "registry.coder.com/modules/hcp-vault-secrets/coder"
|
||||||
version = "1.0.3"
|
version = "1.0.7"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
app_name = "demo-app"
|
app_name = "demo-app"
|
||||||
|
project_id = "aaa-bbb-ccc"
|
||||||
client_id = "HCP_CLIENT_ID"
|
client_id = "HCP_CLIENT_ID"
|
||||||
client_secret = "HCP_CLIENT_SECRET"
|
client_secret = "HCP_CLIENT_SECRET"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ terraform {
|
|||||||
provider "hcp" {
|
provider "hcp" {
|
||||||
client_id = var.client_id
|
client_id = var.client_id
|
||||||
client_secret = var.client_secret
|
client_secret = var.client_secret
|
||||||
|
project_id = var.project_id
|
||||||
}
|
}
|
||||||
|
|
||||||
provider "coder" {}
|
provider "coder" {}
|
||||||
@@ -25,6 +26,11 @@ variable "agent_id" {
|
|||||||
description = "The ID of a Coder agent."
|
description = "The ID of a Coder agent."
|
||||||
}
|
}
|
||||||
|
|
||||||
|
variable "project_id" {
|
||||||
|
type = string
|
||||||
|
description = "The ID of the HCP project."
|
||||||
|
}
|
||||||
|
|
||||||
variable "client_id" {
|
variable "client_id" {
|
||||||
type = string
|
type = string
|
||||||
description = <<-EOF
|
description = <<-EOF
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ This module adds a JetBrains Gateway Button to open any workspace with a single
|
|||||||
```tf
|
```tf
|
||||||
module "jetbrains_gateway" {
|
module "jetbrains_gateway" {
|
||||||
source = "registry.coder.com/modules/jetbrains-gateway/coder"
|
source = "registry.coder.com/modules/jetbrains-gateway/coder"
|
||||||
version = "1.0.3"
|
version = "1.0.6"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
agent_name = "example"
|
agent_name = "example"
|
||||||
folder = "/home/coder/example"
|
folder = "/home/coder/example"
|
||||||
@@ -32,7 +32,7 @@ module "jetbrains_gateway" {
|
|||||||
```tf
|
```tf
|
||||||
module "jetbrains_gateway" {
|
module "jetbrains_gateway" {
|
||||||
source = "registry.coder.com/modules/jetbrains-gateway/coder"
|
source = "registry.coder.com/modules/jetbrains-gateway/coder"
|
||||||
version = "1.0.3"
|
version = "1.0.6"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
agent_name = "example"
|
agent_name = "example"
|
||||||
folder = "/home/coder/example"
|
folder = "/home/coder/example"
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ terraform {
|
|||||||
required_providers {
|
required_providers {
|
||||||
coder = {
|
coder = {
|
||||||
source = "coder/coder"
|
source = "coder/coder"
|
||||||
version = ">= 0.11"
|
version = ">= 0.17"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -34,6 +34,12 @@ variable "default" {
|
|||||||
description = "Default IDE"
|
description = "Default IDE"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
variable "order" {
|
||||||
|
type = number
|
||||||
|
description = "The order determines the position of app in the UI presentation. The lowest order is shown first and apps with equal order are sorted by name (ascending order)."
|
||||||
|
default = null
|
||||||
|
}
|
||||||
|
|
||||||
variable "jetbrains_ide_versions" {
|
variable "jetbrains_ide_versions" {
|
||||||
type = map(object({
|
type = map(object({
|
||||||
build_number = string
|
build_number = string
|
||||||
@@ -184,6 +190,7 @@ resource "coder_app" "gateway" {
|
|||||||
display_name = try(lookup(local.jetbrains_ides, data.coder_parameter.jetbrains_ide.value).name, "JetBrains IDE")
|
display_name = try(lookup(local.jetbrains_ides, data.coder_parameter.jetbrains_ide.value).name, "JetBrains IDE")
|
||||||
icon = try(lookup(local.jetbrains_ides, data.coder_parameter.jetbrains_ide.value).icon, "/icon/gateway.svg")
|
icon = try(lookup(local.jetbrains_ides, data.coder_parameter.jetbrains_ide.value).icon, "/icon/gateway.svg")
|
||||||
external = true
|
external = true
|
||||||
|
order = var.order
|
||||||
url = join("", [
|
url = join("", [
|
||||||
"jetbrains-gateway://connect#type=coder&workspace=",
|
"jetbrains-gateway://connect#type=coder&workspace=",
|
||||||
data.coder_workspace.me.name,
|
data.coder_workspace.me.name,
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ terraform {
|
|||||||
required_providers {
|
required_providers {
|
||||||
coder = {
|
coder = {
|
||||||
source = "coder/coder"
|
source = "coder/coder"
|
||||||
version = ">= 0.12"
|
version = ">= 0.17"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -36,6 +36,12 @@ variable "share" {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
variable "order" {
|
||||||
|
type = number
|
||||||
|
description = "The order determines the position of app in the UI presentation. The lowest order is shown first and apps with equal order are sorted by name (ascending order)."
|
||||||
|
default = null
|
||||||
|
}
|
||||||
|
|
||||||
resource "coder_script" "jupyter-notebook" {
|
resource "coder_script" "jupyter-notebook" {
|
||||||
agent_id = var.agent_id
|
agent_id = var.agent_id
|
||||||
display_name = "jupyter-notebook"
|
display_name = "jupyter-notebook"
|
||||||
@@ -55,4 +61,5 @@ resource "coder_app" "jupyter-notebook" {
|
|||||||
icon = "/icon/jupyter.svg"
|
icon = "/icon/jupyter.svg"
|
||||||
subdomain = true
|
subdomain = true
|
||||||
share = var.share
|
share = var.share
|
||||||
|
order = var.order
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ terraform {
|
|||||||
required_providers {
|
required_providers {
|
||||||
coder = {
|
coder = {
|
||||||
source = "coder/coder"
|
source = "coder/coder"
|
||||||
version = ">= 0.12"
|
version = ">= 0.17"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -36,6 +36,12 @@ variable "share" {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
variable "order" {
|
||||||
|
type = number
|
||||||
|
description = "The order determines the position of app in the UI presentation. The lowest order is shown first and apps with equal order are sorted by name (ascending order)."
|
||||||
|
default = null
|
||||||
|
}
|
||||||
|
|
||||||
resource "coder_script" "jupyterlab" {
|
resource "coder_script" "jupyterlab" {
|
||||||
agent_id = var.agent_id
|
agent_id = var.agent_id
|
||||||
display_name = "jupyterlab"
|
display_name = "jupyterlab"
|
||||||
@@ -55,4 +61,5 @@ resource "coder_app" "jupyterlab" {
|
|||||||
icon = "/icon/jupyter.svg"
|
icon = "/icon/jupyter.svg"
|
||||||
subdomain = true
|
subdomain = true
|
||||||
share = var.share
|
share = var.share
|
||||||
|
order = var.order
|
||||||
}
|
}
|
||||||
|
|||||||
58
nodejs/README.md
Normal file
58
nodejs/README.md
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
---
|
||||||
|
display_name: nodejs
|
||||||
|
description: Install Node.js via nvm
|
||||||
|
icon: ../.icons/node.svg
|
||||||
|
maintainer_github: TheZoker
|
||||||
|
verified: false
|
||||||
|
tags: [helper]
|
||||||
|
---
|
||||||
|
|
||||||
|
# nodejs
|
||||||
|
|
||||||
|
Automatically installs [Node.js](https://github.com/nodejs/node) via [nvm](https://github.com/nvm-sh/nvm). It can also install multiple versions of node and set a default version. If no options are specified, the latest version is installed.
|
||||||
|
|
||||||
|
```tf
|
||||||
|
module "nodejs" {
|
||||||
|
source = "registry.coder.com/modules/nodejs/coder"
|
||||||
|
version = "1.0.2"
|
||||||
|
agent_id = coder_agent.example.id
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Install multiple versions
|
||||||
|
|
||||||
|
This installs multiple versions of Node.js:
|
||||||
|
|
||||||
|
```tf
|
||||||
|
module "nodejs" {
|
||||||
|
source = "registry.coder.com/modules/nodejs/coder"
|
||||||
|
version = "1.0.2"
|
||||||
|
agent_id = coder_agent.example.id
|
||||||
|
node_versions = [
|
||||||
|
"18",
|
||||||
|
"20",
|
||||||
|
"node"
|
||||||
|
]
|
||||||
|
default_node_version = "20"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Full example
|
||||||
|
|
||||||
|
A example with all available options:
|
||||||
|
|
||||||
|
```tf
|
||||||
|
module "nodejs" {
|
||||||
|
source = "registry.coder.com/modules/nodejs/coder"
|
||||||
|
version = "1.0.2"
|
||||||
|
agent_id = coder_agent.example.id
|
||||||
|
nvm_version = "v0.39.7"
|
||||||
|
nvm_install_prefix = "/opt/nvm"
|
||||||
|
node_versions = [
|
||||||
|
"16",
|
||||||
|
"18",
|
||||||
|
"node"
|
||||||
|
]
|
||||||
|
default_node_version = "16"
|
||||||
|
}
|
||||||
|
```
|
||||||
12
nodejs/main.test.ts
Normal file
12
nodejs/main.test.ts
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import { describe, expect, it } from "bun:test";
|
||||||
|
import { runTerraformInit, testRequiredVariables } from "../test";
|
||||||
|
|
||||||
|
describe("nodejs", async () => {
|
||||||
|
await runTerraformInit(import.meta.dir);
|
||||||
|
|
||||||
|
testRequiredVariables(import.meta.dir, {
|
||||||
|
agent_id: "foo",
|
||||||
|
});
|
||||||
|
|
||||||
|
// More tests depend on shebang refactors
|
||||||
|
});
|
||||||
52
nodejs/main.tf
Normal file
52
nodejs/main.tf
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
terraform {
|
||||||
|
required_version = ">= 1.0"
|
||||||
|
|
||||||
|
required_providers {
|
||||||
|
coder = {
|
||||||
|
source = "coder/coder"
|
||||||
|
version = ">= 0.12"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "agent_id" {
|
||||||
|
type = string
|
||||||
|
description = "The ID of a Coder agent."
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "nvm_version" {
|
||||||
|
type = string
|
||||||
|
description = "The version of nvm to install."
|
||||||
|
default = "master"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "nvm_install_prefix" {
|
||||||
|
type = string
|
||||||
|
description = "The prefix to install nvm to."
|
||||||
|
default = "$HOME/.nvm"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "node_versions" {
|
||||||
|
type = list(string)
|
||||||
|
description = "A list of Node.js versions to install."
|
||||||
|
default = ["node"]
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "default_node_version" {
|
||||||
|
type = string
|
||||||
|
description = "The default Node.js version"
|
||||||
|
default = "node"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "coder_script" "nodejs" {
|
||||||
|
agent_id = var.agent_id
|
||||||
|
display_name = "Node.js:"
|
||||||
|
script = templatefile("${path.module}/run.sh", {
|
||||||
|
NVM_VERSION : var.nvm_version,
|
||||||
|
INSTALL_PREFIX : var.nvm_install_prefix,
|
||||||
|
NODE_VERSIONS : join(",", var.node_versions),
|
||||||
|
DEFAULT : var.default_node_version,
|
||||||
|
})
|
||||||
|
run_on_start = true
|
||||||
|
start_blocks_login = true
|
||||||
|
}
|
||||||
50
nodejs/run.sh
Executable file
50
nodejs/run.sh
Executable file
@@ -0,0 +1,50 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
NVM_VERSION='${NVM_VERSION}'
|
||||||
|
NODE_VERSIONS='${NODE_VERSIONS}'
|
||||||
|
INSTALL_PREFIX='${INSTALL_PREFIX}'
|
||||||
|
DEFAULT='${DEFAULT}'
|
||||||
|
BOLD='\033[0;1m'
|
||||||
|
CODE='\033[36;40;1m'
|
||||||
|
RESET='\033[0m'
|
||||||
|
|
||||||
|
printf "$${BOLD}Installing nvm!$${RESET}\n"
|
||||||
|
|
||||||
|
export NVM_DIR="$${INSTALL_PREFIX}/nvm"
|
||||||
|
|
||||||
|
script="$(curl -sS -o- "https://raw.githubusercontent.com/nvm-sh/nvm/$${NVM_VERSION}/install.sh" 2>&1)"
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Failed to download nvm installation script: $script"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
output="$(bash <<< "$script" 2>&1)"
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Failed to install nvm: $output"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "🥳 nvm has been installed\n\n"
|
||||||
|
|
||||||
|
# Set up nvm for the rest of the script.
|
||||||
|
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
|
||||||
|
|
||||||
|
# Install each node version...
|
||||||
|
IFS=',' read -r -a VERSIONLIST <<< "$${NODE_VERSIONS}"
|
||||||
|
for version in "$${VERSIONLIST[@]}"; do
|
||||||
|
if [ -z "$version" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
printf "🛠️ Installing node version $${CODE}$version$${RESET}...\n"
|
||||||
|
output=$(nvm install "$version" 2>&1)
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Failed to install version: $version: $output"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Set default if provided
|
||||||
|
if [ -n "$${DEFAULT}" ]; then
|
||||||
|
printf "🛠️ Setting default node version $${CODE}$DEFAULT$${RESET}...\n"
|
||||||
|
output=$(nvm alias default $DEFAULT 2>&1)
|
||||||
|
fi
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"bun-types": "^1.0.18",
|
"bun-types": "^1.0.18",
|
||||||
"gray-matter": "^4.0.3",
|
"gray-matter": "^4.0.3",
|
||||||
"marked": "^11.1.0",
|
"marked": "^12.0.0",
|
||||||
"prettier-plugin-sh": "^0.13.1",
|
"prettier-plugin-sh": "^0.13.1",
|
||||||
"prettier-plugin-terraform-formatter": "^1.2.1"
|
"prettier-plugin-terraform-formatter": "^1.2.1"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ This module lets you authenticate with [Hashicorp Vault](https://www.vaultprojec
|
|||||||
```tf
|
```tf
|
||||||
module "vault" {
|
module "vault" {
|
||||||
source = "registry.coder.com/modules/vault-github/coder"
|
source = "registry.coder.com/modules/vault-github/coder"
|
||||||
version = "1.0.4"
|
version = "1.0.7"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
vault_addr = "https://vault.example.com"
|
vault_addr = "https://vault.example.com"
|
||||||
}
|
}
|
||||||
@@ -24,13 +24,13 @@ module "vault" {
|
|||||||
Then you can use the Vault CLI in your workspaces to fetch secrets from Vault:
|
Then you can use the Vault CLI in your workspaces to fetch secrets from Vault:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
vault kv get -mount=coder my-secret
|
vault kv get -namespace=coder -mount=secrets coder
|
||||||
```
|
```
|
||||||
|
|
||||||
or using the Vault API:
|
or using the Vault API:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
curl -H "X-Vault-Token: ${VAULT_TOKEN}" -X GET "${VAULT_ADDR}/v1/coder/data/my-secret"
|
curl -H "X-Vault-Token: ${VAULT_TOKEN}" -X GET "${VAULT_ADDR}/v1/coder/secrets/data/coder"
|
||||||
```
|
```
|
||||||
|
|
||||||

|

|
||||||
@@ -46,7 +46,7 @@ To configure the Vault module, you must set up a Vault GitHub auth method. See t
|
|||||||
```tf
|
```tf
|
||||||
module "vault" {
|
module "vault" {
|
||||||
source = "registry.coder.com/modules/vault-github/coder"
|
source = "registry.coder.com/modules/vault-github/coder"
|
||||||
version = "1.0.4"
|
version = "1.0.7"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
vault_addr = "https://vault.example.com"
|
vault_addr = "https://vault.example.com"
|
||||||
coder_github_auth_id = "my-github-auth-id"
|
coder_github_auth_id = "my-github-auth-id"
|
||||||
@@ -58,7 +58,7 @@ module "vault" {
|
|||||||
```tf
|
```tf
|
||||||
module "vault" {
|
module "vault" {
|
||||||
source = "registry.coder.com/modules/vault-github/coder"
|
source = "registry.coder.com/modules/vault-github/coder"
|
||||||
version = "1.0.4"
|
version = "1.0.7"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
vault_addr = "https://vault.example.com"
|
vault_addr = "https://vault.example.com"
|
||||||
coder_github_auth_id = "my-github-auth-id"
|
coder_github_auth_id = "my-github-auth-id"
|
||||||
@@ -71,7 +71,7 @@ module "vault" {
|
|||||||
```tf
|
```tf
|
||||||
module "vault" {
|
module "vault" {
|
||||||
source = "registry.coder.com/modules/vault-github/coder"
|
source = "registry.coder.com/modules/vault-github/coder"
|
||||||
version = "1.0.4"
|
version = "1.0.7"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
vault_addr = "https://vault.example.com"
|
vault_addr = "https://vault.example.com"
|
||||||
vault_cli_version = "1.15.0"
|
vault_cli_version = "1.15.0"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { describe } from "bun:test";
|
import { describe } from "bun:test";
|
||||||
import { runTerraformInit, testRequiredVariables } from "../test";
|
import { runTerraformInit, testRequiredVariables } from "../test";
|
||||||
|
|
||||||
describe("vault-token", async () => {
|
describe("vault-github", async () => {
|
||||||
await runTerraformInit(import.meta.dir);
|
await runTerraformInit(import.meta.dir);
|
||||||
|
|
||||||
testRequiredVariables(import.meta.dir, {
|
testRequiredVariables(import.meta.dir, {
|
||||||
|
|||||||
@@ -32,9 +32,19 @@ unzip_safe() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
install() {
|
install() {
|
||||||
|
# Get the architecture of the system
|
||||||
|
ARCH=$(uname -m)
|
||||||
|
if [ "$${ARCH}" = "x86_64" ]; then
|
||||||
|
ARCH="amd64"
|
||||||
|
elif [ "$${ARCH}" = "aarch64" ]; then
|
||||||
|
ARCH="arm64"
|
||||||
|
else
|
||||||
|
printf "Unsupported architecture: $${ARCH}\n"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
# Fetch the latest version of Vault if INSTALL_VERSION is 'latest'
|
# Fetch the latest version of Vault if INSTALL_VERSION is 'latest'
|
||||||
if [ "$${INSTALL_VERSION}" = "latest" ]; then
|
if [ "$${INSTALL_VERSION}" = "latest" ]; then
|
||||||
LATEST_VERSION=$(curl -s https://releases.hashicorp.com/vault/ | grep -v '-rc' | grep -oP 'vault/\K[0-9]+\.[0-9]+\.[0-9]+' | sort -V | tail -n 1)
|
LATEST_VERSION=$(curl -s https://releases.hashicorp.com/vault/ | grep -v 'rc' | grep -oE 'vault/[0-9]+\.[0-9]+\.[0-9]+' | sed 's/vault\///' | sort -V | tail -n 1)
|
||||||
printf "Latest version of Vault is %s.\n\n" "$${LATEST_VERSION}"
|
printf "Latest version of Vault is %s.\n\n" "$${LATEST_VERSION}"
|
||||||
if [ -z "$${LATEST_VERSION}" ]; then
|
if [ -z "$${LATEST_VERSION}" ]; then
|
||||||
printf "Failed to determine the latest Vault version.\n"
|
printf "Failed to determine the latest Vault version.\n"
|
||||||
@@ -60,7 +70,7 @@ install() {
|
|||||||
else
|
else
|
||||||
printf "Upgrading Vault CLI from version %s to %s ...\n\n" "$${CURRENT_VERSION}" "${INSTALL_VERSION}"
|
printf "Upgrading Vault CLI from version %s to %s ...\n\n" "$${CURRENT_VERSION}" "${INSTALL_VERSION}"
|
||||||
fi
|
fi
|
||||||
fetch vault.zip "https://releases.hashicorp.com/vault/$${INSTALL_VERSION}/vault_$${INSTALL_VERSION}_linux_amd64.zip"
|
fetch vault.zip "https://releases.hashicorp.com/vault/$${INSTALL_VERSION}/vault_$${INSTALL_VERSION}_linux_$${ARCH}.zip"
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
printf "Failed to download Vault.\n"
|
printf "Failed to download Vault.\n"
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ variable "vault_token" {
|
|||||||
|
|
||||||
module "vault" {
|
module "vault" {
|
||||||
source = "registry.coder.com/modules/vault-token/coder"
|
source = "registry.coder.com/modules/vault-token/coder"
|
||||||
version = "1.0.4"
|
version = "1.0.7"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
vault_token = var.token
|
vault_token = var.token
|
||||||
vault_addr = "https://vault.example.com"
|
vault_addr = "https://vault.example.com"
|
||||||
@@ -74,7 +74,7 @@ variable "vault_token" {
|
|||||||
|
|
||||||
module "vault" {
|
module "vault" {
|
||||||
source = "registry.coder.com/modules/vault-token/coder"
|
source = "registry.coder.com/modules/vault-token/coder"
|
||||||
version = "1.0.4"
|
version = "1.0.7"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
vault_addr = "https://vault.example.com"
|
vault_addr = "https://vault.example.com"
|
||||||
vault_token = var.token
|
vault_token = var.token
|
||||||
|
|||||||
@@ -30,9 +30,19 @@ unzip_safe() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
install() {
|
install() {
|
||||||
|
# Get the architecture of the system
|
||||||
|
ARCH=$(uname -m)
|
||||||
|
if [ "$${ARCH}" = "x86_64" ]; then
|
||||||
|
ARCH="amd64"
|
||||||
|
elif [ "$${ARCH}" = "aarch64" ]; then
|
||||||
|
ARCH="arm64"
|
||||||
|
else
|
||||||
|
printf "Unsupported architecture: $${ARCH}\n"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
# Fetch the latest version of Vault if INSTALL_VERSION is 'latest'
|
# Fetch the latest version of Vault if INSTALL_VERSION is 'latest'
|
||||||
if [ "$${INSTALL_VERSION}" = "latest" ]; then
|
if [ "$${INSTALL_VERSION}" = "latest" ]; then
|
||||||
LATEST_VERSION=$(curl -s https://releases.hashicorp.com/vault/ | grep -v '-rc' | grep -oP 'vault/\K[0-9]+\.[0-9]+\.[0-9]+' | sort -V | tail -n 1)
|
LATEST_VERSION=$(curl -s https://releases.hashicorp.com/vault/ | grep -v 'rc' | grep -oE 'vault/[0-9]+\.[0-9]+\.[0-9]+' | sed 's/vault\///' | sort -V | tail -n 1)
|
||||||
printf "Latest version of Vault is %s.\n\n" "$${LATEST_VERSION}"
|
printf "Latest version of Vault is %s.\n\n" "$${LATEST_VERSION}"
|
||||||
if [ -z "$${LATEST_VERSION}" ]; then
|
if [ -z "$${LATEST_VERSION}" ]; then
|
||||||
printf "Failed to determine the latest Vault version.\n"
|
printf "Failed to determine the latest Vault version.\n"
|
||||||
|
|||||||
@@ -20,5 +20,18 @@ describe("vscode-desktop", async () => {
|
|||||||
expect(state.outputs.vscode_url.value).toBe(
|
expect(state.outputs.vscode_url.value).toBe(
|
||||||
"vscode://coder.coder-remote/open?owner=default&workspace=default&token=$SESSION_TOKEN",
|
"vscode://coder.coder-remote/open?owner=default&workspace=default&token=$SESSION_TOKEN",
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const resources: any = state.resources;
|
||||||
|
expect(resources[1].instances[0].attributes.order).toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("expect order to be set", async () => {
|
||||||
|
const state = await runTerraformApply(import.meta.dir, {
|
||||||
|
agent_id: "foo",
|
||||||
|
order: "22",
|
||||||
|
});
|
||||||
|
|
||||||
|
const resources: any = state.resources;
|
||||||
|
expect(resources[1].instances[0].attributes.order).toBe(22);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ terraform {
|
|||||||
required_providers {
|
required_providers {
|
||||||
coder = {
|
coder = {
|
||||||
source = "coder/coder"
|
source = "coder/coder"
|
||||||
version = ">= 0.12"
|
version = ">= 0.17"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -20,6 +20,12 @@ variable "folder" {
|
|||||||
default = ""
|
default = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
variable "order" {
|
||||||
|
type = number
|
||||||
|
description = "The order determines the position of app in the UI presentation. The lowest order is shown first and apps with equal order are sorted by name (ascending order)."
|
||||||
|
default = null
|
||||||
|
}
|
||||||
|
|
||||||
data "coder_workspace" "me" {}
|
data "coder_workspace" "me" {}
|
||||||
|
|
||||||
resource "coder_app" "vscode" {
|
resource "coder_app" "vscode" {
|
||||||
@@ -28,6 +34,7 @@ resource "coder_app" "vscode" {
|
|||||||
icon = "/icon/code.svg"
|
icon = "/icon/code.svg"
|
||||||
slug = "vscode"
|
slug = "vscode"
|
||||||
display_name = "VS Code Desktop"
|
display_name = "VS Code Desktop"
|
||||||
|
order = var.order
|
||||||
url = var.folder != "" ? join("", [
|
url = var.folder != "" ? join("", [
|
||||||
"vscode://coder.coder-remote/open?owner=",
|
"vscode://coder.coder-remote/open?owner=",
|
||||||
data.coder_workspace.me.owner,
|
data.coder_workspace.me.owner,
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ Automatically install [Visual Studio Code Server](https://code.visualstudio.com/
|
|||||||
```tf
|
```tf
|
||||||
module "vscode-web" {
|
module "vscode-web" {
|
||||||
source = "registry.coder.com/modules/vscode-web/coder"
|
source = "registry.coder.com/modules/vscode-web/coder"
|
||||||
version = "1.0.3"
|
version = "1.0.6"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
accept_license = true
|
accept_license = true
|
||||||
}
|
}
|
||||||
@@ -29,7 +29,7 @@ module "vscode-web" {
|
|||||||
```tf
|
```tf
|
||||||
module "vscode-web" {
|
module "vscode-web" {
|
||||||
source = "registry.coder.com/modules/vscode-web/coder"
|
source = "registry.coder.com/modules/vscode-web/coder"
|
||||||
version = "1.0.3"
|
version = "1.0.6"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
install_prefix = "/home/coder/.vscode-web"
|
install_prefix = "/home/coder/.vscode-web"
|
||||||
folder = "/home/coder"
|
folder = "/home/coder"
|
||||||
@@ -42,7 +42,7 @@ module "vscode-web" {
|
|||||||
```tf
|
```tf
|
||||||
module "vscode-web" {
|
module "vscode-web" {
|
||||||
source = "registry.coder.com/modules/vscode-web/coder"
|
source = "registry.coder.com/modules/vscode-web/coder"
|
||||||
version = "1.0.2"
|
version = "1.0.6"
|
||||||
agent_id = coder_agent.example.id
|
agent_id = coder_agent.example.id
|
||||||
extensions = ["github.copilot", "ms-python.python", "ms-toolsai.jupyter"]
|
extensions = ["github.copilot", "ms-python.python", "ms-toolsai.jupyter"]
|
||||||
accept_license = true
|
accept_license = true
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ terraform {
|
|||||||
required_providers {
|
required_providers {
|
||||||
coder = {
|
coder = {
|
||||||
source = "coder/coder"
|
source = "coder/coder"
|
||||||
version = ">= 0.12"
|
version = ">= 0.17"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -85,6 +85,12 @@ variable "telemetry_level" {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
variable "order" {
|
||||||
|
type = number
|
||||||
|
description = "The order determines the position of app in the UI presentation. The lowest order is shown first and apps with equal order are sorted by name (ascending order)."
|
||||||
|
default = null
|
||||||
|
}
|
||||||
|
|
||||||
resource "coder_script" "vscode-web" {
|
resource "coder_script" "vscode-web" {
|
||||||
agent_id = var.agent_id
|
agent_id = var.agent_id
|
||||||
display_name = "VS Code Web"
|
display_name = "VS Code Web"
|
||||||
@@ -107,6 +113,7 @@ resource "coder_app" "vscode-web" {
|
|||||||
icon = "/icon/code.svg"
|
icon = "/icon/code.svg"
|
||||||
subdomain = true
|
subdomain = true
|
||||||
share = var.share
|
share = var.share
|
||||||
|
order = var.order
|
||||||
|
|
||||||
healthcheck {
|
healthcheck {
|
||||||
url = "http://localhost:${var.port}/healthz"
|
url = "http://localhost:${var.port}/healthz"
|
||||||
|
|||||||
Reference in New Issue
Block a user