gitea-runner.nix (4690B)
1 { 2 config, 3 pkgs, 4 lib, 5 ... 6 }: 7 8 let 9 cfg = config.services.local.gitea-runner; 10 in 11 { 12 options.services.local.gitea-runner = { 13 enable = lib.mkEnableOption "Forgejo/Gitea actions runner"; 14 15 name = lib.mkOption { 16 type = lib.types.str; 17 description = "Runner instance name"; 18 }; 19 20 url = lib.mkOption { 21 type = lib.types.str; 22 default = "https://git.fnarglebeast.com"; 23 description = "Forgejo/Gitea server URL"; 24 }; 25 26 tokenSecretName = lib.mkOption { 27 type = lib.types.str; 28 description = "Name of the sops secret containing the runner token"; 29 }; 30 31 sshKeySecretName = lib.mkOption { 32 type = lib.types.str; 33 default = ""; 34 description = "Name of the sops secret containing the SSH key (optional)"; 35 }; 36 37 labels = lib.mkOption { 38 type = lib.types.listOf lib.types.str; 39 default = [ 40 "docker:docker://alpine:3.23" 41 "native:host" 42 ]; 43 description = "Runner labels"; 44 }; 45 46 hostPackages = lib.mkOption { 47 type = lib.types.listOf lib.types.package; 48 default = with pkgs; [ 49 nix 50 nodejs 51 git 52 bash 53 coreutils 54 openssh 55 curl 56 jq 57 ]; 58 description = "Packages available to the runner"; 59 }; 60 61 knownHosts = lib.mkOption { 62 type = lib.types.listOf lib.types.str; 63 default = [ 64 "46.62.150.48 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEOKImx9KgmG+/ggpuS2z/hXkWu3TgT/xK9fI18tPOI1" 65 "188.166.127.72 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILSAe7jj+yZ4iED+6u8oPX+UqEKzcZriLEXAVbjt3Cqo" 66 "github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl" 67 "github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=" 68 "github.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk=" 69 ]; 70 description = "SSH known hosts entries"; 71 }; 72 }; 73 74 config = lib.mkIf cfg.enable { 75 sops.secrets.${cfg.tokenSecretName} = { }; 76 sops.secrets.${cfg.sshKeySecretName} = lib.mkIf (cfg.sshKeySecretName != "") { }; 77 78 services.gitea-actions-runner = { 79 package = pkgs.forgejo-runner; 80 instances.default = { 81 enable = true; 82 name = cfg.name; 83 url = cfg.url; 84 tokenFile = "/run/secrets/${cfg.tokenSecretName}"; 85 labels = cfg.labels; 86 hostPackages = cfg.hostPackages; 87 }; 88 }; 89 90 systemd.services.gitea-runner-default = lib.mkIf (cfg.sshKeySecretName != "") { 91 serviceConfig.LoadCredential = "ssh-key:/run/secrets/${cfg.sshKeySecretName}"; 92 # Run as root (+prefix) to set up /root/.ssh for nix-daemon 93 serviceConfig.ExecStartPre = let 94 rootSshSetup = pkgs.writeShellScript "gitea-runner-root-ssh-setup" '' 95 mkdir -p /root/.ssh 96 cp /run/secrets/${cfg.sshKeySecretName} /root/.ssh/id_ed25519 97 chmod 600 /root/.ssh/id_ed25519 98 : > /root/.ssh/known_hosts 99 ${lib.concatMapStringsSep "\n" (host: ''echo "${host}" >> /root/.ssh/known_hosts'') cfg.knownHosts} 100 cat > /root/.ssh/config <<SSHCONF 101 Host git.fnarglebeast.com 102 IdentityFile /root/.ssh/id_ed25519 103 StrictHostKeyChecking no 104 SSHCONF 105 chmod 600 /root/.ssh/config 106 ''; 107 in [ "+${rootSshSetup}" ]; 108 # Run as gitea-runner user to set up runner's own SSH 109 preStart = lib.mkAfter '' 110 mkdir -p /var/lib/gitea-runner/default/.ssh 111 cp $CREDENTIALS_DIRECTORY/ssh-key /var/lib/gitea-runner/default/.ssh/id_ed25519 112 chmod 600 /var/lib/gitea-runner/default/.ssh/id_ed25519 113 : > /var/lib/gitea-runner/default/.ssh/known_hosts 114 ${lib.concatMapStringsSep "\n" (host: ''echo "${host}" >> /var/lib/gitea-runner/default/.ssh/known_hosts'') cfg.knownHosts} 115 cat > /var/lib/gitea-runner/default/.ssh/config <<SSHCONF 116 Host git.fnarglebeast.com 117 IdentityFile /var/lib/gitea-runner/default/.ssh/id_ed25519 118 StrictHostKeyChecking no 119 SSHCONF 120 chmod 600 /var/lib/gitea-runner/default/.ssh/config 121 ''; 122 serviceConfig.ExecPaths = [ "/var/lib/gitea-runner" ]; 123 }; 124 }; 125 }