diff --git a/.sample/main.tf b/.sample/main.tf index 5dcaf01..733f121 100644 --- a/.sample/main.tf +++ b/.sample/main.tf @@ -61,7 +61,7 @@ resource "coder_script" "MODULE_NAME" { LOG_PATH : var.log_path, }) run_on_start = true - run_on_stopt = false + run_on_stop = false } resource "coder_app" "MODULE_NAME" { diff --git a/jfrog/README.md b/jfrog/README.md index f5f9670..119eb28 100644 --- a/jfrog/README.md +++ b/jfrog/README.md @@ -10,4 +10,58 @@ tags: [integration] # JFrog -TODO + + + + +```hcl +module "jfrog" { + source = "https://registry.coder.com/modules/jfrog" + +} +``` + +## Examples + +### Example 1 + +Install the Dracula theme from [OpenVSX](https://open-vsx.org/): + +```hcl +module "jfrog" { + source = "https://registry.coder.com/modules/jfrog" + agent_id = coder_agent.example.id + extensions = [ + "dracula-theme.theme-dracula" + ] +} +``` + +Enter the `.` into the extensions array and code-server will automatically install on start. + +### Example 2 + +Configure VS Code's [settings.json](https://code.visualstudio.com/docs/getstarted/settings#_settingsjson) file: + +```hcl +module "jfrog" { + source = "https://registry.coder.com/modules/jfrog" + agent_id = coder_agent.example.id + extensions = [ "dracula-theme.theme-dracula" ] + settings = { + "workbench.colorTheme" = "Dracula" + } +} +``` + +### Example 3 + +Run code-server in the background, don't fetch it from GitHub: + +```hcl +module "jfrog" { + source = "https://registry.coder.com/modules/jfrog" + agent_id = coder_agent.example.id + offline = true +} +``` diff --git a/jfrog/main.tf b/jfrog/main.tf new file mode 100644 index 0000000..5b0e7b6 --- /dev/null +++ b/jfrog/main.tf @@ -0,0 +1,111 @@ +terraform { + required_version = ">= 1.0" + + required_providers { + coder = { + source = "coder/coder" + version = ">= 0.12" + } + artifactory = { + source = "registry.terraform.io/jfrog/artifactory" + version = "~> 8.4.0" + } + } +} + +variable "jfrog_host" { + type = string + description = "JFrog instance hostname. e.g. YYY.jfrog.io" +} + +variable "artifactory_access_token" { + type = string + description = "The admin-level access token to use for JFrog." +} + +# Configure the Artifactory provider +provider "artifactory" { + url = "https://${var.jfrog_host}/artifactory" + access_token = var.artifactory_access_token +} + +variable "agent_id" { + type = string + description = "The ID of a Coder agent." +} + +variable "package_managers" { + type = map(string) + description = < 0 ? local.artifactory_username : "plan" +} + +resource "coder_script" "jfrog" { + agent_id = var.agent_id + display_name = "jfrog" + icon = local.icon_url + script = templatefile("${path.module}/run.sh", { + JFROG_HOST : var.jfrog_host, + ARTIFACTORY_USERNAME : artifactory_scoped_token.me.username, + ARTIFACTORY_ACCESS_TOKEN : artifactory_scoped_token.me.token, + REPOSITORY_NPM : lookup(var.package_managers, "npm", ""), + REPOSITORY_GO : lookup(var.package_managers, "go", ""), + REPOSITORY_PYPI : lookup(var.package_managers, "pypi", ""), + }) + run_on_start = true +} + +resource "coder_app" "jfrog" { + agent_id = var.agent_id + slug = "jfrog" + display_name = "jfrog" + url = "http://localhost:${var.port}" + icon = loocal.icon_url + subdomain = false + share = "owner" + + # Remove if the app does not have a healthcheck endpoint + healthcheck { + url = "http://localhost:${var.port}/healthz" + interval = 5 + threshold = 6 + } +} + +data "coder_parameter" "jfrog" { + type = "list(string)" + name = "jfrog" + display_name = "jfrog" + icon = local.icon_url + mutable = var.mutable + default = local.options["Option 1"]["value"] + + dynamic "option" { + for_each = local.options + content { + icon = option.value.icon + name = option.value.name + value = option.value.value + } + } +} + diff --git a/jfrog/run.sh b/jfrog/run.sh new file mode 100644 index 0000000..3dd9d4e --- /dev/null +++ b/jfrog/run.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env sh + +BOLD='\033[0;1m' +echo "$${BOLD}Installing JFrog CLI..." + +# The jf CLI checks $CI when determining whether to use interactive +# flows. +export CI=true + +jf c rm 0 || true +echo ${ARTIFACTORY_ACCESS_TOKEN} | jf c add --access-token-stdin --url https://${JFROG_HOST} 0 + +# Configure the `npm` CLI to use the Artifactory "npm" repository. +if [ -z "${REPOSITORY_NPM}" ]; then + echo "🤔 REPOSITORY_NPM is not set, skipping npm configuration." +else + echo "📦 Configuring npm..." + jf rt npm-config set registry https://${JFROG_HOST}/artifactory/api/npm/${REPOSITORY_NPM} + cat << EOF > ~/.npmrc + email = ${ARTIFACTORY_EMAIL} + registry = https://${JFROG_HOST}/artifactory/api/npm/${REPOSITORY_NPM} + EOF + jf rt curl /api/npm/auth >> .npmrc +fi + +# Configure the `pip` to use the Artifactory "python" repository. +if [ -z "${REPOSITORY_PYPI}" ]; then + echo "🤔 REPOSITORY_PYPI is not set, skipping pip configuration." +else + echo "🐍 Configuring pip..." + mkdir -p ~/.pip + cat << EOF > ~/.pip/pip.conf + [global] + index-url = https://${ARTIFACTORY_USERNAME}:${ARTIFACTORY_ACCESS_TOKEN}@${JFROG_HOST}/artifactory/api/pypi/${REPOSITORY_PYPI}/simple + EOF +fi + +# Set GOPROXY to use the Artifactory "go" repository. +if [ -z "${REPOSITORY_GO}" ]; then + echo "🤔 REPOSITORY_GO is not set, skipping go configuration." +else + echo "🐹 Configuring go..." + export GOPROXY="https://${ARTIFACTORY_USERNAME}:${ARTIFACTORY_ACCESS_TOKEN}@${JFROG_HOST}/artifactory/api/go/${REPOSITORY_GO}" +fi +echo "🥳 Configuration comlete!" +