WIP ssh-ng://
This commit is contained in:
8
flake.lock
generated
8
flake.lock
generated
@@ -13,16 +13,16 @@
|
|||||||
"nixpkgs-regression": []
|
"nixpkgs-regression": []
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1739570697,
|
"lastModified": 1739571938,
|
||||||
"narHash": "sha256-n5kdS1C24tlJxDV6Wm1iBlyvGk+p0gMXRcWVCAipYLs=",
|
"narHash": "sha256-NlaLAed/xei6RWpU2HIIbDjILRC4l1NIfGeyrn7ALQs=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nix",
|
"repo": "nix",
|
||||||
"rev": "5eade4825221d3284fc6555cb20de2c7aa171d72",
|
"rev": "ffc649d2eabdd3e678b5bcc211dd59fd06debf3e",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"ref": "legacy-ssh-extensions-for-hydra",
|
"ref": "ssh-ng-extensions-for-hydra",
|
||||||
"repo": "nix",
|
"repo": "nix",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11-small";
|
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11-small";
|
||||||
|
|
||||||
inputs.nix = {
|
inputs.nix = {
|
||||||
url = "github:NixOS/nix/legacy-ssh-extensions-for-hydra";
|
url = "github:NixOS/nix/ssh-ng-extensions-for-hydra";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
|
||||||
# hide nix dev tooling from our lock file
|
# hide nix dev tooling from our lock file
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
#include "build-result.hh"
|
#include "build-result.hh"
|
||||||
#include "path.hh"
|
#include "path.hh"
|
||||||
#include "legacy-ssh-store.hh"
|
#include "ssh-store.hh"
|
||||||
#include "serve-protocol.hh"
|
#include "serve-protocol.hh"
|
||||||
#include "state.hh"
|
#include "state.hh"
|
||||||
#include "current-process.hh"
|
#include "current-process.hh"
|
||||||
@@ -119,11 +119,10 @@ static BuildResult performBuild(
|
|||||||
Store & localStore,
|
Store & localStore,
|
||||||
StorePath drvPath,
|
StorePath drvPath,
|
||||||
const BasicDerivation & drv,
|
const BasicDerivation & drv,
|
||||||
const ServeProto::BuildOptions & options,
|
|
||||||
counter & nrStepsBuilding
|
counter & nrStepsBuilding
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
auto kont = conn.store->buildDerivationAsync(drvPath, drv, options);
|
auto kont = conn.store->buildDerivationAsync(drvPath, drv, bmNormal);
|
||||||
|
|
||||||
BuildResult result;
|
BuildResult result;
|
||||||
|
|
||||||
@@ -238,7 +237,6 @@ void RemoteResult::updateWithBuildResult(const nix::BuildResult & buildResult)
|
|||||||
|
|
||||||
void State::buildRemote(ref<Store> destStore,
|
void State::buildRemote(ref<Store> destStore,
|
||||||
::Machine::ptr machine, Step::ptr step,
|
::Machine::ptr machine, Step::ptr step,
|
||||||
const ServeProto::BuildOptions & buildOptions,
|
|
||||||
RemoteResult & result, std::shared_ptr<ActiveStep> activeStep,
|
RemoteResult & result, std::shared_ptr<ActiveStep> activeStep,
|
||||||
std::function<void(StepState)> updateStep,
|
std::function<void(StepState)> updateStep,
|
||||||
NarMemberDatas & narMembers)
|
NarMemberDatas & narMembers)
|
||||||
@@ -258,23 +256,26 @@ void State::buildRemote(ref<Store> destStore,
|
|||||||
.machine = machine,
|
.machine = machine,
|
||||||
.store = [&]{
|
.store = [&]{
|
||||||
auto * pSpecified = std::get_if<StoreReference::Specified>(&machine->storeUri.variant);
|
auto * pSpecified = std::get_if<StoreReference::Specified>(&machine->storeUri.variant);
|
||||||
if (!pSpecified || pSpecified->scheme != "ssh") {
|
if (!pSpecified || pSpecified->scheme != "ssh-ng") {
|
||||||
throw Error("Currently, only (legacy-)ssh stores are supported!");
|
throw Error("Currently, only ssh-ng:// stores are supported!");
|
||||||
}
|
}
|
||||||
|
|
||||||
auto remoteStore = machine->openStore().dynamic_pointer_cast<LegacySSHStore>();
|
auto remoteStore = machine->openStore().dynamic_pointer_cast<RemoteStore>();
|
||||||
|
auto remoteStoreConfig = std::dynamic_pointer_cast<SSHStoreConfig>(remoteStore);
|
||||||
assert(remoteStore);
|
assert(remoteStore);
|
||||||
|
|
||||||
if (machine->isLocalhost()) {
|
if (machine->isLocalhost()) {
|
||||||
auto rp_new = remoteStore->remoteProgram.get();
|
auto rp_new = remoteStoreConfig->remoteProgram.get();
|
||||||
rp_new.push_back("--builders");
|
rp_new.push_back("--builders");
|
||||||
rp_new.push_back("");
|
rp_new.push_back("");
|
||||||
const_cast<nix::Setting<Strings> &>(remoteStore->remoteProgram).assign(rp_new);
|
const_cast<nix::Setting<Strings> &>(remoteStoreConfig->remoteProgram).assign(rp_new);
|
||||||
}
|
}
|
||||||
remoteStore->extraSshArgs = {
|
remoteStoreConfig->extraSshArgs = {
|
||||||
"-a", "-oBatchMode=yes", "-oConnectTimeout=60", "-oTCPKeepAlive=yes"
|
"-a", "-oBatchMode=yes", "-oConnectTimeout=60", "-oTCPKeepAlive=yes"
|
||||||
};
|
};
|
||||||
const_cast<nix::Setting<int> &>(remoteStore->logFD).assign(logFD.get());
|
|
||||||
|
// TODO logging
|
||||||
|
//const_cast<nix::Setting<int> &>(remoteStore->logFD).assign(logFD.get());
|
||||||
|
|
||||||
return nix::ref{remoteStore};
|
return nix::ref{remoteStore};
|
||||||
}(),
|
}(),
|
||||||
@@ -283,12 +284,10 @@ void State::buildRemote(ref<Store> destStore,
|
|||||||
{
|
{
|
||||||
auto activeStepState(activeStep->state_.lock());
|
auto activeStepState(activeStep->state_.lock());
|
||||||
if (activeStepState->cancelled) throw Error("step cancelled");
|
if (activeStepState->cancelled) throw Error("step cancelled");
|
||||||
activeStepState->pid = conn.store->getConnectionPid();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Finally clearPid([&]() {
|
Finally clearPid([&]() {
|
||||||
auto activeStepState(activeStep->state_.lock());
|
auto activeStepState(activeStep->state_.lock());
|
||||||
activeStepState->pid = -1;
|
|
||||||
|
|
||||||
/* FIXME: there is a slight race here with step
|
/* FIXME: there is a slight race here with step
|
||||||
cancellation in State::processQueueChange(), which
|
cancellation in State::processQueueChange(), which
|
||||||
@@ -299,9 +298,10 @@ void State::buildRemote(ref<Store> destStore,
|
|||||||
});
|
});
|
||||||
|
|
||||||
Finally updateStats([&]() {
|
Finally updateStats([&]() {
|
||||||
auto stats = conn.store->getConnectionStats();
|
// TODO
|
||||||
bytesReceived += stats.bytesReceived;
|
//auto stats = conn.store->getConnectionStats();
|
||||||
bytesSent += stats.bytesSent;
|
//bytesReceived += stats.bytesReceived;
|
||||||
|
//bytesSent += stats.bytesSent;
|
||||||
});
|
});
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -341,7 +341,6 @@ void State::buildRemote(ref<Store> destStore,
|
|||||||
*localStore,
|
*localStore,
|
||||||
step->drvPath,
|
step->drvPath,
|
||||||
resolvedDrv,
|
resolvedDrv,
|
||||||
buildOptions,
|
|
||||||
nrStepsBuilding
|
nrStepsBuilding
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -98,13 +98,6 @@ State::StepResult State::doBuildStep(nix::ref<Store> destStore,
|
|||||||
it). */
|
it). */
|
||||||
BuildID buildId;
|
BuildID buildId;
|
||||||
std::optional<StorePath> buildDrvPath;
|
std::optional<StorePath> buildDrvPath;
|
||||||
// Other fields set below
|
|
||||||
nix::ServeProto::BuildOptions buildOptions {
|
|
||||||
.maxLogSize = maxLogSize,
|
|
||||||
.nrRepeats = step->isDeterministic ? 1u : 0u,
|
|
||||||
.enforceDeterminism = step->isDeterministic,
|
|
||||||
.keepFailed = false,
|
|
||||||
};
|
|
||||||
|
|
||||||
auto conn(dbPool.get());
|
auto conn(dbPool.get());
|
||||||
|
|
||||||
@@ -139,18 +132,19 @@ State::StepResult State::doBuildStep(nix::ref<Store> destStore,
|
|||||||
{
|
{
|
||||||
auto i = jobsetRepeats.find(std::make_pair(build2->projectName, build2->jobsetName));
|
auto i = jobsetRepeats.find(std::make_pair(build2->projectName, build2->jobsetName));
|
||||||
if (i != jobsetRepeats.end())
|
if (i != jobsetRepeats.end())
|
||||||
buildOptions.nrRepeats = std::max(buildOptions.nrRepeats, i->second);
|
warn("jobset repeats is deprecated; nix stopped supporting this correctly a long time ago.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!build) build = *dependents.begin();
|
if (!build) build = *dependents.begin();
|
||||||
|
|
||||||
buildId = build->id;
|
buildId = build->id;
|
||||||
buildDrvPath = build->drvPath;
|
buildDrvPath = build->drvPath;
|
||||||
buildOptions.maxSilentTime = build->maxSilentTime;
|
settings.maxLogSize = maxLogSize;
|
||||||
buildOptions.buildTimeout = build->buildTimeout;
|
settings.maxSilentTime = build->maxSilentTime;
|
||||||
|
settings.buildTimeout = build->buildTimeout;
|
||||||
|
|
||||||
printInfo("performing step ‘%s’ %d times on ‘%s’ (needed by build %d and %d others)",
|
printInfo("performing step ‘%s’ %d times on ‘%s’ (needed by build %d and %d others)",
|
||||||
localStore->printStorePath(step->drvPath), buildOptions.nrRepeats + 1, machine->storeUri.render(), buildId, (dependents.size() - 1));
|
localStore->printStorePath(step->drvPath), 1, machine->storeUri.render(), buildId, (dependents.size() - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!buildOneDone)
|
if (!buildOneDone)
|
||||||
@@ -211,7 +205,7 @@ State::StepResult State::doBuildStep(nix::ref<Store> destStore,
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
/* FIXME: referring builds may have conflicting timeouts. */
|
/* FIXME: referring builds may have conflicting timeouts. */
|
||||||
buildRemote(destStore, machine, step, buildOptions, result, activeStep, updateStep, narMembers);
|
buildRemote(destStore, machine, step, result, activeStep, updateStep, narMembers);
|
||||||
} catch (Error & e) {
|
} catch (Error & e) {
|
||||||
if (activeStep->state_.lock()->cancelled) {
|
if (activeStep->state_.lock()->cancelled) {
|
||||||
printInfo("marking step %d of build %d as cancelled", stepNr, buildId);
|
printInfo("marking step %d of build %d as cancelled", stepNr, buildId);
|
||||||
|
|||||||
@@ -182,7 +182,7 @@ void State::monitorMachinesFile()
|
|||||||
getEnv("NIX_REMOTE_SYSTEMS").value_or(pathExists(defaultMachinesFile) ? defaultMachinesFile : ""), ":");
|
getEnv("NIX_REMOTE_SYSTEMS").value_or(pathExists(defaultMachinesFile) ? defaultMachinesFile : ""), ":");
|
||||||
|
|
||||||
if (machinesFiles.empty()) {
|
if (machinesFiles.empty()) {
|
||||||
parseMachines("localhost " +
|
parseMachines("ssh-ng://localhost " +
|
||||||
(settings.thisSystem == "x86_64-linux" ? "x86_64-linux,i686-linux" : settings.thisSystem.get())
|
(settings.thisSystem == "x86_64-linux" ? "x86_64-linux,i686-linux" : settings.thisSystem.get())
|
||||||
+ " - " + std::to_string(settings.maxBuildJobs) + " 1 "
|
+ " - " + std::to_string(settings.maxBuildJobs) + " 1 "
|
||||||
+ concatStringsSep(",", StoreConfig::getDefaultSystemFeatures()));
|
+ concatStringsSep(",", StoreConfig::getDefaultSystemFeatures()));
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
#include "store-api.hh"
|
#include "store-api.hh"
|
||||||
#include "sync.hh"
|
#include "sync.hh"
|
||||||
#include "nar-extractor.hh"
|
#include "nar-extractor.hh"
|
||||||
#include "legacy-ssh-store.hh"
|
#include "ssh-store.hh"
|
||||||
#include "machines.hh"
|
#include "machines.hh"
|
||||||
|
|
||||||
|
|
||||||
@@ -294,12 +294,12 @@ struct Machine : nix::Machine
|
|||||||
// Backpointer to the machine
|
// Backpointer to the machine
|
||||||
ptr machine;
|
ptr machine;
|
||||||
// Opened store
|
// Opened store
|
||||||
nix::ref<nix::LegacySSHStore> store;
|
nix::ref<nix::RemoteStore> store;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class HydraConfig;
|
struct HydraConfig;
|
||||||
|
|
||||||
|
|
||||||
class State
|
class State
|
||||||
@@ -542,7 +542,6 @@ private:
|
|||||||
|
|
||||||
void buildRemote(nix::ref<nix::Store> destStore,
|
void buildRemote(nix::ref<nix::Store> destStore,
|
||||||
Machine::ptr machine, Step::ptr step,
|
Machine::ptr machine, Step::ptr step,
|
||||||
const nix::ServeProto::BuildOptions & buildOptions,
|
|
||||||
RemoteResult & result, std::shared_ptr<ActiveStep> activeStep,
|
RemoteResult & result, std::shared_ptr<ActiveStep> activeStep,
|
||||||
std::function<void(StepState)> updateStep,
|
std::function<void(StepState)> updateStep,
|
||||||
NarMemberDatas & narMembers);
|
NarMemberDatas & narMembers);
|
||||||
|
|||||||
Reference in New Issue
Block a user