add ci module
This commit is contained in:
parent
10135cbeac
commit
9bd3dd54c3
162
krebs/3modules/ci.nix
Normal file
162
krebs/3modules/ci.nix
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
with import <stockholm/lib>;
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.krebs.ci;
|
||||||
|
|
||||||
|
out = {
|
||||||
|
options.krebs.ci = api;
|
||||||
|
config = lib.mkIf cfg.enable imp;
|
||||||
|
};
|
||||||
|
|
||||||
|
api = {
|
||||||
|
enable = mkEnableOption "Enable krebs ci service";
|
||||||
|
repos = mkOption {
|
||||||
|
type = types.attrsOf (types.submodule ({ config, ...}: {
|
||||||
|
options = {
|
||||||
|
urls = mkOption {
|
||||||
|
type = types.listOf types.str;
|
||||||
|
default = [ "git@localhost:${config._module.args.name}" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
hostname = config.networking.hostName;
|
||||||
|
getJobs = pkgs.writeDash "get_jobs" ''
|
||||||
|
nix-build --no-out-link ./ci.nix 2>&1 > /dev/null
|
||||||
|
nix-instantiate --eval --strict --json ./ci.nix
|
||||||
|
'';
|
||||||
|
|
||||||
|
imp = {
|
||||||
|
krebs.buildbot.master = {
|
||||||
|
slaves = {
|
||||||
|
testslave = "lasspass";
|
||||||
|
};
|
||||||
|
|
||||||
|
change_source = mapAttrs' (name: repo:
|
||||||
|
nameValuePair name (concatMapStrings (url: ''
|
||||||
|
cs.append(
|
||||||
|
changes.GitPoller(
|
||||||
|
"${url}",
|
||||||
|
workdir='${name}-${elemAt(splitString "." url) 1}', branches=True,
|
||||||
|
project='${name}',
|
||||||
|
pollinterval=10
|
||||||
|
)
|
||||||
|
)
|
||||||
|
'') repo.urls)
|
||||||
|
) cfg.repos;
|
||||||
|
|
||||||
|
scheduler = mapAttrs' (name: repo:
|
||||||
|
nameValuePair name ''
|
||||||
|
sched.append(
|
||||||
|
schedulers.SingleBranchScheduler(
|
||||||
|
change_filter=util.ChangeFilter(branch_re=".*"),
|
||||||
|
treeStableTimer=60,
|
||||||
|
name="build-all-branches",
|
||||||
|
builderNames=[
|
||||||
|
"${name}",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
sched.append(
|
||||||
|
schedulers.ForceScheduler(
|
||||||
|
name="${name}",
|
||||||
|
builderNames=[
|
||||||
|
"${name}",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
''
|
||||||
|
) cfg.repos;
|
||||||
|
builder_pre = ''
|
||||||
|
from buildbot import interfaces
|
||||||
|
from buildbot.steps.shell import ShellCommand
|
||||||
|
|
||||||
|
class StepToStartMoreSteps(ShellCommand):
|
||||||
|
def __init__(self, **kwargs):
|
||||||
|
ShellCommand.__init__(self, **kwargs)
|
||||||
|
|
||||||
|
def addBuildSteps(self, steps_factories):
|
||||||
|
for sf in steps_factories:
|
||||||
|
step = interfaces.IBuildStepFactory(sf).buildStep()
|
||||||
|
step.setBuild(self.build)
|
||||||
|
step.setBuildSlave(self.build.slavebuilder.slave)
|
||||||
|
step_status = self.build.build_status.addStepWithName(step.name)
|
||||||
|
step.setStepStatus(step_status)
|
||||||
|
self.build.steps.append(step)
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
props = self.build.getProperties()
|
||||||
|
new_steps = json.loads(props.getProperty('steps_json'))
|
||||||
|
for new_step in new_steps:
|
||||||
|
self.addBuildSteps([steps.ShellCommand(
|
||||||
|
name=str(new_step),
|
||||||
|
command=[
|
||||||
|
new_steps[new_step]
|
||||||
|
],
|
||||||
|
timeout=90001,
|
||||||
|
workdir='build', # TODO figure out why we need this?
|
||||||
|
)])
|
||||||
|
|
||||||
|
ShellCommand.start(self)
|
||||||
|
|
||||||
|
'';
|
||||||
|
|
||||||
|
builder = mapAttrs' (name: repo:
|
||||||
|
nameValuePair name ''
|
||||||
|
f_${name} = util.BuildFactory()
|
||||||
|
f_${name}.addStep(steps.Git(
|
||||||
|
repourl=util.Property('repository', '${head repo.urls}'),
|
||||||
|
mode='full',
|
||||||
|
submodules=True,
|
||||||
|
))
|
||||||
|
|
||||||
|
f_${name}.addStep(steps.SetPropertyFromCommand(
|
||||||
|
env={
|
||||||
|
"NIX_REMOTE": "daemon",
|
||||||
|
"NIX_PATH": "secrets=/var/src/stockholm/null:/var/src",
|
||||||
|
},
|
||||||
|
name="get_steps",
|
||||||
|
command=["${getJobs}"],
|
||||||
|
property="steps_json"
|
||||||
|
))
|
||||||
|
f_${name}.addStep(StepToStartMoreSteps(command=["echo"])) # TODO remove dummy command from here
|
||||||
|
|
||||||
|
bu.append(
|
||||||
|
util.BuilderConfig(
|
||||||
|
name="${name}",
|
||||||
|
slavenames=slavenames,
|
||||||
|
factory=f_${name}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
''
|
||||||
|
) cfg.repos;
|
||||||
|
|
||||||
|
enable = true;
|
||||||
|
web.enable = true;
|
||||||
|
irc = {
|
||||||
|
enable = true;
|
||||||
|
nick = "build|${hostname}";
|
||||||
|
server = "irc.r";
|
||||||
|
channels = [ "noise" ];
|
||||||
|
allowForce = true;
|
||||||
|
};
|
||||||
|
extraConfig = ''
|
||||||
|
c['buildbotURL'] = "http://build.${hostname}.r/"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
krebs.buildbot.slave = {
|
||||||
|
enable = true;
|
||||||
|
masterhost = "localhost";
|
||||||
|
username = "testslave";
|
||||||
|
password = "lasspass";
|
||||||
|
packages = with pkgs; [ gnumake jq nix populate gnutar lzma gzip ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
in out
|
||||||
|
|
@ -13,6 +13,7 @@ let
|
|||||||
./buildbot/master.nix
|
./buildbot/master.nix
|
||||||
./buildbot/slave.nix
|
./buildbot/slave.nix
|
||||||
./build.nix
|
./build.nix
|
||||||
|
./ci.nix
|
||||||
./current.nix
|
./current.nix
|
||||||
./exim.nix
|
./exim.nix
|
||||||
./exim-retiolum.nix
|
./exim-retiolum.nix
|
||||||
|
Loading…
Reference in New Issue
Block a user