182 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			182 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| {
 | |
|   lib,
 | |
|   config,
 | |
|   namespace,
 | |
|   pkgs,
 | |
|   ...
 | |
| }:
 | |
| with lib.${namespace};
 | |
| let
 | |
|   cfg = config.${namespace}.services.gitea-runner;
 | |
|   inherit (lib) mkIf mkOption mkEnableOption;
 | |
|   inherit (lib.types)
 | |
|     attrsOf
 | |
|     package
 | |
|     path
 | |
|     submodule
 | |
|     str
 | |
|     ;
 | |
| in
 | |
| {
 | |
|   options.${namespace}.services.gitea-runner = {
 | |
|     enable = mkEnableOption "Enable gitea/forgejo runner";
 | |
|     git-url = mkOption {
 | |
|       type = str;
 | |
|       default = "https://git.christophhollizeck.dev";
 | |
|     };
 | |
|     sopsFile = mkOption {
 | |
|       type = path;
 | |
|       default = lib.snowfall.fs.get-file "secrets/secrets.yaml";
 | |
|       description = "SecretFile";
 | |
|     };
 | |
|     runner-package = mkOption {
 | |
|       type = package;
 | |
|       default = pkgs.forgejo-actions-runner;
 | |
|       description = "Which runner to use Gitea/Forgjo";
 | |
|     };
 | |
|     ## taken from nixos/modules/services/continuous-integration/gitea-actions-runner.nix
 | |
|     runner-instances = mkOption {
 | |
|       default = { };
 | |
|       description = ''
 | |
|         Gitea Actions Runner instances.
 | |
|       '';
 | |
|       type = attrsOf (submodule {
 | |
|         options = {
 | |
|           enable = mkEnableOption "Gitea Actions Runner instance";
 | |
|           name = mkOption {
 | |
|             type = str;
 | |
|             example = literalExpression "config.networking.hostName";
 | |
|             description = ''
 | |
|               The name identifying the runner instance towards the Gitea/Forgejo instance.
 | |
|             '';
 | |
|           };
 | |
|           url = mkOption {
 | |
|             type = str;
 | |
|             example = "https://forge.example.com";
 | |
|             description = ''
 | |
|               Base URL of your Gitea/Forgejo instance.
 | |
|             '';
 | |
|           };
 | |
|           tokenFile = mkOption {
 | |
|             type = nullOr (either str path);
 | |
|             default = null;
 | |
|             description = ''
 | |
|               Path to an environment file, containing the `TOKEN` environment
 | |
|               variable, that holds a token to register at the configured
 | |
|               Gitea/Forgejo instance.
 | |
|             '';
 | |
|           };
 | |
|           labels = mkOption {
 | |
|             type = listOf str;
 | |
|             example = literalExpression ''
 | |
|               [
 | |
|                 # provide a debian base with nodejs for actions
 | |
|                 "debian-latest:docker://node:18-bullseye"
 | |
|                 # fake the ubuntu name, because node provides no ubuntu builds
 | |
|                 "ubuntu-latest:docker://node:18-bullseye"
 | |
|                 # provide native execution on the host
 | |
|                 #"native:host"
 | |
|               ]
 | |
|             '';
 | |
|             description = ''
 | |
|               Labels used to map jobs to their runtime environment. Changing these
 | |
|               labels currently requires a new registration token.
 | |
| 
 | |
|               Many common actions require bash, git and nodejs, as well as a filesystem
 | |
|               that follows the filesystem hierarchy standard.
 | |
|             '';
 | |
|           };
 | |
|           settings = mkOption {
 | |
|             description = ''
 | |
|               Configuration for `act_runner daemon`.
 | |
|               See https://gitea.com/gitea/act_runner/src/branch/main/internal/pkg/config/config.example.yaml for an example configuration
 | |
|             '';
 | |
| 
 | |
|             type = types.submodule {
 | |
|               freeformType = settingsFormat.type;
 | |
|             };
 | |
| 
 | |
|             default = { };
 | |
|           };
 | |
| 
 | |
|           hostPackages = mkOption {
 | |
|             type = listOf package;
 | |
|             default = with pkgs; [
 | |
|               bash
 | |
|               coreutils
 | |
|               curl
 | |
|               gawk
 | |
|               gitMinimal
 | |
|               gnused
 | |
|               nodejs
 | |
|               wget
 | |
|             ];
 | |
|             defaultText = literalExpression ''
 | |
|               with pkgs; [
 | |
|                 bash
 | |
|                 coreutils
 | |
|                 curl
 | |
|                 gawk
 | |
|                 gitMinimal
 | |
|                 gnused
 | |
|                 nodejs
 | |
|                 wget
 | |
|               ]
 | |
|             '';
 | |
|             description = ''
 | |
|               List of packages, that are available to actions, when the runner is configured
 | |
|               with a host execution label.
 | |
|             '';
 | |
|           };
 | |
|         };
 | |
|       });
 | |
|     };
 | |
|   };
 | |
| 
 | |
|   config = mkIf cfg.enable {
 | |
|     sops = {
 | |
|       secrets = {
 | |
|         "forgejo/runner/token" = {
 | |
|           inherit (cfg) sopsFile;
 | |
|         };
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     services.gitea-actions-runner = {
 | |
|       package = cfg.runner-package;
 | |
|       instances = {
 | |
|         native = {
 | |
|           enable = true;
 | |
|           name = "monolith";
 | |
|           url = cfg.git-url;
 | |
|           tokenFile = config.sops.secrets."forgejo/runner/token".path;
 | |
|           labels = [
 | |
|             "native:host"
 | |
|           ];
 | |
|           hostPackages = with pkgs; [
 | |
|             bash
 | |
|             coreutils
 | |
|             curl
 | |
|             gawk
 | |
|             gitMinimal
 | |
|             gnused
 | |
|             nodejs
 | |
|             wget
 | |
|             lix
 | |
|           ];
 | |
|           settings = {
 | |
|             log.level = "info";
 | |
|             runner = {
 | |
|               capacity = 1;
 | |
|               timeout = "3h";
 | |
|               shutdown_timeout = "5s";
 | |
|               fetch_timeout = "10s";
 | |
|               fetch_inteval = "5s";
 | |
|             };
 | |
|           };
 | |
|         };
 | |
|       } // cfg.runner-instances;
 | |
|     };
 | |
| 
 | |
|   };
 | |
| }
 |