## Description
Adds post_clone_script variable to the dotfiles module, enabling startup
coordination with other scripts that depend on dotfiles.
An example of how to use this, which assumes the PR has been merged:
```
module "dotfiles" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/coder/dotfiles/coder"
version = "1.3.0"
agent_id = coder_agent.main.id
default_dotfiles_uri = "https://github.com/someuser/somedotfiles"
post_clone_script = <<-EOF
coder exp sync start dotfiles && coder exp sync complete dotfiles
EOF
}
resource "coder_script" "personalize" {
count = data.coder_workspace.me.start_count
agent_id = coder_agent.main.id
display_name = "Personalize"
icon = "/icon/personalize.svg"
run_on_start = true
script = <<-EOF
trap 'coder exp sync complete personalize' EXIT
coder exp sync want personalize dotfiles
coder exp sync start personalize
SCRIPT="$HOME/.config/coderv2/dotfiles/personalize"
if [ -f "$SCRIPT" ] && [ -x "$SCRIPT" ]; then
$SCRIPT
fi
EOF
}
```
## Type of Change
- [ ] New module
- [ ] New template
- [ ] Bug fix
- [x] Feature/enhancement
- [ ] Documentation
- [ ] Other
## Module Information
**Path:** `registry/coder/modules/dotfiles`
**New version:** `v1.3.0`
**Breaking change:** [ ] Yes [x] No
## Testing & Validation
- [ ] Tests pass (`bun test`)
- [ ] Code formatted (`bun fmt`)
- [x] Changes tested locally
## Related Issues
#678
147 lines
4.6 KiB
HCL
147 lines
4.6 KiB
HCL
terraform {
|
|
required_version = ">= 1.0"
|
|
|
|
required_providers {
|
|
coder = {
|
|
source = "coder/coder"
|
|
version = ">= 2.5"
|
|
}
|
|
}
|
|
}
|
|
|
|
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 "group" {
|
|
type = string
|
|
description = "The name of a group that this app belongs to."
|
|
default = null
|
|
}
|
|
|
|
variable "agent_id" {
|
|
type = string
|
|
description = "The ID of a Coder agent."
|
|
}
|
|
|
|
variable "description" {
|
|
type = string
|
|
description = "A custom description for the dotfiles parameter. This is shown in the UI - and allows you to customize the instructions you give to your users."
|
|
default = "Enter a URL for a [dotfiles repository](https://dotfiles.github.io) to personalize your workspace"
|
|
}
|
|
|
|
variable "default_dotfiles_uri" {
|
|
type = string
|
|
description = "The default dotfiles URI if the workspace user does not provide one"
|
|
default = ""
|
|
|
|
validation {
|
|
condition = (
|
|
var.default_dotfiles_uri == "" ||
|
|
can(regex("^(https?://|ssh://|git@|git://)[a-zA-Z0-9._/:@-]+$", var.default_dotfiles_uri))
|
|
)
|
|
error_message = "Must be a valid dotfiles repository URL (https, git@, or git://) without special characters."
|
|
}
|
|
}
|
|
|
|
variable "dotfiles_uri" {
|
|
type = string
|
|
description = "The URL to a dotfiles repository. (optional, when set, the user isn't prompted for their dotfiles)"
|
|
default = null
|
|
|
|
validation {
|
|
condition = (
|
|
var.dotfiles_uri == null ||
|
|
var.dotfiles_uri == "" ||
|
|
can(regex("^(https?://|ssh://|git@|git://)[a-zA-Z0-9._/:@-]+$", var.dotfiles_uri))
|
|
)
|
|
error_message = "Must be a valid dotfiles repository URL (https, git@, or git://) without special characters."
|
|
}
|
|
}
|
|
|
|
variable "user" {
|
|
type = string
|
|
description = "The name of the user to apply the dotfiles to. (optional, applies to the current user by default)"
|
|
default = null
|
|
|
|
validation {
|
|
condition = var.user == null || can(regex("^[a-zA-Z_][a-zA-Z0-9_-]*$", var.user))
|
|
error_message = "Must be a valid username without special characters."
|
|
}
|
|
}
|
|
|
|
variable "coder_parameter_order" {
|
|
type = number
|
|
description = "The order determines the position of a template parameter in the UI/CLI presentation. The lowest order is shown first and parameters with equal order are sorted by name (ascending order)."
|
|
default = null
|
|
}
|
|
|
|
variable "manual_update" {
|
|
type = bool
|
|
description = "If true, this adds a button to workspace page to refresh dotfiles on demand."
|
|
default = false
|
|
}
|
|
|
|
variable "post_clone_script" {
|
|
description = "Custom script to run after applying dotfiles. Runs every time, even if dotfiles were already applied."
|
|
type = string
|
|
default = null
|
|
}
|
|
|
|
data "coder_parameter" "dotfiles_uri" {
|
|
count = var.dotfiles_uri == null ? 1 : 0
|
|
type = "string"
|
|
name = "dotfiles_uri"
|
|
display_name = "Dotfiles URL"
|
|
order = var.coder_parameter_order
|
|
default = var.default_dotfiles_uri
|
|
description = var.description
|
|
mutable = true
|
|
icon = "/icon/dotfiles.svg"
|
|
|
|
validation {
|
|
regex = "^$|^(https?://|ssh://|git@|git://)[a-zA-Z0-9._/:@-]+$"
|
|
error = "Must be a valid dotfiles repository URL (https, git@, or git://) without special characters."
|
|
}
|
|
}
|
|
|
|
locals {
|
|
dotfiles_uri = var.dotfiles_uri != null ? var.dotfiles_uri : data.coder_parameter.dotfiles_uri[0].value
|
|
user = var.user != null ? var.user : ""
|
|
encoded_post_clone_script = var.post_clone_script != null ? base64encode(var.post_clone_script) : ""
|
|
}
|
|
|
|
resource "coder_script" "dotfiles" {
|
|
agent_id = var.agent_id
|
|
script = templatefile("${path.module}/run.sh", {
|
|
DOTFILES_URI : local.dotfiles_uri,
|
|
DOTFILES_USER : local.user,
|
|
POST_CLONE_SCRIPT : local.encoded_post_clone_script
|
|
})
|
|
display_name = "Dotfiles"
|
|
icon = "/icon/dotfiles.svg"
|
|
run_on_start = true
|
|
}
|
|
|
|
resource "coder_app" "dotfiles" {
|
|
count = var.manual_update ? 1 : 0
|
|
agent_id = var.agent_id
|
|
display_name = "Refresh Dotfiles"
|
|
slug = "dotfiles"
|
|
icon = "/icon/dotfiles.svg"
|
|
order = var.order
|
|
group = var.group
|
|
command = templatefile("${path.module}/run.sh", {
|
|
DOTFILES_URI : local.dotfiles_uri,
|
|
DOTFILES_USER : local.user,
|
|
POST_CLONE_SCRIPT : local.encoded_post_clone_script
|
|
})
|
|
}
|
|
|
|
output "dotfiles_uri" {
|
|
description = "Dotfiles URI"
|
|
value = local.dotfiles_uri
|
|
}
|