Compare commits

..

9 commits

2 changed files with 79 additions and 36 deletions

View file

@ -3,7 +3,7 @@ class podmanrunner::runner (
Integer $replicas = 2, Integer $replicas = 2,
) )
{ {
$username='runneruser' $userpostfix='runner'
$runnerdata = lookup("runners",undef,undef,undef) $runnerdata = lookup("runners",undef,undef,undef)
package { 'podman': package { 'podman':
ensure => installed, ensure => installed,
@ -28,81 +28,107 @@ class podmanrunner::runner (
group => "root", group => "root",
} }
$runnerdata.each |$user,$userdata| {
$sdrun = "systemd-run --wait --user --machine=${user}${userpostfix}@"
range(1,$replicas).each |$x| { user { "${user}${userpostfix}":
user { "${username}${x}":
ensure => present, ensure => present,
home => "/opt/${username}${x}", home => "/opt/${user}${userpostfix}",
shell => '/usr/sbin/nologin', shell => '/usr/sbin/nologin',
uid => "${ $x + 1001}",
managehome => true, managehome => true,
} }
file { "/opt/${username}${x}/docker-compose.yaml": file { "/opt/${user}${userpostfix}/docker-compose.yaml":
ensure => file, ensure => file,
content => template('podmanrunner/docker-compose.yaml.erb'), content => template('podmanrunner/docker-compose.yaml.erb'),
owner => "${username}${x}", owner => "${user}${userpostfix}",
group => "${username}${x}", group => "${user}${userpostfix}",
mode => '0400', mode => '0400',
} }
file { "/opt/${username}${x}/runnerimage": file { "/opt/${user}${userpostfix}/runnerimage":
ensure => directory, ensure => directory,
mode => '0700', mode => '0700',
owner => "${username}${x}", owner => "${user}${userpostfix}",
group => "${username}${x}", group => "${user}${userpostfix}",
} }
file { "/opt/${username}${x}/runnerimage/Containerfile": file { "/opt/${user}${userpostfix}/runnerimage/Containerfile":
ensure => file, ensure => file,
content => template('podmanrunner/runnerimage-Containerfile.erb'), content => template('podmanrunner/runnerimage-Containerfile.erb'),
owner => "${username}${x}", owner => "${user}${userpostfix}",
group => "${username}${x}", group => "${user}${userpostfix}",
mode => '0400', mode => '0400',
} }
unless find_file("/opt/${username}${x}/runnerdata") { unless find_file("/opt/${user}${userpostfix}/runnerdata") {
file { "/opt/${username}${x}/runnerdata": file { "/opt/${user}${userpostfix}/runnerdata":
ensure => directory, ensure => directory,
mode => '0700', mode => '0700',
owner => "${username}${x}", owner => "${user}${userpostfix}",
group => "${username}${x}", group => "${user}${userpostfix}",
} }
} }
file { "/opt/${username}${x}/runnerdata/config.yml": unless find_file("/opt/${user}${userpostfix}/runnerdata/config.yml") {
file { "/opt/${user}${userpostfix}/runnerdata/config.yml":
ensure => file, ensure => file,
source => 'puppet:///modules/podmanrunner/forgejo-runner-config.yml', source => 'puppet:///modules/podmanrunner/forgejo-runner-config.yml',
owner => "${username}${x}", owner => "${user}${userpostfix}",
group => "${username}${x}", group => "${user}${userpostfix}",
mode => '0400', mode => '0400',
} }
}
# Make sure the podman user can read the /data dir # Make sure the podman user can read the /data dir
exec { "make-${username}${x}-own-runnerdata": exec { "make-${user}${userpostfix}-own-runnerdata":
command => "systemd-run --wait --user --machine=${username}${x}@ /bin/bash -c 'podman unshare chown 1000:1000 /opt/${username}${x}/runnerdata'", command => "${sdrun} /bin/bash -c 'podman unshare chown 1000:1000 /opt/${user}${userpostfix}/runnerdata'",
path => '/usr/bin:/usr/sbin:/bin', path => '/usr/bin:/usr/sbin:/bin',
provider => shell, provider => shell,
logoutput => false, logoutput => false,
unless => "systemd-run --wait --user --machine=${username}${x}@ /bin/bash -c 'podman unshare stat --format %u /opt/${username}${x}/runnerdata | grep ^1000$ && podman unshare stat --format %g /opt/${username}${x}/runnerdata | grep ^1000$'", unless => "${sdrun} /bin/bash -c 'podman unshare stat --format %u /opt/${user}${userpostfix}/runnerdata | \
grep ^1000$ && podman unshare stat --format %g /opt/${user}${userpostfix}/runnerdata | grep ^1000$'",
} }
exec { "enable-${username}${x}-linger": # Make sure the podman user can read the /data/config.yml file
command => "loginctl enable-linger ${username}${x}", exec { "podman-${user}${userpostfix}-own-runner-config":
command => "${sdrun} /bin/bash -c 'podman unshare chown 1000:1000 /opt/${user}${userpostfix}/runnerdata/config.yml'",
path => '/usr/bin:/usr/sbin:/bin', path => '/usr/bin:/usr/sbin:/bin',
provider => shell, provider => shell,
logoutput => false, logoutput => false,
unless => "test -f /var/lib/systemd/linger/${username}${x}", unless => "${sdrun} /bin/bash -c 'podman unshare stat --format %u /opt/${user}${userpostfix}/runnerdata/config.yml | \
grep ^1000$ && podman unshare stat --format %g /opt/${user}${userpostfix}/runnerdata/config.yml | grep ^1000$'",
} }
if $runnerdata and $runnerdata["${username}${x}"] and 'url' in $runnerdata["${username}${x}"] { exec { "enable-${user}${userpostfix}-linger":
notify {"runnercontent${x}": command => "loginctl enable-linger ${user}${userpostfix}",
message => $runnerdata["${username}${x}"] path => '/usr/bin:/usr/sbin:/bin',
} provider => shell,
logoutput => false,
unless => "test -f /var/lib/systemd/linger/${user}${userpostfix}",
} }
# If required, build runner image by podman-compose
exec { "${user}${userpostfix}-build-runner-image":
command => "${sdrun} /bin/bash -c 'podman-compose build'",
path => '/usr/bin:/usr/sbin:/bin',
provider => shell,
logoutput => false,
unless => "${sdrun} /bin/bash -c \"podman image ls | grep '^localhost/podmanrunner\s\s*3\.[0-9]\.[0-9]'\"",
}
# If not already done, register runner with forgejo instance.
if $userdata and $userdata["token"] and $userdata["url"] {
exec { "${user}${userpostfix}-register-runner":
command => "${sdrun} /bin/bash -c 'podman run -it --rm -u podman -v ./runnerdata:/data:Z localhost/podmanrunner:3.3.0 /bin/bash -c \
\"date >> /data/register.log && forgejo-runner --config /data/config.yml register --no-interactive \
--token ${userdata["token"]} --name runner1 --labels self-hosted --instance ${userdata["url"]} 1>>/data/register.log 2>&1\"'",
path => '/usr/bin:/usr/sbin:/bin',
provider => shell,
logoutput => false,
unless => "test -f /opt/${user}${userpostfix}/runnerdata/.runner",
}
}
} }
} }

View file

@ -0,0 +1,17 @@
version: "3"
services:
actionrunner:
name: actionrunner
image: podmanrunner:3.3.0
build:
context: ./runnerimage
volumes:
- runnerdata:/data:Z
volumes:
runnerdata:
driver: local
driver_opts:
device: /opt/runneruser1runner/runnerdata
o: bind
type: none