swarm-ci-runner: give the registration token only to the register step
The runner got its registration token through an `EnvironmentFile` (`TOKEN=…`), so the daemon carried it for its whole life, and for a `host` label act_runner copies its environment into every job step: any workflow could read a token that registers runners on the forge. The host unit now writes the bare token, and the runner unit loads it with `LoadCredential=`. The upstream pre-start step, which registered from `$TOKEN`, is replaced by one register step that reads the token from `$CREDENTIALS_DIRECTORY` and runs `act_runner register` only when `.runner` is missing, with the instance URL, name, labels and config file upstream used. The precond now also removes `.runner` when its labels differ from the configured ones, which upstream's step covered. A changed token alone no longer re-registers. Host jobs can still read `.runner` itself (#4979). Closes #4974
This commit is contained in:
parent
84347f122c
commit
0302b29ca4
4 changed files with 158 additions and 71 deletions
|
|
@ -81,6 +81,9 @@ let
|
|||
|
||||
forgeSettings = forgeHere.containers.hive-forge.config.services.forgejo.settings;
|
||||
|
||||
runnerService = ciAlone.containers.swarm-ci-runner.config.systemd.services.gitea-runner-swarm;
|
||||
registerStep = lib.findFirst lib.isDerivation null runnerService.serviceConfig.ExecStartPre;
|
||||
|
||||
cases = [
|
||||
{
|
||||
# The absence the whole option exists for: a second forge in a swarm
|
||||
|
|
@ -150,6 +153,37 @@ let
|
|||
name = "the CI runner is refused without its store identity";
|
||||
ok = refusedOver ciNoIdentity "deploy.bao.ciRunnerClientCertFile";
|
||||
}
|
||||
{
|
||||
# A host job inherits the daemon's whole environment, and a token there
|
||||
# lets any workflow register runners against the forge.
|
||||
name = "the CI runner daemon carries no registration token in its environment";
|
||||
ok =
|
||||
let
|
||||
sc = runnerService.serviceConfig;
|
||||
in
|
||||
!(runnerService.environment ? TOKEN)
|
||||
&& lib.toList (sc.EnvironmentFile or [ ]) == [ ]
|
||||
&& !(lib.any (lib.hasPrefix "TOKEN=") (lib.toList (sc.Environment or [ ])))
|
||||
&& sc.LoadCredential == [ "registration-token:/var/lib/swarm-ci-runner/registration-token" ];
|
||||
}
|
||||
{
|
||||
# The only reader of the credential, and the only registration path.
|
||||
name = "the CI runner registers from its credential, and only without a .runner";
|
||||
ok =
|
||||
let
|
||||
text = registerStep.text;
|
||||
beforeRegister = lib.head (lib.splitString "register --no-interactive" text);
|
||||
in
|
||||
registerStep != null
|
||||
&& !(lib.any (
|
||||
s: lib.hasInfix "gitea-register-runner" (toString s)
|
||||
) runnerService.serviceConfig.ExecStartPre)
|
||||
&& lib.hasInfix "if [ -e .runner ]; then\n exit 0\nfi" beforeRegister
|
||||
&& lib.hasInfix ''token="$(< "$CREDENTIALS_DIRECTORY/registration-token")"'' beforeRegister
|
||||
&& lib.hasInfix ''--token "$token"'' text
|
||||
&& !(lib.hasInfix "export" text)
|
||||
&& !(lib.hasInfix "TOKEN" text);
|
||||
}
|
||||
{
|
||||
# A removed option evaluates to an assertion naming the replacement.
|
||||
name = "a CI option under deploy.forgejo names its replacement under deploy.ci-runner";
|
||||
|
|
|
|||
Loading…
Reference in a new issue