This commit is contained in:
technofab 2024-04-24 16:45:10 +02:00
commit 249d048d34
11 changed files with 744 additions and 0 deletions

8
.envrc Normal file
View file

@ -0,0 +1,8 @@
if ! has nix_direnv_version || ! nix_direnv_version 2.2.1; then
source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/2.2.1/direnvrc" "sha256-zelF0vLbEl5uaqrfIzbgNzJWGmLzCmYAkInj/LNxvKs="
fi
if ! use flake . --impure
then
echo "devenv could not be build. The devenv environment was not loaded. Make the necessary changes to devenv.nix and hit enter to try again." >&2
fi

7
.gitignore vendored Normal file
View file

@ -0,0 +1,7 @@
.idea/
.devenv/
.direnv/
.task/
vendor/
*.tf*
result

2
README.md Normal file
View file

@ -0,0 +1,2 @@
# Coder Templates

28
Taskfile.yaml Normal file
View file

@ -0,0 +1,28 @@
version: 3
output: prefixed
tasks:
deps:
sources:
- jsonnetfile*.json
generates:
- vendor/**/*
cmds:
- jb install
build:
desc: "Builds the specified template"
summary: |
Example: task build TEMPLATE=nix-docker
deps: [ deps ]
sources:
- "{{ .TEMPLATE }}/*"
generates:
- "{{ .TEMPLATE }}/out.tf.json"
cmds:
- inka export ./{{ .TEMPLATE }} --out ./{{ .TEMPLATE }}/out.tf.json
upload-to-coder:
desc: "Uploads the specified template to coder"
deps: [ build ]
dir: "{{ .TEMPLATE }}"
interactive: true
cmds:
- coder templates push "{{ .TEMPLATE }}"

369
flake.lock generated Normal file
View file

