You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
174 lines
5.3 KiB
HCL
174 lines
5.3 KiB
HCL
terraform {
|
|
required_version = ">= 1.0"
|
|
|
|
required_providers {
|
|
coder = {
|
|
source = "coder/coder"
|
|
version = ">= 0.23"
|
|
}
|
|
}
|
|
}
|
|
|
|
variable "jfrog_url" {
|
|
type = string
|
|
description = "JFrog instance URL. e.g. https://myartifactory.jfrog.io"
|
|
# ensue the URL is HTTPS or HTTP
|
|
validation {
|
|
condition = can(regex("^(https|http)://", var.jfrog_url))
|
|
error_message = "jfrog_url must be a valid URL starting with either 'https://' or 'http://'"
|
|
}
|
|
}
|
|
|
|
variable "jfrog_server_id" {
|
|
type = string
|
|
description = "The server ID of the JFrog instance for JFrog CLI configuration"
|
|
default = "0"
|
|
}
|
|
|
|
variable "username_field" {
|
|
type = string
|
|
description = "The field to use for the artifactory username. i.e. Coder username or email."
|
|
default = "username"
|
|
validation {
|
|
condition = can(regex("^(email|username)$", var.username_field))
|
|
error_message = "username_field must be either 'email' or 'username'"
|
|
}
|
|
}
|
|
|
|
variable "external_auth_id" {
|
|
type = string
|
|
description = "JFrog external auth ID. Default: 'jfrog'"
|
|
default = "jfrog"
|
|
}
|
|
|
|
variable "agent_id" {
|
|
type = string
|
|
description = "The ID of a Coder agent."
|
|
}
|
|
|
|
variable "configure_code_server" {
|
|
type = bool
|
|
description = "Set to true to configure code-server to use JFrog."
|
|
default = false
|
|
}
|
|
|
|
variable "package_managers" {
|
|
type = object({
|
|
npm = optional(list(string), [])
|
|
go = optional(list(string), [])
|
|
pypi = optional(list(string), [])
|
|
docker = optional(list(string), [])
|
|
})
|
|
description = <<-EOF
|
|
A map of package manager names to their respective artifactory repositories. Unused package managers can be omitted.
|
|
For example:
|
|
{
|
|
npm = ["GLOBAL_NPM_REPO_KEY", "@SCOPED:NPM_REPO_KEY"]
|
|
go = ["YOUR_GO_REPO_KEY", "ANOTHER_GO_REPO_KEY"]
|
|
pypi = ["YOUR_PYPI_REPO_KEY", "ANOTHER_PYPI_REPO_KEY"]
|
|
docker = ["YOUR_DOCKER_REPO_KEY", "ANOTHER_DOCKER_REPO_KEY"]
|
|
}
|
|
EOF
|
|
}
|
|
|
|
locals {
|
|
# The username field to use for artifactory
|
|
username = var.username_field == "email" ? data.coder_workspace_owner.me.email : data.coder_workspace_owner.me.name
|
|
jfrog_host = split("://", var.jfrog_url)[1]
|
|
common_values = {
|
|
JFROG_URL = var.jfrog_url
|
|
JFROG_HOST = local.jfrog_host
|
|
JFROG_SERVER_ID = var.jfrog_server_id
|
|
ARTIFACTORY_USERNAME = local.username
|
|
ARTIFACTORY_EMAIL = data.coder_workspace_owner.me.email
|
|
ARTIFACTORY_ACCESS_TOKEN = data.coder_external_auth.jfrog.access_token
|
|
}
|
|
npmrc = templatefile(
|
|
"${path.module}/.npmrc.tftpl",
|
|
merge(
|
|
local.common_values,
|
|
{
|
|
REPOS = [
|
|
for r in var.package_managers.npm :
|
|
strcontains(r, ":") ? zipmap(["SCOPE", "NAME"], ["${split(":", r)[0]}:", split(":", r)[1]]) : { SCOPE = "", NAME = r }
|
|
]
|
|
}
|
|
)
|
|
)
|
|
pip_conf = templatefile(
|
|
"${path.module}/pip.conf.tftpl", merge(local.common_values, { REPOS = var.package_managers.pypi })
|
|
)
|
|
}
|
|
|
|
data "coder_workspace" "me" {}
|
|
data "coder_workspace_owner" "me" {}
|
|
|
|
data "coder_external_auth" "jfrog" {
|
|
id = var.external_auth_id
|
|
}
|
|
|
|
resource "coder_script" "jfrog" {
|
|
agent_id = var.agent_id
|
|
display_name = "jfrog"
|
|
icon = "/icon/jfrog.svg"
|
|
script = templatefile("${path.module}/run.sh", merge(
|
|
local.common_values,
|
|
{
|
|
CONFIGURE_CODE_SERVER = var.configure_code_server
|
|
HAS_NPM = length(var.package_managers.npm) == 0 ? "" : "YES"
|
|
NPMRC = local.npmrc
|
|
REPOSITORY_NPM = try(element(var.package_managers.npm, 0), "")
|
|
HAS_GO = length(var.package_managers.go) == 0 ? "" : "YES"
|
|
REPOSITORY_GO = try(element(var.package_managers.go, 0), "")
|
|
HAS_PYPI = length(var.package_managers.pypi) == 0 ? "" : "YES"
|
|
PIP_CONF = local.pip_conf
|
|
REPOSITORY_PYPI = try(element(var.package_managers.pypi, 0), "")
|
|
HAS_DOCKER = length(var.package_managers.docker) == 0 ? "" : "YES"
|
|
REGISTER_DOCKER = join("\n", formatlist("register_docker \"%s\"", var.package_managers.docker))
|
|
}
|
|
))
|
|
run_on_start = true
|
|
}
|
|
|
|
resource "coder_env" "jfrog_ide_url" {
|
|
count = var.configure_code_server ? 1 : 0
|
|
agent_id = var.agent_id
|
|
name = "JFROG_IDE_URL"
|
|
value = var.jfrog_url
|
|
}
|
|
|
|
resource "coder_env" "jfrog_ide_access_token" {
|
|
count = var.configure_code_server ? 1 : 0
|
|
agent_id = var.agent_id
|
|
name = "JFROG_IDE_ACCESS_TOKEN"
|
|
value = data.coder_external_auth.jfrog.access_token
|
|
}
|
|
|
|
resource "coder_env" "jfrog_ide_store_connection" {
|
|
count = var.configure_code_server ? 1 : 0
|
|
agent_id = var.agent_id
|
|
name = "JFROG_IDE_STORE_CONNECTION"
|
|
value = true
|
|
}
|
|
|
|
resource "coder_env" "goproxy" {
|
|
count = length(var.package_managers.go) == 0 ? 0 : 1
|
|
agent_id = var.agent_id
|
|
name = "GOPROXY"
|
|
value = join(",", [
|
|
for repo in var.package_managers.go :
|
|
"https://${local.username}:${data.coder_external_auth.jfrog.access_token}@${local.jfrog_host}/artifactory/api/go/${repo}"
|
|
])
|
|
}
|
|
|
|
output "access_token" {
|
|
description = "value of the JFrog access token"
|
|
value = data.coder_external_auth.jfrog.access_token
|
|
sensitive = true
|
|
}
|
|
|
|
output "username" {
|
|
description = "value of the JFrog username"
|
|
value = local.username
|
|
}
|