Setting
xxx-jobset-repeats = patchelf:master:2
will cause Hydra to perform every build step in the specified jobset 2 additional times (i.e. 3 times in total). Non-determinism is not fatal unless the derivation has the attribute "isDeterministic = true"; we just note the lack of determinism in the Hydra database. This will allow us to get stats about the (lack of) reproducibility of all of Nixpkgs.
EPWEMRI23UN6C777AL2GWEOXYZRTPEPFC2SZVZ4JTWUGYVFDL5XAC J5KJ6IICQGBJPFG4DU4A4LNX3GRAMEP7JZBOEE75IHOPQLDSQ4KAC 2DNPZFPNI2OM5FKYTC2KE5NKKKAP45AQ2VDDYLZZHCJ35X3EBJRQC EFWDY2V7ILJBFQ6NADBESYZTPHQBXKNO5N4DPNABL7X4XMNNTNYAC N4IROACVZ4MU73J5SM6WXJMKQSFR3VN5SOKENNNZNEGMTGB2Q3HAC 5AIYUMTBY6TFQTBRP3MJ2PYWUMRF57I77NIVWYE74UMEVQMBWZVQC BYVRA54QBKHLFOPIRBJKZZI7JYBYHSOK7MIA3TUZTALZQJGG3G7QC LVQXQIYA7QMLVYOANYEFHDBTFAOSE3D2IYAVOG2DXURTASRCUNYQC MHVIT4JYWUYD4UCGB2AHLXWLX6B5SYE22BREERNGANT7RGGDUFOAC NTEDD7T4M7XXYCWNZN57EJOEH3KI3UYMHOANV4MY2LSUPWX3JRDQC FCTX433OH7QIVWHXL23DKVSUKBQSLQTRK3PFCKKSMLX6A634456QC BG6PEOB2M2Y56QPVMELU7VNNCGNMSQ2K6ATBUCPJLKPLTDWNJQ5AC OPN3PED2P6WD54C53IAGD7IZUFSTJ6ZBHTKQ6L7MBKGSTMCQ55UAC FITVNQ2SVM6KSOF5P3HHWJYQ3WMQYDJGAONCBIZ7OF7CPXGMA36QC OBOTGFG63VKMKWE7AGSTNPDCJ42FGFDIVY6XYLJLS275Y7OE3FSQC 24BMQDZAWDQ7VNIA7TIROXSOYLOJBNZ2E4264WHWNJAEN6ZB3UOAC UNVMKJV5VX74A2MLS42AP3SY25HKQSH4S27Y44QFKRQRKPU2MV6QC 62MQPRXCZCP7ZQKOOAFU5V36P7DBS6RCFDYK53PDCFGI4FAOQWMQC KBZHIGLGHGLST5AZZDEJTYBJSQNE2XYNHEN2FN6XMAMY5BJYZR6QC V2UCCYN3B6266BDKGSXQDRSW4HKY673GINM3VI3MORXZ7OYDJBXAC PLOZBRTR6USSGJX7GR2RZKNPVYG2Q6QM7LW6IA35MKL63ZTQVD7QC HJOEIMLRDVQ2KZI5HGL2HKGBM3AHP7YIKGKDAGFUNKRUXVRB24NAC 7LWB2J2ZFB4XJDN5MBL2WDKVBRYQD7Y6RQU7LUYKH7PZTXK2H7KQC OG3Z3QGCG2FNDGF4VQYWOXLZCF7LGTZCUMGKUCBNAPAQ5FRFHQ2AC VQISTKOPNAEUS2K2F73CMNNLGZATWUYIURD5CSVNBNF7Q5ZF4PXQC EFWN7JBV7YIHNMCA6ZGFRSHZIUQJ2EX57SWYGVT7ZRJCHPIM2R3QC CLJQCY2XHIDNNMFBJ5PK3GQEN6RFALEFKXBJRWZPEIKR4PR5ZQ5AC UJOSXBZIZYRUNHMYJGMNG5WCV5DAAWATX3HOR4PSZEDOGKZJHQZAC PMNWRTGJ4GVSMSSAWSUD57B26PCRAHMZIQ5SIWJIK7A74ENKEQLAC PH3DFCNU2W73FSDAQHS3VXPA474NBQFH2MGL5U6V5VC6CHMQI43AC 2GUAKGTBTNFFER343SQWSLFYIXXHJLDSGH5JHF7QMC3AVZB7Q3TQC J5UVLXOK6EDIL5I7VKWH4V2QDS4DPD7FHRK6XBWSXFRQS4JKXFZQC NQ2X3Y4KHOZFC3BBWL5HD3DFC3CCKR72OOVON76MRRPE23ZDZMJQC 7LFMSF4K74AGUFI4RE2JYUUHYLSUXYRLUEILAOR56Q4S7TNSMZOQC UNVLTCV4FDU6ZQRIA7OG7LDI3ADMDSZ27NTR6JBV7JPKNTLA7P3QC TX7Q4RASUYPTHIHZFACQ227BIZYLNJGRA5HHIAFQWCL4FHEHVGPQC OCZ4LSGGSCMSLGC3C32D5JUYYHS5CIPOKOAMADEFAFZOFXJ3YY3AC U2X3Y53G6QFZFTINMADCGBGKZY3A4J4XNR2R2STUBDUOBIQW6YCAC N22GPKYTOLZLBGTGDATQDVZ4R5APZEAOIA7L32X4UXBH4XNI7MWAC 3E6IP3R3JGH76PNGG7RCADV65KOV24HQXPXNLVVYIQ46AVYJRG3AC D5QIOJGPKQJIYBUCSC3MFJ3TXLPNZ2XMI37GXMFRVRFWWR2VMTFAC if (GET_PROTOCOL_MINOR(remoteVersion) >= 3)// FIXME: make the number of repeats configurable.to << (step->isDeterministic ? 1 : 0);
if (GET_PROTOCOL_MINOR(remoteVersion) >= 3) {to << repeats // == build-repeat<< step->isDeterministic; // == enforce-determinism}
printMsg(lvlInfo, format("performing step ‘%1%’ on ‘%2%’ (needed by build %3% and %4% others)")% step->drvPath % machine->sshName % buildId % (dependents.size() - 1));
printInfo("performing step ‘%s’ %d times on ‘%s’ (needed by build %d and %d others)",step->drvPath, repeats + 1, machine->sshName, buildId, (dependents.size() - 1));
finishBuildStep(txn, result.startTime, result.stopTime, result.overhead, buildId,stepNr, machine->sshName, result.stepStatus, result.errorMsg);
finishBuildStep(txn, result, buildId, stepNr, machine->sshName);
finishBuildStep(txn, result.startTime, result.stopTime, result.overhead,buildId, stepNr, machine->sshName, result.stepStatus, result.errorMsg);
finishBuildStep(txn, result, buildId, stepNr, machine->sshName);
void State::finishBuildStep(pqxx::work & txn, time_t startTime, time_t stopTime, unsigned int overhead,BuildID buildId, unsigned int stepNr, const std::string & machine, BuildStatus status,const std::string & errorMsg, BuildID propagatedFrom)
void State::finishBuildStep(pqxx::work & txn, const RemoteResult & result,BuildID buildId, unsigned int stepNr, const std::string & machine)
("update BuildSteps set busy = 0, status = $1, propagatedFrom = $4, errorMsg = $5, startTime = $6, stopTime = $7, machine = $8, overhead = $9 where build = $2 and stepnr = $3")((int) status)(buildId)(stepNr)(propagatedFrom, propagatedFrom != 0)(errorMsg, errorMsg != "")(startTime)(stopTime)
("update BuildSteps set busy = 0, status = $1, errorMsg = $4, startTime = $5, stopTime = $6, machine = $7, overhead = $8, timesBuilt = $9, isNonDeterministic = $10 where build = $2 and stepnr = $3")((int) result.stepStatus)(buildId)(stepNr)(result.errorMsg, result.errorMsg != "")(result.startTime)(result.stopTime)
// FIXME: hacky mechanism for configuring determinism checks.for (auto & s : tokenizeString<Strings>(hydraConfig["xxx-jobset-repeats"])) {auto s2 = tokenizeString<std::vector<std::string>>(s, ":");if (s2.size() != 3) throw Error("bad value in xxx-jobset-repeats");jobsetRepeats.emplace(std::make_pair(s2[0], s2[1]), std::stoi(s2[2]));}
void finishBuildStep(pqxx::work & txn, time_t startTime, time_t stopTime,unsigned int overhead, BuildID buildId, unsigned int stepNr,const std::string & machine, BuildStatus status, const std::string & errorMsg = "",BuildID propagatedFrom = 0);
void finishBuildStep(pqxx::work & txn, const RemoteResult & result, BuildID buildId, unsigned int stepNr,const std::string & machine);
# Created by DBIx::Class::Schema::Loader v0.07043 @ 2016-02-16 18:04:52# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:TRALbEoaF/OIOyERYCyxkw
# Created by DBIx::Class::Schema::Loader v0.07045 @ 2016-12-07 13:48:19# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:3FYkqSUfgWmiqZzmX8J4TA
td.step-status span.warn {color: #aaaa00;font-weight: bold;}
alter table BuildStepsadd column timesBuilt integer,add column isNonDeterministic boolean;