Files
herolib/lib/virt/herocontainers/cengine_builder_solutions.v
2025-02-08 14:11:51 +01:00

176 lines
5.2 KiB
V

module herocontainers
import freeflowuniverse.herolib.osal
import freeflowuniverse.herolib.ui.console
import os
@[params]
pub struct GetArgs {
reset bool
}
// builder machine based on arch and install vlang
pub fn (mut e CEngine) builder_base(args GetArgs) !Builder {
name := 'base'
if !args.reset && e.builder_exists(name)! {
return e.builder_get(name)!
}
console.print_header('buildah base build')
mut builder := e.builder_new(name: name, from: 'scratch', delete: true)!
mount_path := builder.mount_to_path()!
if mount_path.len<4{
return error("mount_path needs to be +4 chars")
}
osal.exec(
cmd: '
export MOUNT_PATH=\'${mount_path}\'
mmdebstrap --variant=minbase --components="main,universe" --include="apt,base-files,base-passwd,bash,coreutils" noble \${MOUNT_PATH}
echo "Binding essential directories..."
mount --bind /dev "\${MOUNT_PATH}/dev"
mount --bind /proc "\${MOUNT_PATH}/proc"
mount --bind /sys "\${MOUNT_PATH}/sys"
echo "tzdata tzdata/Areas select Europe" | chroot "\${MOUNT_PATH}" debconf-set-selections
echo "tzdata tzdata/Zones/Europe select Brussels" | chroot "\${MOUNT_PATH}" debconf-set-selections
chroot \${MOUNT_PATH} apt update
# Set up APT for non-interactive installation
export DEBIAN_FRONTEND=noninteractive
export DEBCONF_NONINTERACTIVE_SEEN=true
# Update package lists
echo "Updating package lists in chroot..."
chroot \${MOUNT_PATH} apt-get update -yq
# Install required packages
echo "Installing essential packages..."
chroot \${MOUNT_PATH} apt-get install -yq screen bash coreutils curl mc unzip sudo which openssh-client openssh-server redis
echo "Cleaning up..."
umount "\${MOUNT_PATH}/dev" || true
umount "\${MOUNT_PATH}/proc" || true
umount "\${MOUNT_PATH}/sys" || true
'
)!
// builder.set_entrypoint('redis-server')!
builder.commit('localhost/${name}')!
return builder
}
// builder machine based on arch and install vlang
pub fn (mut e CEngine) builder_go_rust(args GetArgs) !Builder {
console.print_header('buildah builder go rust')
name := 'builder_go_rust'
e.builder_base(reset: false)!
if !args.reset && e.builder_exists(name)! {
return e.builder_get(name)!
}
mut builder := e.builder_new(name: name, from: 'localhost/base', delete: true)!
builder.hero_execute_cmd('installers -n golang,rust')!
// builder.clean()!
builder.commit('localhost/${name}')!
e.load()!
return builder
}
pub fn (mut e CEngine) builder_js(args GetArgs) !Builder {
console.print_header('buildah builder js')
name := 'builder_js'
e.builder_base(reset: false)!
if !args.reset && e.builder_exists(name)! {
return e.builder_get(name)!
}
mut builder := e.builder_new(name: name, from: 'localhost/base', delete: true)!
builder.hero_execute_cmd('installers -n nodejs')!
// builder.clean()!
builder.commit('localhost/${name}')!
e.load()!
return builder
}
pub fn (mut e CEngine) builder_js_python(args GetArgs) !Builder {
console.print_header('buildah builder js python')
name := 'builder_js_python'
e.builder_js(reset: false)!
if !args.reset && e.builder_exists(name)! {
return e.builder_get(name)!
}
mut builder := e.builder_new(name: name, from: 'localhost/builder_js', delete: true)!
builder.hero_execute_cmd('installers -n python')!
// builder.clean()!
builder.commit('localhost/${name}')!
e.load()!
return builder
}
pub fn (mut e CEngine) builder_hero(args GetArgs) !Builder {
console.print_header('buildah builder hero dev')
name := 'builder_hero'
e.builder_js_python(reset: false)!
if !args.reset && e.builder_exists(name)! {
return e.builder_get(name)!
}
mut builder := e.builder_new(name: name, from: 'localhost/builder_js_python', delete: true)!
builder.hero_execute_cmd('installers -n hero')!
// builder.clean()!
builder.commit('localhost/${name}')!
e.load()!
return builder
}
pub fn (mut e CEngine) builder_herodev(args GetArgs) !Builder {
console.print_header('buildah builder hero dev')
name := 'builder_herodev'
e.builder_js_python(reset: false)!
if !args.reset && e.builder_exists(name)! {
return e.builder_get(name)!
}
mut builder := e.builder_new(name: name, from: 'localhost/builder_hero', delete: true)!
builder.hero_execute_cmd('installers -n herodev')!
// builder.clean()!
builder.commit('localhost/${name}')!
e.load()!
return builder
}
pub fn (mut e CEngine) builder_heroweb(args GetArgs) !Builder {
console.print_header('buildah builder hero web')
name := 'builder_heroweb'
e.builder_go_rust(reset: false)!
e.builder_hero(reset: false)!
if !args.reset && e.builder_exists(name)! {
return e.builder_get(name)!
}
mut builder0 := e.builder_new(
name: 'builder_heroweb_temp'
from: 'localhost/builder_go_rust'
delete: true
)!
builder0.hero_execute_cmd('installers -n heroweb')!
// builder0.hero_execute_cmd("installers -n heroweb")!
mpath := builder0.mount_to_path()!
// copy the built binary to host
osal.exec(
cmd: '
mkdir -p ${os.home_dir()}/hero/var/bin
cp ${mpath}/usr/local/bin/* ${os.home_dir()}/hero/var/bin/
'
)!
builder0.delete()!
mut builder2 := e.builder_new(name: name, from: 'localhost/builder_hero', delete: true)!
builder2.copy('${os.home_dir()}/hero/var/bin/', '/usr/local/bin/')!
builder2.commit('localhost/${name}')!
e.load()!
return builder2
}