1
1
Fork 0
mirror of https://github.com/NixOS/nix.git synced 2025-11-18 16:29:36 +01:00

Bare minimum ssh-ng:// extensions for Hydra

This is not as comprehensive as #10748, but I am also interested in
figuring out whether all those additions are in fact necessary.

This is bare minimum needed for
https://github.com/NixOS/hydra/pull/1445, which has notable gaps but
nevertheless reimplements enough with `ssh-ng://` to past all tests.

I would like to merge this change as definitely necessary, and unclear
whether sufficient. Then I would iterate on the corresponding Hydra PR
until it seems potentially correct, seeing what, if any, further Nix API
changes are necessary.

Co-authored-by: Jörg Thalheim <Mic92@users.noreply.github.com>
This commit is contained in:
John Ericson 2025-02-14 17:25:38 -05:00
parent 1293388039
commit a92104f7ac
4 changed files with 34 additions and 2 deletions

View file

@ -767,7 +767,22 @@ BuildResult RemoteStore::buildDerivation(const StorePath & drvPath, const BasicD
auto conn(getConnection());
conn->putBuildDerivationRequest(*this, &conn.daemonException, drvPath, drv, buildMode);
conn.processStderr();
return WorkerProto::Serialise<BuildResult>::read(*this, *conn);
return conn->getBuildDerivationResponse(*this, &conn.daemonException);
}
std::function<BuildResult()> RemoteStore::buildDerivationAsync(
const StorePath & drvPath, const BasicDerivation & drv,
BuildMode buildMode)
{
// Until we have C++23 std::move_only_function
auto conn = std::make_shared<ConnectionHandle>(getConnection());
(*conn)->putBuildDerivationRequest(*this, &conn->daemonException, drvPath, drv, buildMode);
conn->processStderr();
return [this,conn]() -> BuildResult {
return (*conn)->getBuildDerivationResponse(*this, &conn->daemonException);
};
}

View file

@ -122,6 +122,18 @@ public:
BuildResult buildDerivation(const StorePath & drvPath, const BasicDerivation & drv,
BuildMode buildMode) override;
/**
* Note, the returned function must only be called once, or we'll
* try to read from the connection twice.
*
* This function is used by Hydra.
*
* @todo Use C++23 `std::move_only_function`.
*/
std::function<BuildResult()> buildDerivationAsync(
const StorePath & drvPath, const BasicDerivation & drv,
BuildMode buildMode);
void ensurePath(const StorePath & path) override;
void addTempRoot(const StorePath & path) override;

View file

@ -209,7 +209,7 @@ ref<RemoteStore::Connection> SSHStore::openConnection()
}
command.insert(command.end(),
extraRemoteProgramArgs.begin(), extraRemoteProgramArgs.end());
conn->sshConn = master.startCommand(std::move(command));
conn->sshConn = master.startCommand(std::move(command), std::list{extraSshArgs});
conn->to = FdSink(conn->sshConn->in.get());
conn->from = FdSource(conn->sshConn->out.get());
return conn;

View file

@ -18,6 +18,11 @@ struct SSHStoreConfig : virtual RemoteStoreConfig, virtual CommonSSHStoreConfig
const Setting<Strings> remoteProgram{
this, {"nix-daemon"}, "remote-program", "Path to the `nix-daemon` executable on the remote machine."};
/**
* Hack for hydra
*/
Strings extraSshArgs = {};
const std::string name() override
{
return "Experimental SSH Store";