1# Test ensures buildbot master comes up correctly and workers can connect
2
3{ system ? builtins.currentSystem,
4 config ? {},
5 pkgs ? import ../.. { inherit system config; }
6}:
7
8import ./make-test-python.nix {
9 name = "buildbot";
10
11 nodes = {
12 bbmaster = { pkgs, ... }: {
13 services.buildbot-master = {
14 enable = true;
15
16 # NOTE: use fake repo due to no internet in hydra ci
17 factorySteps = [
18 "steps.Git(repourl='git://gitrepo/fakerepo.git', mode='incremental')"
19 "steps.ShellCommand(command=['bash', 'fakerepo.sh'])"
20 ];
21 changeSource = [
22 "changes.GitPoller('git://gitrepo/fakerepo.git', workdir='gitpoller-workdir', branch='master', pollinterval=300)"
23 ];
24 };
25 networking.firewall.allowedTCPPorts = [ 8010 8011 9989 ];
26 environment.systemPackages = with pkgs; [ git buildbot-full ];
27 };
28
29 bbworker = { pkgs, ... }: {
30 services.buildbot-worker = {
31 enable = true;
32 masterUrl = "bbmaster:9989";
33 };
34 environment.systemPackages = with pkgs; [ git buildbot-worker ];
35 };
36
37 gitrepo = { pkgs, ... }: {
38 services.openssh.enable = true;
39 networking.firewall.allowedTCPPorts = [ 22 9418 ];
40 environment.systemPackages = with pkgs; [ git ];
41 systemd.services.git-daemon = {
42 description = "Git daemon for the test";
43 wantedBy = [ "multi-user.target" ];
44 after = [ "network.target" "sshd.service" ];
45
46 serviceConfig.Restart = "always";
47 path = with pkgs; [ coreutils git openssh ];
48 environment = { HOME = "/root"; };
49 preStart = ''
50 git config --global user.name 'Nobody Fakeuser'
51 git config --global user.email 'nobody\@fakerepo.com'
52 rm -rvf /srv/repos/fakerepo.git /tmp/fakerepo
53 mkdir -pv /srv/repos/fakerepo ~/.ssh
54 ssh-keyscan -H gitrepo > ~/.ssh/known_hosts
55 cat ~/.ssh/known_hosts
56
57 mkdir -p /src/repos/fakerepo
58 cd /srv/repos/fakerepo
59 rm -rf *
60 git init
61 echo -e '#!/bin/sh\necho fakerepo' > fakerepo.sh
62 cat fakerepo.sh
63 touch .git/git-daemon-export-ok
64 git add fakerepo.sh .git/git-daemon-export-ok
65 git commit -m fakerepo
66 '';
67 script = ''
68 git daemon --verbose --export-all --base-path=/srv/repos --reuseaddr
69 '';
70 };
71 };
72 };
73
74 testScript = ''
75 gitrepo.wait_for_unit("git-daemon.service")
76 gitrepo.wait_for_unit("multi-user.target")
77
78 with subtest("Repo is accessible via git daemon"):
79 bbmaster.wait_for_unit("network-online.target")
80 bbmaster.succeed("rm -rfv /tmp/fakerepo")
81 bbmaster.succeed("git clone git://gitrepo/fakerepo /tmp/fakerepo")
82
83 with subtest("Master service and worker successfully connect"):
84 bbmaster.wait_for_unit("buildbot-master.service")
85 bbmaster.wait_until_succeeds("curl --fail -s --head http://bbmaster:8010")
86 bbworker.wait_for_unit("network-online.target")
87 bbworker.succeed("nc -z bbmaster 8010")
88 bbworker.succeed("nc -z bbmaster 9989")
89 bbworker.wait_for_unit("buildbot-worker.service")
90
91 with subtest("Stop buildbot worker"):
92 bbmaster.succeed("systemctl -l --no-pager status buildbot-master")
93 bbmaster.succeed("systemctl stop buildbot-master")
94 bbworker.fail("nc -z bbmaster 8010")
95 bbworker.fail("nc -z bbmaster 9989")
96 bbworker.succeed("systemctl -l --no-pager status buildbot-worker")
97 bbworker.succeed("systemctl stop buildbot-worker")
98
99 with subtest("Buildbot daemon mode works"):
100 bbmaster.succeed(
101 "buildbot create-master /tmp",
102 "mv -fv /tmp/master.cfg.sample /tmp/master.cfg",
103 "sed -i 's/8010/8011/' /tmp/master.cfg",
104 "buildbot start /tmp",
105 "nc -z bbmaster 8011",
106 )
107 bbworker.wait_until_succeeds("curl --fail -s --head http://bbmaster:8011")
108 bbmaster.wait_until_succeeds("buildbot stop /tmp")
109 bbworker.fail("nc -z bbmaster 8011")
110 '';
111
112 meta.maintainers = with pkgs.lib.maintainers; [ ];
113} {}