diff --git a/.icons/gateway.svg b/.icons/gateway.svg new file mode 100644 index 0000000..b68e949 --- /dev/null +++ b/.icons/gateway.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/README.md b/README.md index c84593f..60a5796 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ [Registry](https://registry.coder.com) | [Coder Docs](https://coder.com/docs) | [Why Coder](https://coder.com/why) | [Coder Enterprise](https://coder.com/docs/v2/latest/enterprise) +<<<<<<< HEAD [![discord](https://img.shields.io/discord/747933592273027093?label=discord)](https://discord.gg/coder) [![license](https://img.shields.io/github/license/coder/modules)](./LICENSE) @@ -24,6 +25,12 @@ module "code-server" { - [code-server](https://registry.coder.com/modules/code-server): Install on start, create an app to access via the dashboard, install extensions, and pre-configure editor settings. - [personalize](https://registry.coder.com/modules/personalize): Run a script on workspace start that allows developers to run custom commands to personalize their workspace. - [VS Code Desktop](https://registry.coder.com/modules/vscode-desktop): Add a button to open any workspace in VS Code with a single click. +======= +- [code-server](https://registry.coder.com/modules/code-server): Run VS Code in the browser +- [personalize](https://registry.coder.com/modules/personalize): Execute a user-specific script on start +- [VS Code Desktop](https://registry.coder.com/modules/vscode-desktop): Display a button to launch VS Code desktop in the dashboard. +>>>>>>> d4c77fc688997867a21c7a5fab2ef5fa24ad6f61 +- [JetBrains Gateway](https://registry.coder.com/modules/jetbrains-gateway): Display a button to launch JetBrains Gateway IDEs in the dashboard. ## Registry @@ -40,7 +47,7 @@ To quickly start contributing with a new module, clone this repository and run: Test a module by running an instance of Coder on your local machine: ```bash -$ coder server --in-memory +coder server --in-memory ``` Create a template and edit it to include your development module: diff --git a/jetbrains-gateway/README.md b/jetbrains-gateway/README.md new file mode 100644 index 0000000..3b67d22 --- /dev/null +++ b/jetbrains-gateway/README.md @@ -0,0 +1,41 @@ +--- +display_name: JetBrains Gateway +description: Add a one-click button to launch JetBrains Gateway IDEs in the dashboard. +icon: ../.icons/gateway.svg +maintainer_github: coder +verified: true +tags: [ide, jetbrains, gateway, goland, webstorm, intellij, pycharm, phpstorm, clion, rubymine, datagrip, rider] +--- +# JetBrains Gateway + +This module adds a JetBrains Gateway IDEs to your Coder template. + +## How to use this module + +To use this module, add the following snippet to your template manifest: + +```hcl +module "jetbrains_gateway" { + source = "https://registry.coder.com/modules/jetbrains-gateway" + agent_id = coder_agent.main.id + agent_name = "main" + project_directory = "/home/coder/project" + gateway_ide_product_code = ["GO","WS"] # A list of JetBrains product codes use ["ALL"] for all products +} +``` + +## Supported IDEs + +The following JetBrains IDEs are supported: + +- GoLand (`GO`) +- WebStorm (`WS`) +- IntelliJ IDEA Ultimate (`IU`) +- IntelliJ IDEA Community (`IC`) +- PyCharm Professional (`PY`) +- PyCharm Community (`PC`) +- PhpStorm (`PS`) +- CLion (`CL`) +- RubyMine (`RM`) +- DataGrip (`DB`) +- Rider (`RD`) diff --git a/jetbrains-gateway/main.tf b/jetbrains-gateway/main.tf new file mode 100644 index 0000000..993ea41 --- /dev/null +++ b/jetbrains-gateway/main.tf @@ -0,0 +1,129 @@ +terraform { + required_version = ">= 1.0" + + required_providers { + coder = { + source = "coder/coder" + version = ">= 0.11" + } + } +} + +variable "agent_id" { + type = string + description = "The ID of a Coder agent." +} + +variable "agent_name" { + type = string + description = "The name of a Coder agent." +} + +variable "project_directory" { + type = string + description = "The directory to open in the IDE. e.g. /home/coder/project" +} + +variable "gateway_ide_product_code" { + type = list(string) + description = "The list of IDE product codes, e.g. ['GO', 'WS'] or ['ALL']" + default = ["ALL"] + validation { + condition = ( + length(var.gateway_ide_product_code) == 1 && var.gateway_ide_product_code[0] == "ALL" || + alltrue([ + for code in var.gateway_ide_product_code : contains(["IU", "IC", "PS", "WS", "PY", "PC", "CL", "GO", "DB", "RD", "RM"], code) + ]) + ) + error_message = "The gateway_ide_product_code must be ['ALL'] or a list of valid product codes. https://plugins.jetbrains.com/docs/marketplace/product-codes.html" + } +} + +locals { + gateway_ides = { + "GO" = { + icon = "/icon/goland.svg", + name = "GoLand", + value = jsonencode(["GO", "232.9921.53", "https://download.jetbrains.com/go/goland-2023.2.2.tar.gz"]) + }, + "WS" = { + icon = "/icon/webstorm.svg", + name = "WebStorm", + value = jsonencode(["WS", "232.9921.42", "https://download.jetbrains.com/webstorm/WebStorm-2023.2.2.tar.gz"]) + }, + "IU" = { + icon = "/icon/intellij.svg", + name = "IntelliJ IDEA Ultimate", + value = jsonencode(["IU", "232.9921.47", "https://download.jetbrains.com/idea/ideaIU-2023.2.2.tar.gz"]) + }, + "IC" = { + icon = "/icon/intellij.svg", + name = "IntelliJ IDEA Community", + value = jsonencode(["IC", "232.9921.47", "https://download.jetbrains.com/idea/ideaIC-2023.2.2.tar.gz"]) + }, + "PY" = { + icon = "/icon/pycharm.svg", + name = "PyCharm Professional", + value = jsonencode(["PY", "232.9559.58", "https://download.jetbrains.com/python/pycharm-professional-2023.2.1.tar.gz"]) + }, + "PC" = { + icon = "/icon/pycharm.svg", + name = "PyCharm Community", + value = jsonencode(["PC", "232.9559.58", "https://download.jetbrains.com/python/pycharm-community-2023.2.1.tar.gz"]) + }, + "RD" = { + icon = "/icon/rider.svg", + name = "Rider", + value = jsonencode(["RD", "232.9559.61", "https://download.jetbrains.com/rider/JetBrains.Rider-2023.2.1.tar.gz"]) + } + "CL" = { + icon = "/icon/clion.svg", + name = "CLion", + value = jsonencode(["CL", "232.9921.42", "https://download.jetbrains.com/cpp/CLion-2023.2.2.tar.gz"]) + }, + "DB" = { + icon = "/icon/datagrip.svg", + name = "DataGrip", + value = jsonencode(["DB", "232.9559.28", "https://download.jetbrains.com/datagrip/datagrip-2023.2.1.tar.gz"]) + }, + "PS" = { + icon = "/icon/phpstorm.svg", + name = "PhpStorm", + value = jsonencode(["PS", "232.9559.64", "https://download.jetbrains.com/webide/PhpStorm-2023.2.1.tar.gz"]) + }, + "RM" = { + icon = "/icon/rubymine.svg", + name = "RubyMine", + value = jsonencode(["RM", "232.9921.48", "https://download.jetbrains.com/ruby/RubyMine-2023.2.2.tar.gz"]) + } + } +} + +data "coder_parameter" "jetbrains_ide" { + type = "list(string)" + name = "jetbrains_ide" + display_name = "JetBrains IDE" + icon = "/icon/gateway.svg" + mutable = true + default = local.gateway_ides["GO"].value + + dynamic "option" { + for_each = contains(var.gateway_ide_product_code, "ALL") ? local.gateway_ides : { for key, value in local.gateway_ides : key => value if contains(var.gateway_ide_product_code, key) } + content { + icon = option.value.icon + name = option.value.name + value = option.value.value + } + } +} + +data "coder_workspace" "me" {} + +resource "coder_app" "gateway" { + agent_id = var.agent_id + display_name = data.coder_parameter.jetbrains_ide.option[index(data.coder_parameter.jetbrains_ide.option.*.value, data.coder_parameter.jetbrains_ide.value)].name + slug = "gateway" + url = "jetbrains-gateway://connect#type=coder&workspace=${data.coder_workspace.me.name}&agent=${var.agent_name}&folder=${var.project_directory}&url=${data.coder_workspace.me.access_url}&token=${data.coder_workspace.me.owner_session_token}&ide_product_code=${jsondecode(data.coder_parameter.jetbrains_ide.value)[0]}&ide_build_number=${jsondecode(data.coder_parameter.jetbrains_ide.value)[1]}&ide_download_link=${jsondecode(data.coder_parameter.jetbrains_ide.value)[2]}" + icon = data.coder_parameter.jetbrains_ide.option[index(data.coder_parameter.jetbrains_ide.option.*.value, data.coder_parameter.jetbrains_ide.value)].icon + external = true +}