Add template scaffolding script and enhance module script (#395)
Co-authored-by: blink-so[bot] <211532188+blink-so[bot]@users.noreply.github.com> Co-authored-by: matifali <104543375+matifali@users.noreply.github.com> Co-authored-by: DevCats <christofer@coder.com> Co-authored-by: Atif Ali <atif@coder.com>
This commit is contained in:
parent
c270edfdab
commit
65edb54e88
33
examples/namespace/README.md
Normal file
33
examples/namespace/README.md
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
---
|
||||||
|
display_name: NAMESPACE_NAME
|
||||||
|
bio: Brief description of what this namespace provides
|
||||||
|
github: your-github-username
|
||||||
|
avatar: ./.images/avatar.svg
|
||||||
|
linkedin: https://www.linkedin.com/in/your-profile
|
||||||
|
website: https://your-website.com
|
||||||
|
status: community
|
||||||
|
---
|
||||||
|
|
||||||
|
# NAMESPACE_NAME
|
||||||
|
|
||||||
|
Brief description of what this namespace provides. Include information about:
|
||||||
|
|
||||||
|
- What types of templates/modules you offer
|
||||||
|
- Your focus areas (e.g., specific cloud providers, technologies)
|
||||||
|
- Any special features or configurations
|
||||||
|
|
||||||
|
## Templates
|
||||||
|
|
||||||
|
List your available templates here:
|
||||||
|
|
||||||
|
- **template-name**: Brief description
|
||||||
|
|
||||||
|
## Modules
|
||||||
|
|
||||||
|
List your available modules here:
|
||||||
|
|
||||||
|
- **module-name**: Brief description
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
If you'd like to contribute to this namespace, please [open an issue](https://github.com/coder/registry/issues) or submit a pull request.
|
||||||
58
examples/templates/README.md
Normal file
58
examples/templates/README.md
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
---
|
||||||
|
name: TEMPLATE_NAME
|
||||||
|
description: A brief description of what this template does
|
||||||
|
tags: [tag1, tag2, tag3]
|
||||||
|
icon: /icon/TEMPLATE_NAME.svg
|
||||||
|
---
|
||||||
|
|
||||||
|
# TEMPLATE_NAME
|
||||||
|
|
||||||
|
A brief description of what this template provides and its use case.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Feature 1
|
||||||
|
- Feature 2
|
||||||
|
- Feature 3
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- List any prerequisites or requirements
|
||||||
|
- Provider-specific requirements (e.g., Docker, AWS credentials)
|
||||||
|
- Minimum Coder version if applicable
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
1. Step-by-step instructions on how to use this template
|
||||||
|
2. Any configuration that needs to be done
|
||||||
|
3. How to customize the template
|
||||||
|
|
||||||
|
## Variables
|
||||||
|
|
||||||
|
| Name | Description | Type | Default | Required |
|
||||||
|
| ----------- | --------------------------- | -------- | ----------------- | -------- |
|
||||||
|
| example_var | Description of the variable | `string` | `"default_value"` | no |
|
||||||
|
|
||||||
|
## Resources Created
|
||||||
|
|
||||||
|
- List of resources that will be created
|
||||||
|
- Brief description of each resource
|
||||||
|
|
||||||
|
## Customization
|
||||||
|
|
||||||
|
Explain how users can customize this template for their needs:
|
||||||
|
|
||||||
|
- How to modify the startup script
|
||||||
|
- How to add additional software
|
||||||
|
- How to configure different providers
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Common Issues
|
||||||
|
|
||||||
|
- Issue 1 and its solution
|
||||||
|
- Issue 2 and its solution
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Contributions are welcome! Please see the [contributing guidelines](../../CONTRIBUTING.md) for more information.
|
||||||
172
examples/templates/main.tf
Normal file
172
examples/templates/main.tf
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
coder = {
|
||||||
|
source = "coder/coder"
|
||||||
|
}
|
||||||
|
# Add your provider here (e.g., docker, aws, gcp, azure)
|
||||||
|
# docker = {
|
||||||
|
# source = "kreuzwerker/docker"
|
||||||
|
# }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
locals {
|
||||||
|
username = data.coder_workspace_owner.me.name
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add your variables here
|
||||||
|
# variable "example_var" {
|
||||||
|
# default = "default_value"
|
||||||
|
# description = "Description of the variable"
|
||||||
|
# type = string
|
||||||
|
# }
|
||||||
|
|
||||||
|
# Configure your provider here
|
||||||
|
# provider "docker" {
|
||||||
|
# host = var.docker_socket != "" ? var.docker_socket : null
|
||||||
|
# }
|
||||||
|
|
||||||
|
data "coder_provisioner" "me" {}
|
||||||
|
data "coder_workspace" "me" {}
|
||||||
|
data "coder_workspace_owner" "me" {}
|
||||||
|
|
||||||
|
resource "coder_agent" "main" {
|
||||||
|
arch = data.coder_provisioner.me.arch
|
||||||
|
os = "linux"
|
||||||
|
startup_script = <<-EOT
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Prepare user home with default files on first start.
|
||||||
|
if [ ! -f ~/.init_done ]; then
|
||||||
|
cp -rT /etc/skel ~
|
||||||
|
touch ~/.init_done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Add any commands that should be executed at workspace startup here
|
||||||
|
EOT
|
||||||
|
|
||||||
|
# These environment variables allow you to make Git commits right away after creating a
|
||||||
|
# workspace. Note that they take precedence over configuration defined in ~/.gitconfig!
|
||||||
|
# You can remove this block if you'd prefer to configure Git manually or using
|
||||||
|
# dotfiles. (see docs/dotfiles.md)
|
||||||
|
env = {
|
||||||
|
GIT_AUTHOR_NAME = coalesce(data.coder_workspace_owner.me.full_name, data.coder_workspace_owner.me.name)
|
||||||
|
GIT_AUTHOR_EMAIL = "${data.coder_workspace_owner.me.email}"
|
||||||
|
GIT_COMMITTER_NAME = coalesce(data.coder_workspace_owner.me.full_name, data.coder_workspace_owner.me.name)
|
||||||
|
GIT_COMMITTER_EMAIL = "${data.coder_workspace_owner.me.email}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# The following metadata blocks are optional. They are used to display
|
||||||
|
# information about your workspace in the dashboard. You can remove them
|
||||||
|
# if you don't want to display any information.
|
||||||
|
# For basic templates, you can remove the "display_apps" block.
|
||||||
|
metadata {
|
||||||
|
display_name = "CPU Usage"
|
||||||
|
key = "0_cpu_usage"
|
||||||
|
script = "coder stat cpu"
|
||||||
|
interval = 10
|
||||||
|
timeout = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
metadata {
|
||||||
|
display_name = "RAM Usage"
|
||||||
|
key = "1_ram_usage"
|
||||||
|
script = "coder stat mem"
|
||||||
|
interval = 10
|
||||||
|
timeout = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
metadata {
|
||||||
|
display_name = "Home Disk"
|
||||||
|
key = "3_home_disk"
|
||||||
|
script = "coder stat disk --path $${HOME}"
|
||||||
|
interval = 60
|
||||||
|
timeout = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
display_apps {
|
||||||
|
vscode = true
|
||||||
|
vscode_insiders = false
|
||||||
|
ssh_helper = false
|
||||||
|
port_forwarding_helper = true
|
||||||
|
web_terminal = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add your resources here (e.g., docker container, VM, etc.)
|
||||||
|
# resource "docker_image" "main" {
|
||||||
|
# name = "codercom/enterprise-base:ubuntu"
|
||||||
|
# }
|
||||||
|
|
||||||
|
# resource "docker_container" "workspace" {
|
||||||
|
# count = data.coder_workspace.me.start_count
|
||||||
|
# image = docker_image.main.image_id
|
||||||
|
# # Uses lower() to avoid Docker restriction on container names.
|
||||||
|
# name = "coder-${data.coder_workspace_owner.me.name}-${lower(data.coder_workspace.me.name)}"
|
||||||
|
# # Hostname makes the shell more user friendly: coder@my-workspace:~$
|
||||||
|
# hostname = data.coder_workspace.me.name
|
||||||
|
# # Use the docker gateway if the access URL is 127.0.0.1
|
||||||
|
# entrypoint = ["sh", "-c", replace(coder_agent.main.init_script, "/localhost|127\.0\.0\.1/", "host.docker.internal")]
|
||||||
|
# env = ["CODER_AGENT_TOKEN=${coder_agent.main.token}"]
|
||||||
|
# host {
|
||||||
|
# host = "host.docker.internal"
|
||||||
|
# ip = "host-gateway"
|
||||||
|
# }
|
||||||
|
# volumes {
|
||||||
|
# container_path = "/home/${local.username}"
|
||||||
|
# volume_name = docker_volume.home_volume[0].name
|
||||||
|
# read_only = false
|
||||||
|
# }
|
||||||
|
# # Add labels in Docker to keep track of orphan resources.
|
||||||
|
# labels {
|
||||||
|
# label = "coder.owner"
|
||||||
|
# value = data.coder_workspace_owner.me.name
|
||||||
|
# }
|
||||||
|
# labels {
|
||||||
|
# label = "coder.owner_id"
|
||||||
|
# value = data.coder_workspace_owner.me.id
|
||||||
|
# }
|
||||||
|
# labels {
|
||||||
|
# label = "coder.workspace_id"
|
||||||
|
# value = data.coder_workspace.me.id
|
||||||
|
# }
|
||||||
|
# labels {
|
||||||
|
# label = "coder.workspace_name"
|
||||||
|
# value = data.coder_workspace.me.name
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
|
||||||
|
# resource "docker_volume" "home_volume" {
|
||||||
|
# count = data.coder_workspace.me.start_count
|
||||||
|
# name = "coder-${data.coder_workspace_owner.me.name}-${data.coder_workspace.me.name}-home"
|
||||||
|
# # Protect the volume from being deleted due to changes in attributes.
|
||||||
|
# lifecycle {
|
||||||
|
# ignore_changes = all
|
||||||
|
# }
|
||||||
|
# # Add labels in Docker to keep track of orphan resources.
|
||||||
|
# labels {
|
||||||
|
# label = "coder.owner"
|
||||||
|
# value = data.coder_workspace_owner.me.name
|
||||||
|
# }
|
||||||
|
# labels {
|
||||||
|
# label = "coder.owner_id"
|
||||||
|
# value = data.coder_workspace_owner.me.id
|
||||||
|
# }
|
||||||
|
# labels {
|
||||||
|
# label = "coder.workspace_id"
|
||||||
|
# value = data.coder_workspace.me.id
|
||||||
|
# }
|
||||||
|
# labels {
|
||||||
|
# label = "coder.workspace_name"
|
||||||
|
# value = data.coder_workspace.me.name
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
|
||||||
|
resource "coder_metadata" "workspace_info" {
|
||||||
|
resource_id = coder_agent.main.id
|
||||||
|
|
||||||
|
item {
|
||||||
|
key = "TEMPLATE_NAME"
|
||||||
|
value = "TEMPLATE_NAME"
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -29,6 +29,28 @@ if [ -d "registry/$NAMESPACE/modules/$MODULE_NAME" ]; then
|
|||||||
echo "Please choose a different name"
|
echo "Please choose a different name"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Create namespace directory if it doesn't exist
|
||||||
|
if [ ! -d "registry/$NAMESPACE" ]; then
|
||||||
|
echo "Creating namespace directory: registry/$NAMESPACE"
|
||||||
|
mkdir -p "registry/$NAMESPACE"
|
||||||
|
|
||||||
|
# Create namespace README if it doesn't exist
|
||||||
|
if [ ! -f "registry/$NAMESPACE/README.md" ]; then
|
||||||
|
echo "Creating namespace README: registry/$NAMESPACE/README.md"
|
||||||
|
cp "examples/namespace/README.md" "registry/$NAMESPACE/README.md"
|
||||||
|
|
||||||
|
# Replace NAMESPACE_NAME placeholder in the README
|
||||||
|
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||||
|
# macOS
|
||||||
|
sed -i '' "s/NAMESPACE_NAME/${NAMESPACE}/g" "registry/$NAMESPACE/README.md"
|
||||||
|
else
|
||||||
|
# Linux
|
||||||
|
sed -i "s/NAMESPACE_NAME/${NAMESPACE}/g" "registry/$NAMESPACE/README.md"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
mkdir -p "registry/${NAMESPACE}/modules/${MODULE_NAME}"
|
mkdir -p "registry/${NAMESPACE}/modules/${MODULE_NAME}"
|
||||||
|
|
||||||
# Copy required files from the example module
|
# Copy required files from the example module
|
||||||
|
|||||||
79
scripts/new_template.sh
Executable file
79
scripts/new_template.sh
Executable file
@ -0,0 +1,79 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# This script creates a new sample template directory with required files
|
||||||
|
# Run it like: ./scripts/new_template.sh my-namespace/my-template
|
||||||
|
|
||||||
|
TEMPLATE_ARG=$1
|
||||||
|
|
||||||
|
# Check if they are in the root directory
|
||||||
|
if [ ! -d "registry" ]; then
|
||||||
|
echo "Please run this script from the root directory of the repository"
|
||||||
|
echo "Usage: ./scripts/new_template.sh <namespace>/<template_name>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# check if template name is in the format <namespace>/<template_name>
|
||||||
|
if ! [[ "$TEMPLATE_ARG" =~ ^[a-z0-9_-]+/[a-z0-9_-]+$ ]]; then
|
||||||
|
echo "Template name must be in the format <namespace>/<template_name>"
|
||||||
|
echo "Usage: ./scripts/new_template.sh <namespace>/<template_name>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Extract the namespace and template name
|
||||||
|
NAMESPACE=$(echo "$TEMPLATE_ARG" | cut -d'/' -f1)
|
||||||
|
TEMPLATE_NAME=$(echo "$TEMPLATE_ARG" | cut -d'/' -f2)
|
||||||
|
|
||||||
|
# Check if the template already exists
|
||||||
|
if [ -d "registry/$NAMESPACE/templates/$TEMPLATE_NAME" ]; then
|
||||||
|
echo "Template at registry/$NAMESPACE/templates/$TEMPLATE_NAME already exists"
|
||||||
|
echo "Please choose a different name"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create namespace directory if it doesn't exist
|
||||||
|
if [ ! -d "registry/$NAMESPACE" ]; then
|
||||||
|
echo "Creating namespace directory: registry/$NAMESPACE"
|
||||||
|
mkdir -p "registry/$NAMESPACE"
|
||||||
|
|
||||||
|
# Create namespace README if it doesn't exist
|
||||||
|
if [ ! -f "registry/$NAMESPACE/README.md" ]; then
|
||||||
|
echo "Creating namespace README: registry/$NAMESPACE/README.md"
|
||||||
|
cp "examples/namespace/README.md" "registry/$NAMESPACE/README.md"
|
||||||
|
|
||||||
|
# Replace NAMESPACE_NAME placeholder in the README
|
||||||
|
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||||
|
# macOS
|
||||||
|
sed -i '' "s/NAMESPACE_NAME/${NAMESPACE}/g" "registry/$NAMESPACE/README.md"
|
||||||
|
else
|
||||||
|
# Linux
|
||||||
|
sed -i "s/NAMESPACE_NAME/${NAMESPACE}/g" "registry/$NAMESPACE/README.md"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create the template directory structure
|
||||||
|
mkdir -p "registry/${NAMESPACE}/templates/${TEMPLATE_NAME}"
|
||||||
|
|
||||||
|
# Copy required files from the example template
|
||||||
|
cp -r examples/templates/* "registry/${NAMESPACE}/templates/${TEMPLATE_NAME}/"
|
||||||
|
|
||||||
|
# Change to template directory
|
||||||
|
cd "registry/${NAMESPACE}/templates/${TEMPLATE_NAME}"
|
||||||
|
|
||||||
|
# Detect OS and replace placeholders
|
||||||
|
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||||
|
# macOS
|
||||||
|
sed -i '' "s/TEMPLATE_NAME/${TEMPLATE_NAME}/g" main.tf
|
||||||
|
sed -i '' "s/TEMPLATE_NAME/${TEMPLATE_NAME}/g" README.md
|
||||||
|
else
|
||||||
|
# Linux
|
||||||
|
sed -i "s/TEMPLATE_NAME/${TEMPLATE_NAME}/g" main.tf
|
||||||
|
sed -i "s/TEMPLATE_NAME/${TEMPLATE_NAME}/g" README.md
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Template scaffolded successfully at registry/${NAMESPACE}/templates/${TEMPLATE_NAME}"
|
||||||
|
echo "Next steps:"
|
||||||
|
echo "1. Edit main.tf to add your infrastructure resources"
|
||||||
|
echo "2. Update README.md with template-specific information"
|
||||||
|
echo "3. Test your template with 'coder templates push'"
|
||||||
|
echo "4. Consider adding an icon at .icons/${TEMPLATE_NAME}.svg"
|
||||||
Loading…
x
Reference in New Issue
Block a user