@ -0,0 +1,369 @@
{
"nodes": {
"devenv": {
"inputs": {
"flake-compat": "flake-compat",
"nix": "nix",
"nixpkgs": "nixpkgs",
"pre-commit-hooks": "pre-commit-hooks"
},
"locked": {
"lastModified": 1685013540,
"narHash": "sha256-UM9tPy9fyfXs+knxwk/rCIaNfVC7ggwzbLcY8lkOr+E=",
"owner": "cachix",
"repo": "devenv",
"rev": "5ff14a8f2828a2e607a65e2b16650a8cf950515b",
"type": "github"
},
"original": {
"owner": "cachix",
"repo": "devenv",
"type": "github"
}
},
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1673956053,
"narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"flake-parts": {
"inputs": {
"nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
"lastModified": 1685662779,
"narHash": "sha256-cKDDciXGpMEjP1n6HlzKinN0H+oLmNpgeCTzYnsA2po=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "71fb97f0d875fd4de4994dfb849f2c75e17eb6c3",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"flake-utils": {
"locked": {
"lastModified": 1667395993,
"narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"gitignore": {
"inputs": {
"nixpkgs": [
"devenv",
"pre-commit-hooks",
"nixpkgs"
]
},
"locked": {
"lastModified": 1660459072,
"narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=",
"owner": "hercules-ci",
"repo": "gitignore.nix",
"rev": "a20de23b925fd8264fd7fad6454652e142fd7f73",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "gitignore.nix",
"type": "github"
}
},
"inka": {
"inputs": {
"nixpkgs": "nixpkgs_2",
"systems": "systems"
},
"locked": {
"lastModified": 1684511970,
"narHash": "sha256-GXE0NrL450vim5nUBlDMbLtEgn4BIo0qGKp9ubB7Lfc=",
"owner": "TECHNOFAB",
"repo": "inka",
"rev": "0af6d3c3e6272d25eec6dad259093a08521f624e",
"type": "gitlab"
},
"original": {
"owner": "TECHNOFAB",
"repo": "inka",
"type": "gitlab"
}
},
"jb": {
"inputs": {
"nixpkgs": "nixpkgs_3",
"systems": "systems_2"
},
"locked": {
"lastModified": 1684946375,
"narHash": "sha256-25U32EUrtHrllbANw2pisrvOd53ZSIXkp1eZAoPI0+M=",
"owner": "TECHNOFAB11",
"repo": "jsonnet-bundler",
"rev": "8ffad5a3ea322f4bb4c95c51b3cd99051a0f802e",
"type": "github"
},
"original": {
"owner": "TECHNOFAB11",
"repo": "jsonnet-bundler",
"type": "github"
}
},
"lowdown-src": {
"flake": false,
"locked": {
"lastModified": 1633514407,
"narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=",
"owner": "kristapsdz",
"repo": "lowdown",
"rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8",
"type": "github"
},
"original": {
"owner": "kristapsdz",
"repo": "lowdown",
"type": "github"
}
},
"nix": {
"inputs": {
"lowdown-src": "lowdown-src",
"nixpkgs": [
"devenv",
"nixpkgs"
],
"nixpkgs-regression": "nixpkgs-regression"
},
"locked": {
"lastModified": 1676545802,
"narHash": "sha256-EK4rZ+Hd5hsvXnzSzk2ikhStJnD63odF7SzsQ8CuSPU=",
"owner": "domenkozar",
"repo": "nix",
"rev": "7c91803598ffbcfe4a55c44ac6d49b2cf07a527f",
"type": "github"
},
"original": {
"owner": "domenkozar",
"ref": "relaxed-flakes",
"repo": "nix",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1678875422,
"narHash": "sha256-T3o6NcQPwXjxJMn2shz86Chch4ljXgZn746c2caGxd8=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "126f49a01de5b7e35a43fd43f891ecf6d3a51459",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-lib": {
"locked": {
"dir": "lib",
"lastModified": 1685564631,
"narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
"type": "github"
},
"original": {
"dir": "lib",
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-regression": {
"locked": {
"lastModified": 1643052045,
"narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2",
"type": "github"
},
"original": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2",
"type": "github"
}
},
"nixpkgs-stable": {
"locked": {
"lastModified": 1678872516,
"narHash": "sha256-/E1YwtMtFAu2KUQKV/1+KFuReYPANM2Rzehk84VxVoc=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "9b8e5abb18324c7fe9f07cb100c3cd4a29cda8b8",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-22.11",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1684398685,
"narHash": "sha256-TRE62m91iZ5ArVMgA+uj22Yda8JoQuuhc9uwZ+NoX+0=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "628d4bb6e9f4f0c30cfd9b23d3c1cdcec9d3cb5c",
"type": "github"
},
"original": {
"id": "nixpkgs",
"ref": "nixos-22.11",
"type": "indirect"
}
},
"nixpkgs_3": {
"locked": {
"lastModified": 1684661732,
"narHash": "sha256-2/Xo/UmUUoMXc0T5tzoUsYjMLLMjEfzRWDAQB0WwtW0=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b0671cbf1e5c443f7fbfd4941ee0f8a151435114",
"type": "github"
},
"original": {
"id": "nixpkgs",
"ref": "nixos-22.11",
"type": "indirect"
}
},
"nixpkgs_4": {
"locked": {
"lastModified": 1688392541,
"narHash": "sha256-lHrKvEkCPTUO+7tPfjIcb7Trk6k31rz18vkyqmkeJfY=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "ea4c80b39be4c09702b0cb3b42eab59e2ba4f24b",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-22.11",
"repo": "nixpkgs",
"type": "github"
}
},
"pre-commit-hooks": {
"inputs": {
"flake-compat": [
"devenv",
"flake-compat"
],
"flake-utils": "flake-utils",
"gitignore": "gitignore",
"nixpkgs": [
"devenv",
"nixpkgs"
],
"nixpkgs-stable": "nixpkgs-stable"
},
"locked": {
"lastModified": 1682596858,
"narHash": "sha256-Hf9XVpqaGqe/4oDGr30W8HlsWvJXtMsEPHDqHZA6dDg=",
"owner": "cachix",
"repo": "pre-commit-hooks.nix",
"rev": "fb58866e20af98779017134319b5663b8215d912",
"type": "github"
},
"original": {
"owner": "cachix",
"repo": "pre-commit-hooks.nix",
"type": "github"
}
},
"root": {
"inputs": {
"devenv": "devenv",
"flake-parts": "flake-parts",
"inka": "inka",
"jb": "jb",
"nixpkgs": "nixpkgs_4",
"systems": "systems_3"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"id": "systems",
"type": "indirect"
}
},
"systems_2": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"id": "systems",
"type": "indirect"
}
},
"systems_3": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

74
flake.nix Normal file
View file

@ -0,0 +1,74 @@
{
description = "Coder Templates";
outputs = {
self,
flake-parts,
systems,
jb,
inka,
...
} @ inputs:
flake-parts.lib.mkFlake {inherit inputs;} {
imports = [
inputs.devenv.flakeModule
];
systems = import systems;
flake = {
};
perSystem = {
config,
self',
inputs',
pkgs,
system,
...
}: {
formatter = pkgs.alejandra;
devenv.shells.default = {
packages = [
pkgs.go-jsonnet
pkgs.go-task
#(pkgs.coder.override rec {
# buildGoModule = args: pkgs.buildGoModule ( args // rec {
# version = "2.8.2";
# src = pkgs.fetchFromGitHub {
# owner = "coder";
# repo = "coder";
# rev = "v${version}";
# hash = "sha256-H90pwemW1yMcY65RvERtqJplBPyOSzkD3ip/DGoZ5eQ=";
# };
# vendorHash = "sha256-oLhQsdIitePPYAuO4m+RKA/zNcFoMZnzsFBTKlt69pk=";
# });
#})
inka.defaultPackage.${system}
# use my fork of jb to support fetching packages via http
jb.defaultPackage.${system}
];
};
packages = {
nix-coder-image = pkgs.callPackage ./image.nix {
processes = {
test = ''
${pkgs.hello}/bin/hello
'';
};
};
};
};
};
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-22.11";
flake-parts.url = "github:hercules-ci/flake-parts";
systems.url = "github:nix-systems/default";
devenv.url = "github:cachix/devenv";
inka.url = "gitlab:TECHNOFAB/inka";
jb.url = "github:TECHNOFAB11/jsonnet-bundler";
};
}

27
image.nix Normal file
View file

@ -0,0 +1,27 @@
{
lib,
pkgs,
processes ? {},
...
}: let
# https://github.com/cachix/devenv/blob/5a30b9e5ac7c6167e61b1f4193d5130bb9f8defa/src/modules/processes.nix#L121
procfile = pkgs.writeText "procfile" (lib.concatStringsSep "\n" (lib.mapAttrsToList (name: process: "${name}: exec ${pkgs.writeShellScript name process}") processes));
overmind-sys = pkgs.writeShellScriptBin "overmind-sys" ''
OVERMIND_SOCKET=/run/overmind-sys.sock \
OVERMIND_ANY_CAN_DIE=1 \
OVERMIND_PROCFILE=${procfile} \
${pkgs.overmind}/bin/overmind "$@"
'';
in
pkgs.dockerTools.buildImage {
name = "nix-coder";
tag = "latest";
copyToRoot = pkgs.buildEnv {
name = "image-root";
paths = [pkgs.bashInteractive overmind-sys];
pathsToLink = ["/bin"];
};
config.Cmd = ["/bin/bash"];
}

33
jsonnetfile.json Normal file
View file

@ -0,0 +1,33 @@
{
"version": 1,
"dependencies": [
{
"source": {
"git": {
"remote": "ssh://git@gitlab.com/technofab/inka.git",
"subdir": ""
}
},
"version": "main"
},
{
"source": {
"http": {
"url": "https://gitlab.com/api/v4/projects/44043879/packages/generic/coder-coder/${VERSION}/package.tar.gz",
"target": "coder"
}
},
"version": "0.17.0"
},
{
"source": {
"http": {
"url": "https://gitlab.com/api/v4/projects/44043879/packages/generic/kreuzwerker-docker/${VERSION}/package.tar.gz",
"target": "docker"
}
},
"version": "3.0.2"
}
],
"legacyImports": true
}

46
jsonnetfile.lock.json Normal file
View file

@ -0,0 +1,46 @@
{
"version": 1,
"dependencies": [
{
"source": {
"http": {
"url": "https://gitlab.com/api/v4/projects/44043879/packages/generic/coder-coder/${VERSION}/package.tar.gz",
"target": "coder"
}
},
"version": "0.17.0",
"sum": "Nd1oWkTfpjSaIUOAw5cuOUpxNCt90/TJfzE6RzQGK+0="
},
{
"source": {
"http": {
"url": "https://gitlab.com/api/v4/projects/44043879/packages/generic/kreuzwerker-docker/${VERSION}/package.tar.gz",
"target": "docker"
}
},
"version": "3.0.2",
"sum": "WKmK7j5cCM2DPNjeRR8bGaF94J5PXst43BTD2Avc0Jw="
},
{
"source": {
"git": {
"remote": "https://github.com/jsonnet-libs/docsonnet.git",
"subdir": ""
}
},
"version": "6ac6c69685b8c29c54515448eaca583da2d88150",
"sum": "/6J/FSZMka3pQ5hyibN40602ofJbdZiwG+CfQ9tJEK4="
},
{
"source": {
"git": {
"remote": "ssh://git@gitlab.com/technofab/inka.git",
"subdir": ""
}
},
"version": "0af6d3c3e6272d25eec6dad259093a08521f624e",
"sum": "oKeBMjfOqWhSqT7XXBZvVDOEavThjG/P5UY7pVnZkEo="
}
],
"legacyImports": false
}

111
nix-docker/main.jsonnet Normal file
View file

@ -0,0 +1,111 @@
local inka = import 'inka/main.libsonnet';
local docker = import 'docker/main.libsonnet';
local coder = import 'coder/main.libsonnet';
{
requirements: {
docker: docker.provider.require(),
coder: coder.provider.require(),
},
providers: {
docker: docker.provider.new(),
coder: coder.provider.new(),
},
parameters: {
cpu: coder.data.parameter.new(
'cpu', name='CPU [cores]', default=2048, mutable=true, icon='/icon/memory.svg',
option=[
coder.data.parameter.option.new('1 Core', value=1024),
coder.data.parameter.option.new('2 Cores', value=2048),
coder.data.parameter.option.new('4 Cores', value=4096),
],
),
memory: coder.data.parameter.new(
'memory', name='Memory [GB]', default=1024, mutable=true, icon='/icon/memory.svg',
option=[
coder.data.parameter.option.new('1GB', value=1024),
coder.data.parameter.option.new('2GB', value=2048),
coder.data.parameter.option.new('4GB', value=4096),
],
),
git_repo: coder.data.parameter.new(
'git_repo', name='Git Repository', default='', type='string', mutable=true,
),
#home_disk_size: coder.data.parameter.new(
# 'home_disk_size', name='Home disk size [GB]', default=10, type='number',
# mutable=false, icon='/emojis/1f4be.png',
# validation=[
# coder.data.parameter.validation.new(min=1, max=100),
# ],
#),
},
coder: {
auth: coder.data.git_auth.new('git_auth', { id: 'primary-gitlab', }),
provisioner: coder.data.provisioner.new('me'),
workspace: coder.data.workspace.new('me'),
agent: coder.agent.new(
'main', arch=self.provisioner.arch, os='linux', login_before_ready=false,
startup_script_timeout=180,
startup_script=|||
# install direnv & code-server
nix-env -iA nixpkgs.direnv nixpkgs.code-server
code-server --auth none --port 13337 >/tmp/code-server.log 2>&1 &
|||,
),
code_server: coder.app.new(
'code-server', agent_id=self.agent.id, slug='code-server',
display_name='Code Server', icon='/icon/code.svg', share='owner',
url='http://localhost:13337/?folder=/home/%s' % self.workspace.owner,
subdomain=false, healthcheck=[
coder.app.healthcheck.new(url='http://localhost:13337/healthz', interval=5, threshold=6),
],
),
},
docker: {
volume: docker.volume.new(
'home', name='coder-%s-home' % $.coder.workspace.id,
# not always supported
#driver_opts={ size: '%sG' % $.parameters.home_disk_size.value },
labels=[
docker.volume.labels.new('coder.owner', $.coder.workspace.owner),
docker.volume.labels.new('coder.owner_id', $.coder.workspace.owner_id),
docker.volume.labels.new('coder.workspace_id', $.coder.workspace.id),
docker.volume.labels.new('coder.workspace_name_at_creation', $.coder.workspace.name),
],
_extra={
lifecycle: [{ ignore_changes: 'all' }],
}
),
container: docker.container.new(
'workspace', name='coder-%s-workspace' % $.coder.workspace.id, cpu_shares=$.parameters.cpu.value,
memory=$.parameters.memory.value, image='nixos/nix:latest', hostname=$.coder.workspace.name,
entrypoint=[
'sh',
'-c',
inka.functions.replace(
$.coder.agent.init_script,
'"/localhost|127.0.0.1/"',
'"host.docker.internal"',
),
],
#runtime='sysbox-runc', storage_opts={ size: '10G' },
env=[
'CODER_AGENT_TOKEN=%s' % $.coder.agent.token,
],
host=[
docker.container.host.new('host.docker.internal', 'host-gateway')
],
volumes=[
docker.container.volumes.new(
container_path='/home/%s' % $.coder.workspace.owner, volume_name=self.volume.name, read_only=false,
),
],
labels=[
docker.container.labels.new('coder.owner', $.coder.workspace.owner),
docker.container.labels.new('coder.owner_id', $.coder.workspace.owner_id),
docker.container.labels.new('coder.workspace_id', $.coder.workspace.id),
docker.container.labels.new('coder.workspace_name_at_creation', $.coder.workspace.name),
],
),
},
}

View file

@ -0,0 +1,39 @@
local inka = import 'inka/main.libsonnet';
local coder = import 'coder/main.libsonnet';
{
requirements: {
coder: coder.provider.require(),
},
providers: {
coder: coder.provider.new(true),
},
parameters: {
cpu: coder.data.parameter.new(
'cpu', name='CPU [cores]', default='2', mutable=true, icon='/icon/memory.svg',
option=[
coder.data.parameter.option.new('1 Core', value='1'),
coder.data.parameter.option.new('2 Cores', value='2'),
coder.data.parameter.option.new('4 Cores', value='4'),
],
),
memory: coder.data.parameter.new(
'memory', name='Memory [GB]', default='1', mutable=true, icon='/icon/memory.svg',
option=[
coder.data.parameter.option.new('1GB', value='1'),
coder.data.parameter.option.new('2GB', value='2'),
coder.data.parameter.option.new('4GB', value='4'),
],
),
git_repo: coder.data.parameter.new(
'git_repo', name='Git Repository', default='', type='string', mutable=true,
),
home_disk_size: coder.data.parameter.new(
'home_disk_size', name='Home disk size [GB]', default='10', type='number',
mutable=false, icon='/emojis/1f4be.png',
validation=[
coder.data.parameter.validation.new(min=1, max=100),
],
),
}
}