From b20b7f7838a6a141fd358a98dc4d0537682e37b3 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Wed, 2 Sep 2026 14:42:48 +0900 Subject: [PATCH 1/2] nixos/tests/gitea-actions-runner: init --- nixos/tests/all-tests.nix | 1 + nixos/tests/gitea-actions-runner.nix | 136 ++++++++++++++++++ .../gi/gitea-actions-runner/package.nix | 10 +- pkgs/by-name/gi/gitea/package.nix | 4 +- 4 files changed, 147 insertions(+), 4 deletions(-) create mode 100644 nixos/tests/gitea-actions-runner.nix diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index 02ed0d9ed077..c195f6859695 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -701,6 +701,7 @@ in inherit pkgs runTest; inherit (pkgs) lib; }; + gitea-actions-runner = runTest ./gitea-actions-runner.nix; github-runner = runTest ./github-runner.nix; gitlab = import ./gitlab { inherit runTest; diff --git a/nixos/tests/gitea-actions-runner.nix b/nixos/tests/gitea-actions-runner.nix new file mode 100644 index 000000000000..f83c63e6f5c2 --- /dev/null +++ b/nixos/tests/gitea-actions-runner.nix @@ -0,0 +1,136 @@ +{ pkgs, ... }: +{ + name = "gitea-actions-runner"; + meta = { + maintainers = pkgs.gitea-actions-runner.meta.maintainers; + }; + + nodes.machine = + { pkgs, ... }: + { + services.gitea = { + enable = true; + database.type = "sqlite3"; + settings = { + actions.ENABLED = true; + service.DISABLE_REGISTRATION = true; + }; + }; + + services.gitea-actions-runner.instances = { + host = { + enable = true; + name = "ci-host"; + url = "http://localhost:3000"; + labels = [ "native:host" ]; + tokenFile = "/var/lib/gitea/runner_token"; + settings.metrics = { + enabled = true; + addr = "127.0.0.1:9101"; + }; + }; + + podman = { + enable = true; + name = "ci-podman"; + url = "http://localhost:3000"; + labels = [ "container:docker://test-image:latest" ]; + tokenFile = "/var/lib/gitea/runner_token"; + settings.metrics = { + enabled = true; + addr = "127.0.0.1:9102"; + }; + }; + }; + + virtualisation.podman.enable = true; + + environment.systemPackages = [ + pkgs.gitea + pkgs.gitMinimal + pkgs.tea + ]; + }; + + testScript = + let + containerImage = pkgs.dockerTools.buildLayeredImage { + name = "test-image"; + tag = "latest"; + contents = [ + pkgs.busybox + pkgs.bashInteractive + ]; + }; + + ciWorkflow = pkgs.writeText "gitea-actions-runner-test-workflow.yaml" '' + name: test + on: [push] + jobs: + host: + runs-on: native + steps: + - run: echo hello from the host runner + container: + runs-on: container + steps: + - run: echo hello from the podman runner + ''; + in + '' + import json + from typing import Any + + + def gitea_admin(args: str) -> str: + return machine.succeed(f"su -l gitea -c 'GITEA_WORK_DIR=/var/lib/gitea gitea {args}'") + + + def tea_json(args: str) -> Any: + output = machine.succeed(f"tea {args} --login test -o json").strip() + if not output.startswith(("[", "{")): + return [] + return json.loads(output) + + + start_all() + + machine.wait_for_unit("gitea.service") + machine.wait_for_open_port(3000) + machine.succeed("curl --fail http://localhost:3000/") + + gitea_admin("admin user create --username test --password hunter2 --email test@localhost") + machine.succeed( + "tea login add --url http://localhost:3000 --user test --password hunter2 -n test" + ) + + with subtest("Loading the test container image into podman"): + machine.wait_for_unit("podman.socket") + machine.succeed("podman load -i ${containerImage}") + + with subtest("Registering the runners"): + token = gitea_admin("actions generate-runner-token").strip() + machine.succeed(f"echo TOKEN={token} > /var/lib/gitea/runner_token") + + machine.wait_for_unit("gitea-runner-host.service") + machine.wait_until_succeeds("curl --fail http://localhost:9101/readyz") + machine.wait_until_succeeds("journalctl -u gitea-runner-host.service --grep 'Runner registered successfully'") + + machine.wait_for_unit("gitea-runner-podman.service") + machine.wait_until_succeeds("curl --fail http://localhost:9102/readyz") + machine.wait_until_succeeds("journalctl -u gitea-runner-podman.service --grep 'Runner registered successfully'") + + with subtest("Creating a repository with a workflow using both runners"): + tea_json("repos create --name repo --init") + machine.succeed( + "tea api -X POST /repos/test/repo/contents/.gitea%2Fworkflows%2Ftest.yaml " + + "--login test " + + "-f branch=main " + + '-f content="$(base64 -w0 ${ciWorkflow})" ' + + '-f message="Add CI workflow"' + ) + + with subtest("Waiting for both jobs to be picked up and run"): + retry(lambda _: len(tea_json("actions runs list --repo test/repo --status success")) == 1) + ''; +} diff --git a/pkgs/by-name/gi/gitea-actions-runner/package.nix b/pkgs/by-name/gi/gitea-actions-runner/package.nix index f6328af3e97b..506c947e8592 100644 --- a/pkgs/by-name/gi/gitea-actions-runner/package.nix +++ b/pkgs/by-name/gi/gitea-actions-runner/package.nix @@ -4,6 +4,7 @@ buildGoModule, testers, gitea-actions-runner, + nixosTests, nix-update-script, }: @@ -35,9 +36,12 @@ buildGoModule (finalAttrs: { ''; passthru = { - tests.version = testers.testVersion { - package = gitea-actions-runner; - version = "v${finalAttrs.version}"; + tests = { + version = testers.testVersion { + package = gitea-actions-runner; + version = "v${finalAttrs.version}"; + }; + nixos = nixosTests.gitea-actions-runner; }; updateScript = nix-update-script { }; }; diff --git a/pkgs/by-name/gi/gitea/package.nix b/pkgs/by-name/gi/gitea/package.nix index 28df315920b5..e50f45d462bf 100644 --- a/pkgs/by-name/gi/gitea/package.nix +++ b/pkgs/by-name/gi/gitea/package.nix @@ -130,7 +130,9 @@ buildGoModule (finalAttrs: { lib.warn "gitea.passthru.data-compressed is deprecated. Use \"compressDrvWeb gitea.data\"." (compressDrvWeb gitea.data { }); - tests = nixosTests.gitea; + tests = { + inherit (nixosTests) gitea gitea-actions-runner; + }; }; meta = { From 59928df996a28fffcbfc653534e84a36a19add91 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Wed, 2 Sep 2026 14:48:33 +0900 Subject: [PATCH 2/2] nixos/tests/gitea: remove runner-related subtest --- nixos/tests/gitea.nix | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/nixos/tests/gitea.nix b/nixos/tests/gitea.nix index 9a80d610ac48..4fd0d16ece41 100644 --- a/nixos/tests/gitea.nix +++ b/nixos/tests/gitea.nix @@ -53,17 +53,6 @@ let }; }; - gitea-actions-runner.instances."test" = { - enable = true; - name = "ci"; - url = "http://localhost:3000"; - labels = [ - # don't require docker/podman - "native:host" - ]; - tokenFile = "/var/lib/gitea/runner_token"; - }; - openssh.enable = true; }; environment.systemPackages = [ @@ -160,13 +149,6 @@ let + '-H "Authorization: Bearer fakesecret" ' + 'http://localhost:3000/metrics ' + '| grep gitea_accesses') - - with subtest("Testing runner registration"): - server.succeed( - "su -l gitea -c 'GITEA_WORK_DIR=/var/lib/gitea gitea actions generate-runner-token' | sed 's/^/TOKEN=/' | tee /var/lib/gitea/runner_token" - ) - server.wait_for_unit("gitea-runner-test.service") - server.succeed("journalctl -o cat -u gitea-runner-test.service | grep -q 'Runner registered successfully'") ''; }); in