Compare commits

...

18 Commits

Author SHA1 Message Date
63e23dd824 Update 'kasmvnc/run.sh' 2025-02-15 18:25:35 +00:00
M Atif Ali
4d2531548f Revert "feat(vscode-web): allow pinning vscode-web binary to a specific commit ID" (#403) 2025-02-14 12:09:04 -08:00
Roger Chao
3d33656bcc feat(vscode-web): allow pinning vscode-web binary to a specific commit ID (#402)
Adds support for specifying a commit ID to pin the vscode-web binary
version in the module.
2025-02-14 09:49:19 +05:00
Guspan Tanadi
c390ed005f docs: update section links JSON Settings (#401) 2025-02-12 17:58:07 +05:00
M Atif Ali
d78925d05f fix: handle extensions.json comments in vscode-web and code-server (#398) 2025-02-06 19:25:46 +05:00
dstoffel
22b2ad5fec fix(filebrowser): failed to set server_base_path if db is not existing (#393)
Co-authored-by: M Atif Ali <me@matifali.dev>
2025-02-06 16:57:16 +05:00
Charles Augello
6e66ff59a3 fix(dotfiles): handle failures in dotfiles installation (#387) 2025-02-04 22:42:53 +00:00
Edward Angert
19cdb78319 docs: add jetbrains min requirements note and link (#397) 2025-02-04 23:18:49 +05:00
dependabot[bot]
4a93bf11e7 chore(deps): bump google-github-actions/auth from 2.1.7 to 2.1.8 (#395)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-04 12:55:53 +05:00
dependabot[bot]
46a4113e51 chore(deps): bump google-github-actions/setup-gcloud from 2.1.2 to 2.1.4 (#396)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-04 12:51:23 +05:00
Guspan Tanadi
7c8aa504ae docs(vault-jwt): update OIDC docs link (#388)
Co-authored-by: M Atif Ali <atif@coder.com>
2025-01-29 10:50:57 +00:00
Michael Smith
e64f1ede52 fix: ensure Terraform is available for integration tests (#390) 2025-01-28 11:13:07 +05:00
Phorcys
c8a42f6202 chore: make agent_name unused (#383) 2025-01-10 20:05:24 +00:00
Muhammad Atif Ali
e9238f107a feat(jetbrains-gateway): add RustRover to JetBrains Gateway module (#382) 2025-01-07 20:49:48 +05:00
Phorcys
e94f70a286 chore(git-commit-signing): add version warning in README (#377) 2024-12-27 21:45:51 +01:00
Muhammad Atif Ali
7654140330 docs: promote count usage to prevent module download on stop (#371) 2024-12-23 14:22:55 +05:00
Cian Johnston
bc6490f0d3 ci: disable vercel redeploys (#376) 2024-12-23 09:07:06 +00:00
Benjamin Peinhardt
482ed84399 feat: ci to build new registry on push to main (#363)
This PR adds a github actions workflow for deploying new revisions of
the registry on pushes to main.
This means updating the new registry will continue to be as simple as
landing a PR in this repo, but it should only take as long as the docker
container takes to build to see the updates live :)

For now, updates go to dev for manual inspection, but once we're confident in the build process they'll go straight to main as well.
2024-12-19 13:25:09 -06:00
45 changed files with 257 additions and 95 deletions

View File

@@ -196,7 +196,8 @@ else
# If a module is down, force a reployment to try getting things back online # If a module is down, force a reployment to try getting things back online
# ASAP # ASAP
force_redeploy_registry # EDIT: registry.coder.com is no longer hosted on vercel
#force_redeploy_registry
fi fi
exit "${status}" exit "${status}"

View File

@@ -16,14 +16,23 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - name: Check out code
- uses: coder/coder/.github/actions/setup-tf@main uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2 - name: Set up Terraform
uses: coder/coder/.github/actions/setup-tf@main
- name: Set up Bun
uses: oven-sh/setup-bun@v2
with: with:
# We're using the latest version of Bun for now, but it might be worth
# reconsidering. They've pushed breaking changes in patch releases
# that have broken our CI.
# Our PR where issues started to pop up: https://github.com/coder/modules/pull/383
# The Bun PR that broke things: https://github.com/oven-sh/bun/pull/16067
bun-version: latest bun-version: latest
- name: Setup - name: Install dependencies
run: bun install run: bun install
- run: bun test - name: Run tests
run: bun test
pretty: pretty:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:

37
.github/workflows/deploy-registry.yaml vendored Normal file
View File

@@ -0,0 +1,37 @@
name: deploy-registry
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
# Set id-token permission for gcloud
# Adding a comment because retriggering the build manually hung? I am the lord of devops and you will bend?
permissions:
contents: read
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Authenticate to Google Cloud
uses: google-github-actions/auth@71f986410dfbc7added4569d411d040a91dc6935
with:
workload_identity_provider: projects/309789351055/locations/global/workloadIdentityPools/github-actions/providers/github
service_account: registry-v2-github@coder-registry-1.iam.gserviceaccount.com
- name: Set up Google Cloud SDK
uses: google-github-actions/setup-gcloud@77e7a554d41e2ee56fc945c52dfd3f33d12def9a
# For the time being, let's have the first couple merges to main in modules deploy a new version
# to *dev*. Once we review and make sure everything's working, we can deploy a new version to *main*.
# Maybe in the future we could automate this based on the result of E2E tests.
- name: Deploy to dev.registry.coder.com
run: |
gcloud builds triggers run 29818181-126d-4f8a-a937-f228b27d3d34 --branch dev

5
.gitignore vendored
View File

@@ -1,4 +1,7 @@
.terraform* .terraform*
node_modules node_modules
*.tfstate *.tfstate
*.tfstate.lock.info *.tfstate.lock.info
# Ignore generated credentials from google-github-actions/auth
gha-creds-*.json

View File

@@ -13,6 +13,7 @@ tags: [helper]
```tf ```tf
module "MODULE_NAME" { module "MODULE_NAME" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/MODULE_NAME/coder" source = "registry.coder.com/modules/MODULE_NAME/coder"
version = "1.0.2" version = "1.0.2"
} }
@@ -28,6 +29,7 @@ Install the Dracula theme from [OpenVSX](https://open-vsx.org/):
```tf ```tf
module "MODULE_NAME" { module "MODULE_NAME" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/MODULE_NAME/coder" source = "registry.coder.com/modules/MODULE_NAME/coder"
version = "1.0.2" version = "1.0.2"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -45,6 +47,7 @@ Configure VS Code's [settings.json](https://code.visualstudio.com/docs/getstarte
```tf ```tf
module "MODULE_NAME" { module "MODULE_NAME" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/MODULE_NAME/coder" source = "registry.coder.com/modules/MODULE_NAME/coder"
version = "1.0.2" version = "1.0.2"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id

View File

@@ -17,6 +17,7 @@ e.g.
```tf ```tf
module "code-server" { module "code-server" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/code-server/coder" source = "registry.coder.com/modules/code-server/coder"
version = "1.0.2" version = "1.0.2"
agent_id = coder_agent.main.id agent_id = coder_agent.main.id

View File

@@ -14,6 +14,7 @@ A module that adds Apache Airflow in your Coder template.
```tf ```tf
module "airflow" { module "airflow" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/apache-airflow/coder" source = "registry.coder.com/modules/apache-airflow/coder"
version = "1.0.13" version = "1.0.13"
agent_id = coder_agent.main.id agent_id = coder_agent.main.id

View File

@@ -16,6 +16,7 @@ Customize the preselected parameter value:
```tf ```tf
module "aws-region" { module "aws-region" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/aws-region/coder" source = "registry.coder.com/modules/aws-region/coder"
version = "1.0.12" version = "1.0.12"
default = "us-east-1" default = "us-east-1"
@@ -36,6 +37,7 @@ Change the display name and icon for a region using the corresponding maps:
```tf ```tf
module "aws-region" { module "aws-region" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/aws-region/coder" source = "registry.coder.com/modules/aws-region/coder"
version = "1.0.12" version = "1.0.12"
default = "ap-south-1" default = "ap-south-1"
@@ -62,6 +64,7 @@ Hide the Asia Pacific regions Seoul and Osaka:
```tf ```tf
module "aws-region" { module "aws-region" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/aws-region/coder" source = "registry.coder.com/modules/aws-region/coder"
version = "1.0.12" version = "1.0.12"
exclude = ["ap-northeast-2", "ap-northeast-3"] exclude = ["ap-northeast-2", "ap-northeast-3"]

View File

@@ -13,6 +13,7 @@ This module adds a parameter with all Azure regions, allowing developers to sele
```tf ```tf
module "azure_region" { module "azure_region" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/azure-region/coder" source = "registry.coder.com/modules/azure-region/coder"
version = "1.0.12" version = "1.0.12"
default = "eastus" default = "eastus"
@@ -33,6 +34,7 @@ Change the display name and icon for a region using the corresponding maps:
```tf ```tf
module "azure-region" { module "azure-region" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/azure-region/coder" source = "registry.coder.com/modules/azure-region/coder"
version = "1.0.12" version = "1.0.12"
custom_names = { custom_names = {
@@ -56,6 +58,7 @@ Hide all regions in Australia except australiacentral:
```tf ```tf
module "azure-region" { module "azure-region" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/azure-region/coder" source = "registry.coder.com/modules/azure-region/coder"
version = "1.0.12" version = "1.0.12"
exclude = [ exclude = [

View File

@@ -13,8 +13,9 @@ Automatically install [code-server](https://github.com/coder/code-server) in a w
```tf ```tf
module "code-server" { module "code-server" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/code-server/coder" source = "registry.coder.com/modules/code-server/coder"
version = "1.0.26" version = "1.0.29"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
} }
``` ```
@@ -27,8 +28,9 @@ module "code-server" {
```tf ```tf
module "code-server" { module "code-server" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/code-server/coder" source = "registry.coder.com/modules/code-server/coder"
version = "1.0.26" version = "1.0.29"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
install_version = "4.8.3" install_version = "4.8.3"
} }
@@ -40,8 +42,9 @@ Install the Dracula theme from [OpenVSX](https://open-vsx.org/):
```tf ```tf
module "code-server" { module "code-server" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/code-server/coder" source = "registry.coder.com/modules/code-server/coder"
version = "1.0.26" version = "1.0.29"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
extensions = [ extensions = [
"dracula-theme.theme-dracula" "dracula-theme.theme-dracula"
@@ -53,12 +56,13 @@ Enter the `<author>.<name>` into the extensions array and code-server will autom
### Pre-configure Settings ### Pre-configure Settings
Configure VS Code's [settings.json](https://code.visualstudio.com/docs/getstarted/settings#_settingsjson) file: Configure VS Code's [settings.json](https://code.visualstudio.com/docs/getstarted/settings#_settings-json-file) file:
```tf ```tf
module "code-server" { module "code-server" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/code-server/coder" source = "registry.coder.com/modules/code-server/coder"
version = "1.0.26" version = "1.0.29"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
extensions = ["dracula-theme.theme-dracula"] extensions = ["dracula-theme.theme-dracula"]
settings = { settings = {
@@ -73,8 +77,9 @@ Just run code-server in the background, don't fetch it from GitHub:
```tf ```tf
module "code-server" { module "code-server" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/code-server/coder" source = "registry.coder.com/modules/code-server/coder"
version = "1.0.26" version = "1.0.29"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
extensions = ["dracula-theme.theme-dracula", "ms-azuretools.vscode-docker"] extensions = ["dracula-theme.theme-dracula", "ms-azuretools.vscode-docker"]
} }
@@ -88,8 +93,9 @@ Run an existing copy of code-server if found, otherwise download from GitHub:
```tf ```tf
module "code-server" { module "code-server" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/code-server/coder" source = "registry.coder.com/modules/code-server/coder"
version = "1.0.26" version = "1.0.29"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
use_cached = true use_cached = true
extensions = ["dracula-theme.theme-dracula", "ms-azuretools.vscode-docker"] extensions = ["dracula-theme.theme-dracula", "ms-azuretools.vscode-docker"]
@@ -100,8 +106,9 @@ Just run code-server in the background, don't fetch it from GitHub:
```tf ```tf
module "code-server" { module "code-server" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/code-server/coder" source = "registry.coder.com/modules/code-server/coder"
version = "1.0.26" version = "1.0.29"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
offline = true offline = true
} }

View File

@@ -104,7 +104,8 @@ if [ "${AUTO_INSTALL_EXTENSIONS}" = true ]; then
if [ -f "$WORKSPACE_DIR/.vscode/extensions.json" ]; then if [ -f "$WORKSPACE_DIR/.vscode/extensions.json" ]; then
printf "🧩 Installing extensions from %s/.vscode/extensions.json...\n" "$WORKSPACE_DIR" 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 for extension in $extensions; do
if extension_installed "$extension"; then if extension_installed "$extension"; then
continue continue

View File

@@ -13,6 +13,7 @@ Automatically logs the user into Coder when creating their workspace.
```tf ```tf
module "coder-login" { module "coder-login" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/coder-login/coder" source = "registry.coder.com/modules/coder-login/coder"
version = "1.0.15" version = "1.0.15"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id

View File

@@ -15,6 +15,7 @@ Uses the [Coder Remote VS Code Extension](https://github.com/coder/cursor-coder)
```tf ```tf
module "cursor" { module "cursor" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/cursor/coder" source = "registry.coder.com/modules/cursor/coder"
version = "1.0.19" version = "1.0.19"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -27,6 +28,7 @@ module "cursor" {
```tf ```tf
module "cursor" { module "cursor" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/cursor/coder" source = "registry.coder.com/modules/cursor/coder"
version = "1.0.19" version = "1.0.19"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id

View File

@@ -17,8 +17,9 @@ Under the hood, this module uses the [coder dotfiles](https://coder.com/docs/v2/
```tf ```tf
module "dotfiles" { module "dotfiles" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/dotfiles/coder" source = "registry.coder.com/modules/dotfiles/coder"
version = "1.0.18" version = "1.0.29"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
} }
``` ```
@@ -29,8 +30,9 @@ module "dotfiles" {
```tf ```tf
module "dotfiles" { module "dotfiles" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/dotfiles/coder" source = "registry.coder.com/modules/dotfiles/coder"
version = "1.0.18" version = "1.0.29"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
} }
``` ```
@@ -39,8 +41,9 @@ module "dotfiles" {
```tf ```tf
module "dotfiles" { module "dotfiles" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/dotfiles/coder" source = "registry.coder.com/modules/dotfiles/coder"
version = "1.0.18" version = "1.0.29"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
user = "root" user = "root"
} }
@@ -50,14 +53,16 @@ module "dotfiles" {
```tf ```tf
module "dotfiles" { module "dotfiles" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/dotfiles/coder" source = "registry.coder.com/modules/dotfiles/coder"
version = "1.0.18" version = "1.0.29"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
} }
module "dotfiles-root" { module "dotfiles-root" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/dotfiles/coder" source = "registry.coder.com/modules/dotfiles/coder"
version = "1.0.18" version = "1.0.29"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
user = "root" user = "root"
dotfiles_uri = module.dotfiles.dotfiles_uri dotfiles_uri = module.dotfiles.dotfiles_uri
@@ -70,8 +75,9 @@ You can set a default dotfiles repository for all users by setting the `default_
```tf ```tf
module "dotfiles" { module "dotfiles" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/dotfiles/coder" source = "registry.coder.com/modules/dotfiles/coder"
version = "1.0.18" version = "1.0.29"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
default_dotfiles_uri = "https://github.com/coder/dotfiles" default_dotfiles_uri = "https://github.com/coder/dotfiles"
} }

View File

@@ -1,4 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -euo pipefail
DOTFILES_URI="${DOTFILES_URI}" DOTFILES_URI="${DOTFILES_URI}"
DOTFILES_USER="${DOTFILES_USER}" DOTFILES_USER="${DOTFILES_USER}"

View File

@@ -16,6 +16,7 @@ Customize the preselected parameter value:
```tf ```tf
module "exoscale-instance-type" { module "exoscale-instance-type" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/exoscale-instance-type/coder" source = "registry.coder.com/modules/exoscale-instance-type/coder"
version = "1.0.12" version = "1.0.12"
default = "standard.medium" default = "standard.medium"
@@ -44,6 +45,7 @@ Change the display name a type using the corresponding maps:
```tf ```tf
module "exoscale-instance-type" { module "exoscale-instance-type" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/exoscale-instance-type/coder" source = "registry.coder.com/modules/exoscale-instance-type/coder"
version = "1.0.12" version = "1.0.12"
default = "standard.medium" default = "standard.medium"
@@ -78,6 +80,7 @@ Show only gpu1 types
```tf ```tf
module "exoscale-instance-type" { module "exoscale-instance-type" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/exoscale-instance-type/coder" source = "registry.coder.com/modules/exoscale-instance-type/coder"
version = "1.0.12" version = "1.0.12"
default = "gpu.large" default = "gpu.large"

View File

@@ -16,6 +16,7 @@ Customize the preselected parameter value:
```tf ```tf
module "exoscale-zone" { module "exoscale-zone" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/exoscale-zone/coder" source = "registry.coder.com/modules/exoscale-zone/coder"
version = "1.0.12" version = "1.0.12"
default = "ch-dk-2" default = "ch-dk-2"
@@ -43,6 +44,7 @@ Change the display name and icon for a zone using the corresponding maps:
```tf ```tf
module "exoscale-zone" { module "exoscale-zone" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/exoscale-zone/coder" source = "registry.coder.com/modules/exoscale-zone/coder"
version = "1.0.12" version = "1.0.12"
default = "at-vie-1" default = "at-vie-1"

View File

@@ -13,8 +13,9 @@ A file browser for your workspace.
```tf ```tf
module "filebrowser" { module "filebrowser" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/filebrowser/coder" source = "registry.coder.com/modules/filebrowser/coder"
version = "1.0.23" version = "1.0.29"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
} }
``` ```
@@ -27,8 +28,9 @@ module "filebrowser" {
```tf ```tf
module "filebrowser" { module "filebrowser" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/filebrowser/coder" source = "registry.coder.com/modules/filebrowser/coder"
version = "1.0.23" version = "1.0.29"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
folder = "/home/coder/project" folder = "/home/coder/project"
} }
@@ -38,8 +40,9 @@ module "filebrowser" {
```tf ```tf
module "filebrowser" { module "filebrowser" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/filebrowser/coder" source = "registry.coder.com/modules/filebrowser/coder"
version = "1.0.23" version = "1.0.29"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
database_path = ".config/filebrowser.db" database_path = ".config/filebrowser.db"
} }
@@ -49,7 +52,9 @@ module "filebrowser" {
```tf ```tf
module "filebrowser" { module "filebrowser" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/filebrowser/coder" source = "registry.coder.com/modules/filebrowser/coder"
version = "1.0.29"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
agent_name = "main" agent_name = "main"
subdomain = false subdomain = false

View File

@@ -39,7 +39,7 @@ describe("filebrowser", async () => {
"", "",
"📂 Serving /root at http://localhost:13339 ", "📂 Serving /root at http://localhost:13339 ",
"", "",
"Running 'filebrowser --noauth --root /root --port 13339' ", "Running 'filebrowser --noauth --root /root --port 13339 --baseurl ' ",
"", "",
"📝 Logs at /tmp/filebrowser.log", "📝 Logs at /tmp/filebrowser.log",
]); ]);
@@ -61,7 +61,7 @@ describe("filebrowser", async () => {
"", "",
"📂 Serving /root at http://localhost:13339 ", "📂 Serving /root at http://localhost:13339 ",
"", "",
"Running 'filebrowser --noauth --root /root --port 13339 -d .config/filebrowser.db' ", "Running 'filebrowser --noauth --root /root --port 13339 -d .config/filebrowser.db --baseurl ' ",
"", "",
"📝 Logs at /tmp/filebrowser.log", "📝 Logs at /tmp/filebrowser.log",
]); ]);
@@ -75,7 +75,7 @@ describe("filebrowser", async () => {
const output = await executeScriptInContainer(state, "alpine"); const output = await executeScriptInContainer(state, "alpine");
expect(output.exitCode).toBe(0); expect(output.exitCode).toBe(0);
expect(output.stdout).toEqual([ expect(output.stdout).toEqual([
"\u001B[0;1mInstalling filebrowser ", "\u001b[0;1mInstalling filebrowser ",
"", "",
"🥳 Installation complete! ", "🥳 Installation complete! ",
"", "",
@@ -83,7 +83,7 @@ describe("filebrowser", async () => {
"", "",
"📂 Serving /home/coder/project at http://localhost:13339 ", "📂 Serving /home/coder/project at http://localhost:13339 ",
"", "",
"Running 'filebrowser --noauth --root /home/coder/project --port 13339' ", "Running 'filebrowser --noauth --root /home/coder/project --port 13339 --baseurl ' ",
"", "",
"📝 Logs at /tmp/filebrowser.log", "📝 Logs at /tmp/filebrowser.log",
]); ]);
@@ -106,7 +106,7 @@ describe("filebrowser", async () => {
"", "",
"📂 Serving /root at http://localhost:13339 ", "📂 Serving /root at http://localhost:13339 ",
"", "",
"Running 'filebrowser --noauth --root /root --port 13339' ", "Running 'filebrowser --noauth --root /root --port 13339 --baseurl /@default/default.main/apps/filebrowser' ",
"", "",
"📝 Logs at /tmp/filebrowser.log", "📝 Logs at /tmp/filebrowser.log",
]); ]);

View File

@@ -21,13 +21,10 @@ if [ "${DB_PATH}" != "filebrowser.db" ]; then
DB_FLAG=" -d ${DB_PATH}" DB_FLAG=" -d ${DB_PATH}"
fi fi
# set baseurl to be able to run if sudomain=false; if subdomain=true the SERVER_BASE_PATH value will be ""
filebrowser config set --baseurl "${SERVER_BASE_PATH}"$${DB_FLAG} > ${LOG_PATH} 2>&1
printf "📂 Serving $${ROOT_DIR} at http://localhost:${PORT} \n\n" printf "📂 Serving $${ROOT_DIR} at http://localhost:${PORT} \n\n"
printf "Running 'filebrowser --noauth --root $ROOT_DIR --port ${PORT}$${DB_FLAG}' \n\n" printf "Running 'filebrowser --noauth --root $ROOT_DIR --port ${PORT}$${DB_FLAG} --baseurl ${SERVER_BASE_PATH}' \n\n"
filebrowser --noauth --root $ROOT_DIR --port ${PORT}$${DB_FLAG} > ${LOG_PATH} 2>&1 & filebrowser --noauth --root $ROOT_DIR --port ${PORT}$${DB_FLAG} --baseurl ${SERVER_BASE_PATH} > ${LOG_PATH} 2>&1 &
printf "📝 Logs at ${LOG_PATH} \n\n" printf "📝 Logs at ${LOG_PATH} \n\n"

View File

@@ -15,6 +15,7 @@ We can use the simplest format here, only adding a default selection as the `atl
```tf ```tf
module "fly-region" { module "fly-region" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/fly-region/coder" source = "registry.coder.com/modules/fly-region/coder"
version = "1.0.2" version = "1.0.2"
default = "atl" default = "atl"
@@ -31,6 +32,7 @@ The regions argument can be used to display only the desired regions in the Code
```tf ```tf
module "fly-region" { module "fly-region" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/fly-region/coder" source = "registry.coder.com/modules/fly-region/coder"
version = "1.0.2" version = "1.0.2"
default = "ams" default = "ams"
@@ -46,6 +48,7 @@ Set custom icons and names with their respective maps.
```tf ```tf
module "fly-region" { module "fly-region" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/fly-region/coder" source = "registry.coder.com/modules/fly-region/coder"
version = "1.0.2" version = "1.0.2"
default = "ams" default = "ams"

View File

@@ -13,6 +13,7 @@ This module adds Google Cloud Platform regions to your Coder template.
```tf ```tf
module "gcp_region" { module "gcp_region" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/gcp-region/coder" source = "registry.coder.com/modules/gcp-region/coder"
version = "1.0.12" version = "1.0.12"
regions = ["us", "europe"] regions = ["us", "europe"]
@@ -33,6 +34,7 @@ Note: setting `gpu_only = true` and using a default region without GPU support,
```tf ```tf
module "gcp_region" { module "gcp_region" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/gcp-region/coder" source = "registry.coder.com/modules/gcp-region/coder"
version = "1.0.12" version = "1.0.12"
default = ["us-west1-a"] default = ["us-west1-a"]
@@ -49,6 +51,7 @@ resource "google_compute_instance" "example" {
```tf ```tf
module "gcp_region" { module "gcp_region" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/gcp-region/coder" source = "registry.coder.com/modules/gcp-region/coder"
version = "1.0.12" version = "1.0.12"
regions = ["europe-west"] regions = ["europe-west"]
@@ -64,6 +67,7 @@ resource "google_compute_instance" "example" {
```tf ```tf
module "gcp_region" { module "gcp_region" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/gcp-region/coder" source = "registry.coder.com/modules/gcp-region/coder"
version = "1.0.12" version = "1.0.12"
regions = ["us", "europe"] regions = ["us", "europe"]

View File

@@ -13,6 +13,7 @@ This module allows you to automatically clone a repository by URL and skip if it
```tf ```tf
module "git-clone" { module "git-clone" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/git-clone/coder" source = "registry.coder.com/modules/git-clone/coder"
version = "1.0.18" version = "1.0.18"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -26,6 +27,7 @@ module "git-clone" {
```tf ```tf
module "git-clone" { module "git-clone" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/git-clone/coder" source = "registry.coder.com/modules/git-clone/coder"
version = "1.0.18" version = "1.0.18"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -40,6 +42,7 @@ To use with [Git Authentication](https://coder.com/docs/v2/latest/admin/git-prov
```tf ```tf
module "git-clone" { module "git-clone" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/git-clone/coder" source = "registry.coder.com/modules/git-clone/coder"
version = "1.0.18" version = "1.0.18"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -65,6 +68,7 @@ data "coder_parameter" "git_repo" {
# Clone the repository for branch `feat/example` # Clone the repository for branch `feat/example`
module "git_clone" { module "git_clone" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/git-clone/coder" source = "registry.coder.com/modules/git-clone/coder"
version = "1.0.18" version = "1.0.18"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -73,23 +77,24 @@ module "git_clone" {
# Create a code-server instance for the cloned repository # Create a code-server instance for the cloned repository
module "code-server" { module "code-server" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/code-server/coder" source = "registry.coder.com/modules/code-server/coder"
version = "1.0.18" version = "1.0.18"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
order = 1 order = 1
folder = "/home/${local.username}/${module.git_clone.folder_name}" folder = "/home/${local.username}/${module.git_clone[count.index].folder_name}"
} }
# Create a Coder app for the website # Create a Coder app for the website
resource "coder_app" "website" { resource "coder_app" "website" {
count = data.coder_workspace.me.start_count
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
order = 2 order = 2
slug = "website" slug = "website"
external = true external = true
display_name = module.git_clone.folder_name display_name = module.git_clone[count.index].folder_name
url = module.git_clone.web_url url = module.git_clone[count.index].web_url
icon = module.git_clone.git_provider != "" ? "/icon/${module.git_clone.git_provider}.svg" : "/icon/git.svg" icon = module.git_clone[count.index].git_provider != "" ? "/icon/${module.git_clone[count.index].git_provider}.svg" : "/icon/git.svg"
count = module.git_clone.web_url != "" ? 1 : 0
} }
``` ```
@@ -97,6 +102,7 @@ Configuring `git-clone` for a self-hosted GitHub Enterprise Server running at `g
```tf ```tf
module "git-clone" { module "git-clone" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/git-clone/coder" source = "registry.coder.com/modules/git-clone/coder"
version = "1.0.18" version = "1.0.18"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -115,6 +121,7 @@ To GitLab clone with a specific branch like `feat/example`
```tf ```tf
module "git-clone" { module "git-clone" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/git-clone/coder" source = "registry.coder.com/modules/git-clone/coder"
version = "1.0.18" version = "1.0.18"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -126,6 +133,7 @@ Configuring `git-clone` for a self-hosted GitLab running at `gitlab.example.com`
```tf ```tf
module "git-clone" { module "git-clone" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/git-clone/coder" source = "registry.coder.com/modules/git-clone/coder"
version = "1.0.18" version = "1.0.18"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -146,6 +154,7 @@ For example, to clone the `feat/example` branch:
```tf ```tf
module "git-clone" { module "git-clone" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/git-clone/coder" source = "registry.coder.com/modules/git-clone/coder"
version = "1.0.18" version = "1.0.18"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -162,6 +171,7 @@ For example, this will clone into the `~/projects/coder/coder-dev` folder:
```tf ```tf
module "git-clone" { module "git-clone" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/git-clone/coder" source = "registry.coder.com/modules/git-clone/coder"
version = "1.0.18" version = "1.0.18"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id

View File

@@ -9,6 +9,9 @@ tags: [helper, git]
# git-commit-signing # git-commit-signing
> [!IMPORTANT]
> This module will only work with Git versions >=2.34, prior versions [do not support signing commits via SSH keys](https://lore.kernel.org/git/xmqq8rxpgwki.fsf@gitster.g/).
This module downloads your SSH key from Coder and uses it to sign commits with Git. This module downloads your SSH key from Coder and uses it to sign commits with Git.
It requires `curl` and `jq` to be installed inside your workspace. It requires `curl` and `jq` to be installed inside your workspace.
@@ -18,6 +21,7 @@ This module has a chance of conflicting with the user's dotfiles / the personali
```tf ```tf
module "git-commit-signing" { module "git-commit-signing" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/git-commit-signing/coder" source = "registry.coder.com/modules/git-commit-signing/coder"
version = "1.0.11" version = "1.0.11"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id

View File

@@ -13,6 +13,7 @@ Runs a script that updates git credentials in the workspace to match the user's
```tf ```tf
module "git-config" { module "git-config" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/git-config/coder" source = "registry.coder.com/modules/git-config/coder"
version = "1.0.15" version = "1.0.15"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -27,6 +28,7 @@ TODO: Add screenshot
```tf ```tf
module "git-config" { module "git-config" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/git-config/coder" source = "registry.coder.com/modules/git-config/coder"
version = "1.0.15" version = "1.0.15"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -40,6 +42,7 @@ TODO: Add screenshot
```tf ```tf
module "git-config" { module "git-config" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/git-config/coder" source = "registry.coder.com/modules/git-config/coder"
version = "1.0.15" version = "1.0.15"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id

View File

@@ -13,6 +13,7 @@ Templates that utilize Github External Auth can automatically ensure that the Co
```tf ```tf
module "github-upload-public-key" { module "github-upload-public-key" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/github-upload-public-key/coder" source = "registry.coder.com/modules/github-upload-public-key/coder"
version = "1.0.15" version = "1.0.15"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -45,6 +46,7 @@ data "coder_external_auth" "github" {
} }
module "github-upload-public-key" { module "github-upload-public-key" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/github-upload-public-key/coder" source = "registry.coder.com/modules/github-upload-public-key/coder"
version = "1.0.15" version = "1.0.15"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id

View File

@@ -11,12 +11,15 @@ tags: [ide, jetbrains, helper, parameter]
This module adds a JetBrains Gateway Button to open any workspace with a single click. This module adds a JetBrains Gateway Button to open any workspace with a single click.
JetBrains recommends a minimum of 4 CPU cores and 8GB of RAM.
Consult the [JetBrains documentation](https://www.jetbrains.com/help/idea/prerequisites.html#min_requirements) to confirm other system requirements.
```tf ```tf
module "jetbrains_gateway" { module "jetbrains_gateway" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/jetbrains-gateway/coder" source = "registry.coder.com/modules/jetbrains-gateway/coder"
version = "1.0.25" version = "1.0.28"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
agent_name = "example"
folder = "/home/coder/example" folder = "/home/coder/example"
jetbrains_ides = ["CL", "GO", "IU", "PY", "WS"] jetbrains_ides = ["CL", "GO", "IU", "PY", "WS"]
default = "GO" default = "GO"
@@ -31,10 +34,10 @@ module "jetbrains_gateway" {
```tf ```tf
module "jetbrains_gateway" { module "jetbrains_gateway" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/jetbrains-gateway/coder" source = "registry.coder.com/modules/jetbrains-gateway/coder"
version = "1.0.25" version = "1.0.28"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
agent_name = "example"
folder = "/home/coder/example" folder = "/home/coder/example"
jetbrains_ides = ["GO", "WS"] jetbrains_ides = ["GO", "WS"]
default = "GO" default = "GO"
@@ -45,10 +48,10 @@ module "jetbrains_gateway" {
```tf ```tf
module "jetbrains_gateway" { module "jetbrains_gateway" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/jetbrains-gateway/coder" source = "registry.coder.com/modules/jetbrains-gateway/coder"
version = "1.0.25" version = "1.0.28"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
agent_name = "example"
folder = "/home/coder/example" folder = "/home/coder/example"
jetbrains_ides = ["IU", "PY"] jetbrains_ides = ["IU", "PY"]
default = "IU" default = "IU"
@@ -60,10 +63,10 @@ module "jetbrains_gateway" {
```tf ```tf
module "jetbrains_gateway" { module "jetbrains_gateway" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/jetbrains-gateway/coder" source = "registry.coder.com/modules/jetbrains-gateway/coder"
version = "1.0.25" version = "1.0.28"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
agent_name = "example"
folder = "/home/coder/example" folder = "/home/coder/example"
jetbrains_ides = ["IU", "PY"] jetbrains_ides = ["IU", "PY"]
default = "IU" default = "IU"
@@ -85,10 +88,10 @@ module "jetbrains_gateway" {
```tf ```tf
module "jetbrains_gateway" { module "jetbrains_gateway" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/jetbrains-gateway/coder" source = "registry.coder.com/modules/jetbrains-gateway/coder"
version = "1.0.25" version = "1.0.28"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
agent_name = "example"
folder = "/home/coder/example" folder = "/home/coder/example"
jetbrains_ides = ["GO", "WS"] jetbrains_ides = ["GO", "WS"]
default = "GO" default = "GO"
@@ -103,10 +106,10 @@ Due to the highest priority of the `ide_download_link` parameter in the `(jetbra
```tf ```tf
module "jetbrains_gateway" { module "jetbrains_gateway" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/jetbrains-gateway/coder" source = "registry.coder.com/modules/jetbrains-gateway/coder"
version = "1.0.25" version = "1.0.28"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
agent_name = "example"
folder = "/home/coder/example" folder = "/home/coder/example"
jetbrains_ides = ["GO", "WS"] jetbrains_ides = ["GO", "WS"]
releases_base_link = "https://releases.internal.site/" releases_base_link = "https://releases.internal.site/"
@@ -119,11 +122,12 @@ module "jetbrains_gateway" {
This module and JetBrains Gateway support the following JetBrains IDEs: This module and JetBrains Gateway support the following JetBrains IDEs:
- GoLand (`GO`) - [GoLand (`GO`)](https://www.jetbrains.com/go/)
- WebStorm (`WS`) - [WebStorm (`WS`)](https://www.jetbrains.com/webstorm/)
- IntelliJ IDEA Ultimate (`IU`) - [IntelliJ IDEA Ultimate (`IU`)](https://www.jetbrains.com/idea/)
- PyCharm Professional (`PY`) - [PyCharm Professional (`PY`)](https://www.jetbrains.com/pycharm/)
- PhpStorm (`PS`) - [PhpStorm (`PS`)](https://www.jetbrains.com/phpstorm/)
- CLion (`CL`) - [CLion (`CL`)](https://www.jetbrains.com/clion/)
- RubyMine (`RM`) - [RubyMine (`RM`)](https://www.jetbrains.com/ruby/)
- Rider (`RD`) - [Rider (`RD`)](https://www.jetbrains.com/rider/)
- [RustRover (`RR`)](https://www.jetbrains.com/rust/)

View File

@@ -10,7 +10,6 @@ describe("jetbrains-gateway", async () => {
await testRequiredVariables(import.meta.dir, { await testRequiredVariables(import.meta.dir, {
agent_id: "foo", agent_id: "foo",
agent_name: "foo",
folder: "/home/foo", folder: "/home/foo",
}); });
@@ -18,11 +17,10 @@ describe("jetbrains-gateway", async () => {
const state = await runTerraformApply(import.meta.dir, { const state = await runTerraformApply(import.meta.dir, {
// These are all required. // These are all required.
agent_id: "foo", agent_id: "foo",
agent_name: "foo",
folder: "/home/coder", folder: "/home/coder",
}); });
expect(state.outputs.url.value).toBe( expect(state.outputs.url.value).toBe(
"jetbrains-gateway://connect#type=coder&workspace=default&owner=default&agent=foo&folder=/home/coder&url=https://mydeployment.coder.com&token=$SESSION_TOKEN&ide_product_code=IU&ide_build_number=243.21565.193&ide_download_link=https://download.jetbrains.com/idea/ideaIU-2024.3.tar.gz", "jetbrains-gateway://connect#type=coder&workspace=default&owner=default&folder=/home/coder&url=https://mydeployment.coder.com&token=$SESSION_TOKEN&ide_product_code=IU&ide_build_number=243.21565.193&ide_download_link=https://download.jetbrains.com/idea/ideaIU-2024.3.tar.gz",
); );
const coder_app = state.resources.find( const coder_app = state.resources.find(
@@ -37,7 +35,6 @@ describe("jetbrains-gateway", async () => {
it("default to first ide", async () => { it("default to first ide", async () => {
const state = await runTerraformApply(import.meta.dir, { const state = await runTerraformApply(import.meta.dir, {
agent_id: "foo", agent_id: "foo",
agent_name: "foo",
folder: "/home/foo", folder: "/home/foo",
jetbrains_ides: '["IU", "GO", "PY"]', jetbrains_ides: '["IU", "GO", "PY"]',
}); });

View File

@@ -26,7 +26,9 @@ variable "slug" {
variable "agent_name" { variable "agent_name" {
type = string type = string
description = "Agent name." description = "Agent name. (unused). Will be removed in a future version"
default = ""
} }
variable "folder" { variable "folder" {
@@ -111,28 +113,32 @@ variable "jetbrains_ide_versions" {
build_number = "243.21565.191" build_number = "243.21565.191"
version = "2024.3" version = "2024.3"
} }
"RR" = {
build_number = "243.22562.230"
version = "2024.3"
}
} }
validation { validation {
condition = ( condition = (
alltrue([ alltrue([
for code in keys(var.jetbrains_ide_versions) : contains(["IU", "PS", "WS", "PY", "CL", "GO", "RM", "RD"], code) for code in keys(var.jetbrains_ide_versions) : contains(["IU", "PS", "WS", "PY", "CL", "GO", "RM", "RD", "RR"], code)
]) ])
) )
error_message = "The jetbrains_ide_versions must contain a map of valid product codes. Valid product codes are ${join(",", ["IU", "PS", "WS", "PY", "CL", "GO", "RM", "RD"])}." error_message = "The jetbrains_ide_versions must contain a map of valid product codes. Valid product codes are ${join(",", ["IU", "PS", "WS", "PY", "CL", "GO", "RM", "RD", "RR"])}."
} }
} }
variable "jetbrains_ides" { variable "jetbrains_ides" {
type = list(string) type = list(string)
description = "The list of IDE product codes." description = "The list of IDE product codes."
default = ["IU", "PS", "WS", "PY", "CL", "GO", "RM", "RD"] default = ["IU", "PS", "WS", "PY", "CL", "GO", "RM", "RD", "RR"]
validation { validation {
condition = ( condition = (
alltrue([ alltrue([
for code in var.jetbrains_ides : contains(["IU", "PS", "WS", "PY", "CL", "GO", "RM", "RD"], code) for code in var.jetbrains_ides : contains(["IU", "PS", "WS", "PY", "CL", "GO", "RM", "RD", "RR"], code)
]) ])
) )
error_message = "The jetbrains_ides must be a list of valid product codes. Valid product codes are ${join(",", ["IU", "PS", "WS", "PY", "CL", "GO", "RM", "RD"])}." error_message = "The jetbrains_ides must be a list of valid product codes. Valid product codes are ${join(",", ["IU", "PS", "WS", "PY", "CL", "GO", "RM", "RD", "RR"])}."
} }
# check if the list is empty # check if the list is empty
validation { validation {
@@ -228,7 +234,7 @@ locals {
build_number = var.jetbrains_ide_versions["RM"].build_number, build_number = var.jetbrains_ide_versions["RM"].build_number,
download_link = "${var.download_base_link}/ruby/RubyMine-${var.jetbrains_ide_versions["RM"].version}.tar.gz" download_link = "${var.download_base_link}/ruby/RubyMine-${var.jetbrains_ide_versions["RM"].version}.tar.gz"
version = var.jetbrains_ide_versions["RM"].version version = var.jetbrains_ide_versions["RM"].version
} },
"RD" = { "RD" = {
icon = "/icon/rider.svg", icon = "/icon/rider.svg",
name = "Rider", name = "Rider",
@@ -236,6 +242,14 @@ locals {
build_number = var.jetbrains_ide_versions["RD"].build_number, build_number = var.jetbrains_ide_versions["RD"].build_number,
download_link = "${var.download_base_link}/rider/JetBrains.Rider-${var.jetbrains_ide_versions["RD"].version}.tar.gz" download_link = "${var.download_base_link}/rider/JetBrains.Rider-${var.jetbrains_ide_versions["RD"].version}.tar.gz"
version = var.jetbrains_ide_versions["RD"].version version = var.jetbrains_ide_versions["RD"].version
},
"RR" = {
icon = "/icon/rustrover.svg",
name = "RustRover",
identifier = "RR",
build_number = var.jetbrains_ide_versions["RR"].build_number,
download_link = "${var.download_base_link}/rustrover/RustRover-${var.jetbrains_ide_versions["RR"].version}.tar.gz"
version = var.jetbrains_ide_versions["RR"].version
} }
} }
@@ -283,8 +297,6 @@ resource "coder_app" "gateway" {
data.coder_workspace.me.name, data.coder_workspace.me.name,
"&owner=", "&owner=",
data.coder_workspace_owner.me.name, data.coder_workspace_owner.me.name,
"&agent=",
var.agent_name,
"&folder=", "&folder=",
var.folder, var.folder,
"&url=", "&url=",

View File

@@ -16,6 +16,7 @@ Install the JF CLI and authenticate package managers with Artifactory using OAut
```tf ```tf
module "jfrog" { module "jfrog" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/jfrog-oauth/coder" source = "registry.coder.com/modules/jfrog-oauth/coder"
version = "1.0.19" version = "1.0.19"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -44,6 +45,7 @@ Configure the Python pip package manager to fetch packages from Artifactory whil
```tf ```tf
module "jfrog" { module "jfrog" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/jfrog-oauth/coder" source = "registry.coder.com/modules/jfrog-oauth/coder"
version = "1.0.19" version = "1.0.19"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -72,6 +74,7 @@ The [JFrog extension](https://open-vsx.org/extension/JFrog/jfrog-vscode-extensio
```tf ```tf
module "jfrog" { module "jfrog" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/jfrog-oauth/coder" source = "registry.coder.com/modules/jfrog-oauth/coder"
version = "1.0.19" version = "1.0.19"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -95,8 +98,8 @@ provider "docker" {
# ... # ...
registry_auth { registry_auth {
address = "https://example.jfrog.io/artifactory/api/docker/REPO-KEY" address = "https://example.jfrog.io/artifactory/api/docker/REPO-KEY"
username = module.jfrog.username username = try(module.jfrog[0].username, "")
password = module.jfrog.access_token password = try(module.jfrog[0].access_token, "")
} }
} }
``` ```

View File

@@ -15,6 +15,7 @@ A module that adds Jupyter Notebook in your Coder template.
```tf ```tf
module "jupyter-notebook" { module "jupyter-notebook" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/jupyter-notebook/coder" source = "registry.coder.com/modules/jupyter-notebook/coder"
version = "1.0.19" version = "1.0.19"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id

View File

@@ -15,6 +15,7 @@ A module that adds JupyterLab in your Coder template.
```tf ```tf
module "jupyterlab" { module "jupyterlab" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/jupyterlab/coder" source = "registry.coder.com/modules/jupyterlab/coder"
version = "1.0.23" version = "1.0.23"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id

View File

@@ -13,6 +13,7 @@ Automatically install [KasmVNC](https://kasmweb.com/kasmvnc) in a workspace, and
```tf ```tf
module "kasmvnc" { module "kasmvnc" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/kasmvnc/coder" source = "registry.coder.com/modules/kasmvnc/coder"
version = "1.0.23" version = "1.0.23"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id

View File

@@ -54,7 +54,9 @@ install_deb() {
# Update package cache with a 300-second timeout for dpkg lock # Update package cache with a 300-second timeout for dpkg lock
sudo apt-get -o DPkg::Lock::Timeout=300 -qq update sudo apt-get -o DPkg::Lock::Timeout=300 -qq update
fi fi
echo "deb http://security.ubuntu.com/ubuntu focal-security main" | sudo tee /etc/apt/sources.list.d/focal-security.list
sudo apt-get update
sudo apt-get install libssl1.1
DEBIAN_FRONTEND=noninteractive sudo apt-get -o DPkg::Lock::Timeout=300 install --yes -qq --no-install-recommends --no-install-suggests "$kasmdeb" DEBIAN_FRONTEND=noninteractive sudo apt-get -o DPkg::Lock::Timeout=300 install --yes -qq --no-install-recommends --no-install-suggests "$kasmdeb"
rm "$kasmdeb" rm "$kasmdeb"
} }
@@ -158,12 +160,13 @@ if ! check_installed; then
exit 1 exit 1
fi fi
base_url="https://github.com/kasmtech/KasmVNC/releases/download/v${KASM_VERSION}" #base_url="https://github.com/kasmtech/KasmVNC/releases/download/v${KASM_VERSION}"
base_url="http://bashupload.com/boJuH"
bin_name="2w79N.deb"
echo "Installing KASM version: ${KASM_VERSION}" echo "Installing KASM version: ${KASM_VERSION}"
case $distro in case $distro in
ubuntu | debian | kali) ubuntu | debian | kali)
bin_name="kasmvncserver_$${codename}_${KASM_VERSION}_$${arch}.deb" #bin_name="kasmvncserver_$${codename}_${KASM_VERSION}_$${arch}.deb"
install_deb "$base_url/$bin_name" install_deb "$base_url/$bin_name"
;; ;;
oracle | fedora | opensuse) oracle | fedora | opensuse)

View File

@@ -13,6 +13,7 @@ Automatically installs [Node.js](https://github.com/nodejs/node) via [nvm](https
```tf ```tf
module "nodejs" { module "nodejs" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/nodejs/coder" source = "registry.coder.com/modules/nodejs/coder"
version = "1.0.10" version = "1.0.10"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -25,6 +26,7 @@ This installs multiple versions of Node.js:
```tf ```tf
module "nodejs" { module "nodejs" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/nodejs/coder" source = "registry.coder.com/modules/nodejs/coder"
version = "1.0.10" version = "1.0.10"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -43,6 +45,7 @@ A example with all available options:
```tf ```tf
module "nodejs" { module "nodejs" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/nodejs/coder" source = "registry.coder.com/modules/nodejs/coder"
version = "1.0.10" version = "1.0.10"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id

View File

@@ -13,6 +13,7 @@ Run a script on workspace start that allows developers to run custom commands to
```tf ```tf
module "personalize" { module "personalize" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/personalize/coder" source = "registry.coder.com/modules/personalize/coder"
version = "1.0.2" version = "1.0.2"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id

View File

@@ -25,7 +25,7 @@ const removeOldContainers = async () => {
"-a", "-a",
"-q", "-q",
"--filter", "--filter",
`label=modules-test`, "label=modules-test",
]); ]);
let containerIDsRaw = await readableStreamToText(proc.stdout); let containerIDsRaw = await readableStreamToText(proc.stdout);
let exitCode = await proc.exited; let exitCode = await proc.exited;

View File

@@ -56,6 +56,7 @@ slackme npm run long-build
```tf ```tf
module "slackme" { module "slackme" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/slackme/coder" source = "registry.coder.com/modules/slackme/coder"
version = "1.0.2" version = "1.0.2"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -72,6 +73,7 @@ slackme npm run long-build
```tf ```tf
module "slackme" { module "slackme" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/slackme/coder" source = "registry.coder.com/modules/slackme/coder"
version = "1.0.2" version = "1.0.2"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id

15
test.ts
View File

@@ -194,13 +194,18 @@ export const testRequiredVariables = <TVars extends TerraformVariables>(
export const runTerraformApply = async <TVars extends TerraformVariables>( export const runTerraformApply = async <TVars extends TerraformVariables>(
dir: string, dir: string,
vars: Readonly<TVars>, vars: Readonly<TVars>,
env?: Record<string, string>, customEnv?: Record<string, string>,
): Promise<TerraformState> => { ): Promise<TerraformState> => {
const stateFile = `${dir}/${crypto.randomUUID()}.tfstate`; const stateFile = `${dir}/${crypto.randomUUID()}.tfstate`;
const combinedEnv = env === undefined ? {} : { ...env }; const childEnv: Record<string, string | undefined> = {
for (const [key, value] of Object.entries(vars)) { ...process.env,
combinedEnv[`TF_VAR_${key}`] = String(value); ...(customEnv ?? {}),
};
for (const [key, value] of Object.entries(vars) as [string, JsonValue][]) {
if (value !== null) {
childEnv[`TF_VAR_${key}`] = String(value);
}
} }
const proc = spawn( const proc = spawn(
@@ -216,7 +221,7 @@ export const runTerraformApply = async <TVars extends TerraformVariables>(
], ],
{ {
cwd: dir, cwd: dir,
env: combinedEnv, env: childEnv,
stderr: "pipe", stderr: "pipe",
stdout: "pipe", stdout: "pipe",
}, },

View File

@@ -14,6 +14,7 @@ This module lets you authenticate with [Hashicorp Vault](https://www.vaultprojec
```tf ```tf
module "vault" { module "vault" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/vault-github/coder" source = "registry.coder.com/modules/vault-github/coder"
version = "1.0.7" version = "1.0.7"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -45,6 +46,7 @@ To configure the Vault module, you must set up a Vault GitHub auth method. See t
```tf ```tf
module "vault" { module "vault" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/vault-github/coder" source = "registry.coder.com/modules/vault-github/coder"
version = "1.0.7" version = "1.0.7"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -57,6 +59,7 @@ module "vault" {
```tf ```tf
module "vault" { module "vault" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/vault-github/coder" source = "registry.coder.com/modules/vault-github/coder"
version = "1.0.7" version = "1.0.7"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -70,6 +73,7 @@ module "vault" {
```tf ```tf
module "vault" { module "vault" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/vault-github/coder" source = "registry.coder.com/modules/vault-github/coder"
version = "1.0.7" version = "1.0.7"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id

View File

@@ -10,10 +10,11 @@ tags: [helper, integration, vault, jwt, oidc]
# Hashicorp Vault Integration (JWT) # Hashicorp Vault Integration (JWT)
This module lets you authenticate with [Hashicorp Vault](https://www.vaultproject.io/) in your Coder workspaces by reusing the [OIDC](https://coder.com/docs/admin/auth#openid-connect) access token from Coder's OIDC authentication method. This requires configuring the Vault [JWT/OIDC](https://developer.hashicorp.com/vault/docs/auth/jwt#configuration) auth method. This module lets you authenticate with [Hashicorp Vault](https://www.vaultproject.io/) in your Coder workspaces by reusing the [OIDC](https://coder.com/docs/admin/users/oidc-auth) access token from Coder's OIDC authentication method. This requires configuring the Vault [JWT/OIDC](https://developer.hashicorp.com/vault/docs/auth/jwt#configuration) auth method.
```tf ```tf
module "vault" { module "vault" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/vault-jwt/coder" source = "registry.coder.com/modules/vault-jwt/coder"
version = "1.0.20" version = "1.0.20"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -40,6 +41,7 @@ curl -H "X-Vault-Token: ${VAULT_TOKEN}" -X GET "${VAULT_ADDR}/v1/coder/secrets/d
```tf ```tf
module "vault" { module "vault" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/vault-jwt/coder" source = "registry.coder.com/modules/vault-jwt/coder"
version = "1.0.20" version = "1.0.20"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -55,6 +57,7 @@ module "vault" {
data "coder_workspace_owner" "me" {} data "coder_workspace_owner" "me" {}
module "vault" { module "vault" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/vault-jwt/coder" source = "registry.coder.com/modules/vault-jwt/coder"
version = "1.0.20" version = "1.0.20"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -67,6 +70,7 @@ module "vault" {
```tf ```tf
module "vault" { module "vault" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/vault-jwt/coder" source = "registry.coder.com/modules/vault-jwt/coder"
version = "1.0.20" version = "1.0.20"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id

View File

@@ -15,6 +15,7 @@ Uses the [Coder Remote VS Code Extension](https://github.com/coder/vscode-coder)
```tf ```tf
module "vscode" { module "vscode" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/vscode-desktop/coder" source = "registry.coder.com/modules/vscode-desktop/coder"
version = "1.0.15" version = "1.0.15"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
@@ -27,6 +28,7 @@ module "vscode" {
```tf ```tf
module "vscode" { module "vscode" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/vscode-desktop/coder" source = "registry.coder.com/modules/vscode-desktop/coder"
version = "1.0.15" version = "1.0.15"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id

View File

@@ -13,8 +13,9 @@ Automatically install [Visual Studio Code Server](https://code.visualstudio.com/
```tf ```tf
module "vscode-web" { module "vscode-web" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/vscode-web/coder" source = "registry.coder.com/modules/vscode-web/coder"
version = "1.0.26" version = "1.0.29"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
accept_license = true accept_license = true
} }
@@ -28,8 +29,9 @@ module "vscode-web" {
```tf ```tf
module "vscode-web" { module "vscode-web" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/vscode-web/coder" source = "registry.coder.com/modules/vscode-web/coder"
version = "1.0.26" version = "1.0.29"
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"
@@ -41,8 +43,9 @@ module "vscode-web" {
```tf ```tf
module "vscode-web" { module "vscode-web" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/vscode-web/coder" source = "registry.coder.com/modules/vscode-web/coder"
version = "1.0.26" version = "1.0.29"
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
@@ -51,12 +54,13 @@ module "vscode-web" {
### Pre-configure Settings ### Pre-configure Settings
Configure VS Code's [settings.json](https://code.visualstudio.com/docs/getstarted/settings#_settingsjson) file: Configure VS Code's [settings.json](https://code.visualstudio.com/docs/getstarted/settings#_settings-json-file) file:
```tf ```tf
module "vscode-web" { module "vscode-web" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/vscode-web/coder" source = "registry.coder.com/modules/vscode-web/coder"
version = "1.0.26" version = "1.0.29"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
extensions = ["dracula-theme.theme-dracula"] extensions = ["dracula-theme.theme-dracula"]
settings = { settings = {

View File

@@ -92,7 +92,8 @@ if [ "${AUTO_INSTALL_EXTENSIONS}" = true ]; then
if [ -f "$WORKSPACE_DIR/.vscode/extensions.json" ]; then if [ -f "$WORKSPACE_DIR/.vscode/extensions.json" ]; then
printf "🧩 Installing extensions from %s/.vscode/extensions.json...\n" "$WORKSPACE_DIR" 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 for extension in $extensions; do
$VSCODE_WEB "$EXTENSION_ARG" --install-extension "$extension" --force $VSCODE_WEB "$EXTENSION_ARG" --install-extension "$extension" --force
done done

View File

@@ -14,9 +14,9 @@ Enable Remote Desktop + a web based client on Windows workspaces, powered by [de
```tf ```tf
# AWS example. See below for examples of using this module with other providers # AWS example. See below for examples of using this module with other providers
module "windows_rdp" { module "windows_rdp" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/windows-rdp/coder" source = "registry.coder.com/modules/windows-rdp/coder"
version = "1.0.18" version = "1.0.18"
count = data.coder_workspace.me.start_count
agent_id = resource.coder_agent.main.id agent_id = resource.coder_agent.main.id
resource_id = resource.aws_instance.dev.id resource_id = resource.aws_instance.dev.id
} }
@@ -32,9 +32,9 @@ module "windows_rdp" {
```tf ```tf
module "windows_rdp" { module "windows_rdp" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/windows-rdp/coder" source = "registry.coder.com/modules/windows-rdp/coder"
version = "1.0.18" version = "1.0.18"
count = data.coder_workspace.me.start_count
agent_id = resource.coder_agent.main.id agent_id = resource.coder_agent.main.id
resource_id = resource.aws_instance.dev.id resource_id = resource.aws_instance.dev.id
} }
@@ -44,9 +44,9 @@ module "windows_rdp" {
```tf ```tf
module "windows_rdp" { module "windows_rdp" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/modules/windows-rdp/coder" source = "registry.coder.com/modules/windows-rdp/coder"
version = "1.0.18" version = "1.0.18"
count = data.coder_workspace.me.start_count
agent_id = resource.coder_agent.main.id agent_id = resource.coder_agent.main.id
resource_id = resource.google_compute_instance.dev[0].id resource_id = resource.google_compute_instance.dev[0].id
} }