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