rusty-ci 0.9.6

A tool to generate buildbot projects from a YAML file
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
<!DOCTYPE HTML>
<html lang="en" class="sidebar-visible no-js">
    <head>
        <!-- Book generated using mdBook -->
        <meta charset="UTF-8">
        <title>Rusty-CI</title>
        
        <meta name="robots" content="noindex" />
        

        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="theme-color" content="#ffffff" />

        <link rel="shortcut icon" href="favicon.png">
        <link rel="stylesheet" href="css/variables.css">
        <link rel="stylesheet" href="css/general.css">
        <link rel="stylesheet" href="css/chrome.css">
        <link rel="stylesheet" href="css/print.css" media="print">

        <!-- Fonts -->
        <link rel="stylesheet" href="FontAwesome/css/font-awesome.css">
        <link href="https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800" rel="stylesheet" type="text/css">
        <link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:500" rel="stylesheet" type="text/css">

        <!-- Highlight.js Stylesheets -->
        <link rel="stylesheet" href="highlight.css">
        <link rel="stylesheet" href="tomorrow-night.css">
        <link rel="stylesheet" href="ayu-highlight.css">

        <!-- Custom theme stylesheets -->
        

        
    </head>
    <body class="light">
        <!-- Provide site root to javascript -->
        <script type="text/javascript">
            var path_to_root = "";
            var default_theme = "light";
        </script>

        <!-- Work around some values being stored in localStorage wrapped in quotes -->
        <script type="text/javascript">
            try {
                var theme = localStorage.getItem('mdbook-theme');
                var sidebar = localStorage.getItem('mdbook-sidebar');

                if (theme.startsWith('"') && theme.endsWith('"')) {
                    localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
                }

                if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
                    localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
                }
            } catch (e) { }
        </script>

        <!-- Set the theme before any content is loaded, prevents flash -->
        <script type="text/javascript">
            var theme;
            try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
            if (theme === null || theme === undefined) { theme = default_theme; }
            document.body.className = theme;
            document.querySelector('html').className = theme + ' js';
        </script>

        <!-- Hide / unhide sidebar before it is displayed -->
        <script type="text/javascript">
            var html = document.querySelector('html');
            var sidebar = 'hidden';
            if (document.body.clientWidth >= 1080) {
                try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
                sidebar = sidebar || 'visible';
            }
            html.classList.remove('sidebar-visible');
            html.classList.add("sidebar-" + sidebar);
        </script>

        <nav id="sidebar" class="sidebar" aria-label="Table of contents">
            <div class="sidebar-scrollbox">
                <ol class="chapter"><li><a href="introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li><a href="installation.html"><strong aria-hidden="true">2.</strong> Installation</a></li><li><a href="usage/usage.html"><strong aria-hidden="true">3.</strong> Usage</a></li><li><ol class="section"><li><a href="usage/help.html"><strong aria-hidden="true">3.1.</strong> Help Subcommand</a></li><li><a href="usage/setup.html"><strong aria-hidden="true">3.2.</strong> Setup Subcommand</a></li><li><a href="usage/install.html"><strong aria-hidden="true">3.3.</strong> Install Subcommand</a></li><li><a href="usage/build.html"><strong aria-hidden="true">3.4.</strong> Build Subcommand</a></li><li><a href="usage/start.html"><strong aria-hidden="true">3.5.</strong> Start Subcommand</a></li><li><a href="usage/stop.html"><strong aria-hidden="true">3.6.</strong> Stop Subcommand</a></li></ol></li><li><a href="yaml.html"><strong aria-hidden="true">4.</strong> Input YAML</a></li><li><a href="tldr.html"><strong aria-hidden="true">5.</strong> Too Long, Didn't Read</a></li></ol>
            </div>
            <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div>
        </nav>

        <div id="page-wrapper" class="page-wrapper">

            <div class="page">
                
                <div id="menu-bar" class="menu-bar">
                    <div id="menu-bar-sticky-container">
                        <div class="left-buttons">
                            <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
                                <i class="fa fa-bars"></i>
                            </button>
                            <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
                                <i class="fa fa-paint-brush"></i>
                            </button>
                            <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
                                <li role="none"><button role="menuitem" class="theme" id="light">Light (default)</button></li>
                                <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
                                <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
                                <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
                                <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
                            </ul>
                            
                            <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
                                <i class="fa fa-search"></i>
                            </button>
                            
                        </div>

                        <h1 class="menu-title">Rusty-CI</h1>

                        <div class="right-buttons">
                            <a href="print.html" title="Print this book" aria-label="Print this book">
                                <i id="print-button" class="fa fa-print"></i>
                            </a>
                            
                        </div>
                    </div>
                </div>

                
                <div id="search-wrapper" class="hidden">
                    <form id="searchbar-outer" class="searchbar-outer">
                        <input type="search" name="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
                    </form>
                    <div id="searchresults-outer" class="searchresults-outer hidden">
                        <div id="searchresults-header" class="searchresults-header"></div>
                        <ul id="searchresults">
                        </ul>
                    </div>
                </div>
                

                <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
                <script type="text/javascript">
                    document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
                    document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
                    Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
                        link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
                    });
                </script>

                <div id="content" class="content">
                    <main>
                        <h1><a class="header" href="#introduction" id="introduction">Introduction</a></h1>
<h2><a class="header" href="#what-is-rusty-ci" id="what-is-rusty-ci">What is Rusty-CI?</a></h2>
<p>Rusty-CI is just a user interface for <a href="https://buildbot.net">buildbot</a>. Instead of having to write the Python for your CI project to get the versatility you want, just fill out Rusty-CI's template YAML file and it'll do the rest for you.</p>
<h2><a class="header" href="#suggestions" id="suggestions">Suggestions</a></h2>
<p>I highly recommend running this in some sort of container.
All features of Rusty-CI are tested using fresh Ubuntu 18.04 linux containers.</p>
<h2><a class="header" href="#usage" id="usage">Usage</a></h2>
<p>Here is the template YAML file that Rusty-CI will output for you to fill out with your own data.</p>
<p>It explains itself for the most part, but I'll be covering it in more detail in a later chapter.</p>
<pre><code class="language-yaml"># The required of Rusty-CI to build this CI
requires: x.x.x

# This section holds data specific to the master of the workers
master:
  # The title subsection of the master holds the title of your web gui
  title: &quot;Rusty-CI&quot;
  title-url: &quot;https://github.com/adam-mcdaniel/rusty-ci&quot;

  # This is the ip of the web-gui
  webserver-ip: localhost

  # This is the port of the web-gui
  webserver-port: 8010

  # The address of your repository
  repo: &quot;https://github.com/adam-mcdaniel/rusty-ci&quot;

  # The number of seconds to wait before checking for updates on your repository
  # Two minutes is a good poll interval
  poll-interval: 120

# This section holds data specific to the handler that will look for
# pull requests / merge requests on your repository
merge-request-handler:
  # This is basically the website you're using for version control
  # Right now, github and gitlab are the only supported sites
  # If you're using an unsupported version control system, no worries,
  # rusty-ci just wont run on pull requests.
  version-control-system: github
  # The username of the owner of the repository
  owner: adam-mcdaniel

  # The name of the repository
  repo-name: rusty-ci

  # You dont want to run arbitrary code on your machine when anyone
  # makes a pull request. Rusty-CI will not test anyone's pull request
  # if their username is not in this list.
  # Note that this has no effect on GitLab merge request building!
  # Rusty-CI will only build merge requests from a branch
  # thats already inside the repository.
  whitelist:
    - adam-mcdaniel


# This section holds each worker
# You can have as many workers as youd like, just be sure to fill out
# each of their fields out properly.
workers:
  # The name of this worker is `test-worker`
  test-worker:
    # The ip of the master
    master-ip: localhost
    # The worker's files will be installed in this directory.
    # This can also be an absolute path
    working-dir: 'test-worker'


# This section holds each scheduler.
# Like the workers section, you may have as many schedulers as youd like.
schedulers:
  # Create a scheduler named `ci-change`
  # This scheduler will trigger the `rusty-ci-test` builder whenever it
  # detects a change in a yaml file for any branch.
  ci-change:
    # This scheduler triggers the `rusty-ci-test` builder.
    # You can put as many builders as youd like here, and the scheduler will start them all.
    builders:
      - rusty-ci-test

    # This will make the current scheduler run if the &quot;your-scheduler-name-here&quot;
    # has run successfully. You can only put one scheduler name in this section.
    # depends: &quot;your-scheduler-name-here&quot;
    # IF YOU USE THE `depends` SECTION, YOU SHOULD REMOVE OR COMMENT THE FOLLOWING SECTIONS
    # Using the depends section will ignore the `branch`, `triggers`, and `password` sections

    # This is a regular expression that matches a branch.
    # If there is a change in a branch whos name matches this regex,
    # it will be checked by the following triggers section.
    # THIS WILL ONLY USE THE FIRST REGULAR EXPRESSION IN THIS SECTION TO MATCH THE BRANCH
    branch: &quot;.*&quot;
    # If a change has occurred in a branch that matches the regex in the branch section,
    # Then the files that were changed are matched against the regular expressions in the
    # triggers section. You can have any number of regular expressions in the triggers section.
    # If any one of them matches the name of a file that was changed in a matched branch,
    # then the builders in this scheduler's `builders` section are executed.
    triggers:
      - '.*\.yaml'
      - '.*\.sh'
      - &quot;.*Makefile&quot;
    # The password a whitelisted user can comment on a merge / pull request
    # to mark it for testing; that is if the pull request was made by a non-whitelisted
    # user. If the pull request was made by a whitelisted user, it is automatically run.
    password: &quot;ok to test&quot;

# These are the builders that are executed by the schedulers
# Each has its own specific task that is delegated to one or more workers
# When a builder is run, its script is run on the command line.
# You can have as many builders as youd like as well.
builders:
  # The name of the builder is `rusty-ci-test`
  rusty-ci-test:
    # This is the shell script that the workers will run when this builder is executed
    # You can have as many instructions as youd like
    # Mind you, you cannot use the |, &gt;, &lt;, &gt;&gt;, &lt;&lt;, etc. operators. Sadly, buildbot
    # passes each item separated by whitespace as another parameter to function.
    script:
      - echo Hello world!
      - echo Im an instruction in a script!
    # These are the workers to delegate this build job to
    workers:
      - test-worker
    # The repo to refresh from before running
    repo: &quot;https://github.com/adam-mcdaniel/rusty-ci&quot;
</code></pre>
<h1><a class="header" href="#installation" id="installation">Installation</a></h1>
<h3><a class="header" href="#install-python3" id="install-python3">Install Python3</a></h3>
<p>You're gonna need <a href="https://www.python.org/">python3</a> to use Rusty-CI.</p>
<p>To install on a *nix system, run the following commands.</p>
<pre><code class="language-bash">apt update -y &amp;&amp; apt upgrade -y
apt install -y build-essential python3-dev python3-pip python3-venv
</code></pre>
<p>You will need to be able to use <code>python3 -m pip</code> and <code>python3 -m venv</code>.</p>
<h3><a class="header" href="#install-rust" id="install-rust">Install Rust</a></h3>
<p>To install Rusty-CI, you must install Rust.
You if you're on a Unix like platform, can do so by running this shell command.</p>
<pre><code class="language-bash">curl https://sh.rustup.rs -sSf | sh
</code></pre>
<p>If you're on Windows, go to the <a href="https://rust-lang.org">rust website</a>. You'll need to download <code>rust-init.exe</code> and follow its instructions.</p>
<h3><a class="header" href="#install-rusty-ci-from-cratesio-package-registry-recommended" id="install-rusty-ci-from-cratesio-package-registry-recommended">Install Rusty-CI from Crates.io Package Registry (recommended)</a></h3>
<p>Now that you have Rust, you should be able to install Rusty-CI by running the following command.</p>
<pre><code class="language-bash">cargo install -f rusty-ci
</code></pre>
<p>This will automatically add Rusty-CI to your path, so we should be all done!</p>
<h3><a class="header" href="#build-from-source-not-recommended" id="build-from-source-not-recommended">Build from source (not recommended)</a></h3>
<p>If you don't want to install Rusty-CI from the package registry, you can always build Rusty-CI from source. Here's how you would do so.</p>
<pre><code class="language-bash">git clone https://github.com/adam-mcdaniel/rusty-ci

cd rusty-ci
# Cargo will output the executable to ./target/release/rusty-ci
cargo install -f --path .
</code></pre>
<p>This will automatically add Rusty-CI to your path, so we should be all done!</p>
<h3><a class="header" href="#problems-installing" id="problems-installing">Problems Installing?</a></h3>
<p>If you run into some problems installing Rusty-CI, or if Rust can't find <code>cc</code>, you need to upgrade some of the packages on your system.</p>
<p>Here's the commands I run to solve these errors.</p>
<pre><code class="language-bash">apt update -y &amp;&amp; apt upgrade -y
sudo apt install build-essential
</code></pre>
<p>After running these commands, try running <code>cargo install rusty-ci</code> again.</p>
<h3><a class="header" href="#cant-find-cargo-or-rusty-ci" id="cant-find-cargo-or-rusty-ci">Can't find Cargo or Rusty-CI?</a></h3>
<p>Try running the following to add Cargo and your installed crates to your environment's path.</p>
<pre><code class="language-bash">source $HOME/.cargo/env # Add `cargo` to your path
</code></pre>
<h3><a class="header" href="#still-having-problems" id="still-having-problems">Still having problems?</a></h3>
<p>If you're still having some serious problems, <a href="https://github.com/adam-mcdaniel/rusty-ci/issues">post an issue</a> on the repository.</p>
<h1><a class="header" href="#usage-1" id="usage-1">Usage</a></h1>
<p>This chapter covers</p>
<ul>
<li>The features and usage of the <code>rusty-ci</code> executable</li>
<li>How to properly use the input YAML files for <code>rusty-ci</code></li>
</ul>
<h1><a class="header" href="#help-subcommand" id="help-subcommand">Help Subcommand</a></h1>
<p>Rusty-CI has several subcommands, the first of which is the <code>help</code> subcommand.
To run the help subcommand, run <code>rusty-ci help</code> or alternatively <code>rusty-ci</code>.
If you dont provide any arguments to <code>rusty-ci</code>, it will print the help message by default.</p>
<pre><code>rusty_ci x.x.x
Adam McDaniel &lt;adam.mcdaniel17@gmail.com&gt;
A continuous integration tool written in Rust

USAGE:
    rusty-ci [SUBCOMMAND]

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

SUBCOMMANDS:
    build      Build rusty-ci from YAML file(s)
    help       Prints this message or the help of the given subcommand(s)
    install    Install buildbot
    rebuild    Build and restart rusty-ci from input YAML file(s)
    setup      Output a template YAML files for you to change to customize
    start      Launch rusty-ci from an input YAML file
    stop       Stop rusty-ci

To start a project, run the `setup` subcommand.
Be sure to follow the instructions after each subcommand very carefully!
</code></pre>
<p>This tells you more about the program, but it doesn't go into any depth.
Let me explain each subcommand individually.</p>
<h1><a class="header" href="#setup-subcommand" id="setup-subcommand">Setup Subcommand</a></h1>
<p>The setup command is very simple. All it does is write template YAML files for building your CI and controlling email notifications to any paths you'd like.</p>
<pre><code>$ ./rusty-ci setup template.yaml mail.yaml
==[INFO]===&gt; Writing template master yaml file to template.yaml...
==[INFO]===&gt; Writing template mail yaml file to mail.yaml...
==[INFO]===&gt; All done!
==[INFO]===&gt; Next, run the `install` subcommand command using either the `bash` or `make` flag
</code></pre>
<pre><code>$ more template.yaml

# The required of Rusty-CI to build this CI
requires: x.x.x

# This section holds data specific to the master of the workers
master:
  # The title subsection of the master holds the title of your web gui
  title: &quot;Rusty-CI&quot;
  title-url: &quot;https://github.com/adam-mcdaniel/rusty-ci&quot;

  # This is the ip of the web-gui
  webserver-ip: localhost

  # This is the port of the web-gui
  webserver-port: 8010

  # The address of your repository
  repo: &quot;https://github.com/adam-mcdaniel/rusty-ci&quot;

  # The number of seconds to wait before checking for updates on your repository
  # Two minutes is a good poll interval
  poll-interval: 120

# This section holds data specific to the handler that will look for
# pull requests / merge requests on your repository
merge-request-handler:
  # This is basically the website you're using for version control
...
</code></pre>
<pre><code>$ more mail.yaml

# Rusty-CI will automatically email &quot;interested users&quot; about
# all tests that run. The list of &quot;interested users&quot; is the
# list of people who have a commit in the branch or pull request.

# The extra recipients to email
extra-recipients:
  # Emails under the failure section will be emailed
  # info about every failed build
  failure:
    - failure@gmail.com
  # Emails under the success section will be emailed
  # info about every successful build
  success:
    - success@gmail.com
  # Emails under the all section will be emailed
  # info about every build
  all:
    - all_tests@gmail.com


# The &quot;from&quot; email address used to send email updates to recipients
from-address: your-email-here@gmail.com

# The suffix to add to the interested users' usernames
# to get an email we can send updates to.
lookup: gmail.com

# The smtp relay hostname (self explanatory)
# gmail's smtp relay hostname is `smtp.gmail.com`
smtp-relay-host: smtp.gmail.com

# The smtp relay port (self explanatory)
# 587 is the smtp port that `smtp.gmail.com` uses
smtp-port: 587

# The password used to login to the &quot;from&quot; email address account
smtp-password: &quot;p@$$w0rd&quot;
</code></pre>
<p>When the setup command is finished, run the <code>install</code> subcommand.</p>
<h1><a class="header" href="#install-subcommand" id="install-subcommand">Install Subcommand</a></h1>
<p>The <code>install</code> subcommand is responsible for installing Rusty-CI's dependencies. When you run the install subcommand, it will output a bash script that uses your existing <a href="https://www.python.org/">python3</a> installation to install <a href="https://buildbot.net/">buildbot</a> and its dependencies.</p>
<p>You can also choose to output a makefile instead of a bash script, but it's not really necessary.</p>
<h2><a class="header" href="#usage-2" id="usage-2">Usage</a></h2>
<p>To output a Makefile for installation, run one of the following commands.</p>
<pre><code class="language-bash"># Output an install makefile
rusty-ci install --make

# Identical
rusty-ci install -m

# Run the makefile to install
make
</code></pre>
<p>To output a bash script for installation, run one of the following commands.</p>
<pre><code class="language-bash"># Output an install shell script
rusty-ci install

# Identical
rusty-ci install --bash

# Make the shell script executable
chmod +x ./install.sh

# Run the install script
./install.sh
</code></pre>
<p>If you do decide to either the bash or make buildsystems, be sure to read <code>rusty-ci</code>'s output and follow any instructions given.</p>
<pre><code>$ rusty-ci install

==[INFO]===&gt; Installing dependencies for rusty-ci...
Do you already have python3-dev, python3-pip, and python3-venv installed? (y/n) y
==[INFO]===&gt; Writing install file to `./install.sh`
==[INFO]===&gt; Successfully wrote install file
==[WARN]===&gt; To install dependencies run `install.sh`
==[WARN]===&gt; Before building from a YAML file, be sure to run `. venv/bin/activate`
==[INFO]===&gt; Next, write your VCS's api token to 'auth.token', and then run the `build` subcommand
Successfully finished install
</code></pre>
<p>Now, get an access token from your version control system, and write it to a file named <code>auth.token</code>. Next, run the move on to the <code>build</code> subcommand.</p>
<h1><a class="header" href="#build-subcommand" id="build-subcommand">Build Subcommand</a></h1>
<p>The <code>build</code> subcommand is responsible for constructing the buildbot master, the buildbot workers, and their respective configuration files from a YAML file.</p>
<pre><code>rusty-ci-build x.x.x
Adam McDaniel &lt;adam.mcdaniel17@gmail.com&gt;
Build rusty-ci from YAML file(s)

USAGE:
    rusty-ci build [FLAGS] [OPTIONS] &lt;MASTER_YAML&gt;

FLAGS:
    -h, --help       Prints help information
    -q, --quiet      Don't ask user anything
    -V, --version    Prints version information

OPTIONS:
    -m, --mail &lt;MAIL_YAML&gt;    The path to the YAML file dedicated to SMTP authentication info for sending email
                              notifications

ARGS:
    &lt;MASTER_YAML&gt;    The path to the master YAML file
</code></pre>
<h2><a class="header" href="#usage-3" id="usage-3">Usage</a></h2>
<!-- Before you build your YAML file, you need to get an API or authentication token from your respective Version Control System, and write it to `auth.token`. This is so the output buildbot project has access to push commit statuses to your repository, and other things like that. -->
<p>First, confirm that you're inside your python virtual environment.</p>
<pre><code class="language-bash">. venv/bin/activate
</code></pre>
<p>To build from a YAML file, simply run this command.</p>
<pre><code class="language-bash">rusty-ci build template.yaml
</code></pre>
<p>If you want to build your CI with support for email notifications, run it like so.</p>
<pre><code class="language-bash">rusty-ci build template.yaml --mail mail.yaml
# is identical to the following
rusty-ci build template.yaml -m mail.yaml
</code></pre>
<p>Now, run the start subcommand.</p>
<h1><a class="header" href="#start-subcommand" id="start-subcommand">Start Subcommand</a></h1>
<h2><a class="header" href="#usage-4" id="usage-4">Usage</a></h2>
<p>After running all the other rusty-ci subcommands, run</p>
<pre><code class="language-bash">rusty-ci start template.yaml
</code></pre>
<p>This will kill the master and workers that were previously running, and start new instances of them.</p>
<p>Now, to view your web gui, go to <a href="http://localhost:8010">http://localhost:8010</a>.</p>
<p>If you want to RESTART your CI without killing it, use the following subcommand instead.</p>
<pre><code class="language-bash">rusty-ci rebuild template.yaml mail.yaml
</code></pre>
<p>This will not start your CI if it hasn't already been started!</p>
<h2><a class="header" href="#not-working" id="not-working">Not working?</a></h2>
<p>Confirm you're in your python virtual environment!</p>
<p>If your web gui isn't loading, buildbot probably failed to start the master, or you put the wrong IP in the master section of your YAML file.</p>
<p>You probably just forgot to change the path to one of your worker's working directories, though.</p>
<p>To see the log for the master, run <code>tail -f master/twistd.log</code>.</p>
<p>If you see an exception, then the master ran into an error. This error will most likely be self explanatory and easy to debug, but in the case that it isn't, go to the <a href="https://buildbot.net">buildbot website</a>.</p>
<h1><a class="header" href="#stop-subcommand" id="stop-subcommand">Stop Subcommand</a></h1>
<h2><a class="header" href="#usage-5" id="usage-5">Usage</a></h2>
<p>First, confirm you're in your python virtual environment.</p>
<p>If you want to kill your CI and all of its processes, run the following.</p>
<pre><code class="language-bash">rusty-ci stop
</code></pre>
<p>This will kill Rusty-CI and all other python(3) processes!</p>
<h1><a class="header" href="#input-yaml" id="input-yaml">Input YAML</a></h1>
<p>The input YAML file is pretty simple, but here's an explanation of each section individually.</p>
<h2><a class="header" href="#the-requires-section" id="the-requires-section">The requires section</a></h2>
<p>The requires section declares the minimum required Rusty-CI version to build this CI.</p>
<pre><code class="language-yaml">requires: x.x.x
</code></pre>
<h2><a class="header" href="#the-master-section" id="the-master-section">The master section</a></h2>
<p>The master section contains the data that controls the master, the bot that controls the workers.</p>
<pre><code class="language-yaml"># This section holds data specific to the master of the workers
master:
  # The title subsection of the master holds the title of your web gui
  title: &quot;Rusty-CI&quot;
  title-url: &quot;https://github.com/adam-mcdaniel/rusty-ci&quot;

  # This is the ip of the web-gui
  webserver-ip: localhost

  # This is the port of the web-gui
  webserver-port: 8010

  # The address of your repository
  repo: &quot;https://github.com/adam-mcdaniel/rusty-ci&quot;

  # The number of seconds to wait before checking for updates on your repository
  # Two minutes is a good poll interval
  poll-interval: 120
</code></pre>
<h2><a class="header" href="#the-merge-request-handler-section" id="the-merge-request-handler-section">The merge-request-handler section</a></h2>
<p>The merge-request-handler section holds information that determines how <code>buildbot</code> will handle merge and pull requests on your repository.</p>
<p>Right now, this is only supported for <code>github.com</code>.</p>
<pre><code class="language-yaml"># This section holds data specific to the handler that will look for
# pull requests / merge requests on your repository
merge-request-handler:
  # This is basically the website you're using for version control
  # Right now, github and gitlab are the only supported sites
  # If you're using an unsupported version control system, no worries,
  # rusty-ci just wont run on pull requests.
  version-control-system: github
  # The username of the owner of the repository
  owner: adam-mcdaniel

  # The name of the repository
  repo-name: rusty-ci

  # You dont want to run arbitrary code on your machine when anyone
  # makes a pull request. Rusty-CI will not test anyone's pull request
  # if their username is not in this list.
  # Note that this has no effect on GitLab merge request building!
  # Rusty-CI will only build merge requests from a branch
  # thats already inside the repository.
  whitelist:
    - adam-mcdaniel
</code></pre>
<h2><a class="header" href="#the-workers-section" id="the-workers-section">The workers section</a></h2>
<p>The workers section lists each worker and the information required to construct them and connect them to the master bot.</p>
<pre><code class="language-yaml"># This section holds each worker
# You can have as many workers as youd like, just be sure to fill out
# each of their fields out properly.
workers:
  # The name of this worker is `test-worker`
  test-worker:
    # The ip of the master
    master-ip: localhost
    # The worker's files will be installed in this directory.
    # This can also be an absolute path
    working-dir: 'test-worker'
</code></pre>
<h1><a class="header" href="#the-schedulers-section" id="the-schedulers-section">The schedulers section</a></h1>
<p>This section lists each scheduler. Each scheduler has a regular expression that matches a branch to track, and a list of regular expressions that match file changes. A scheduler can also depend on another scheduler using the <code>depends</code> section INSTEAD of the <code>triggers</code>, <code>branch</code>, and <code>password</code> sections.</p>
<p>Read the comments in the template YAML for more information.</p>
<pre><code class="language-yaml"># This section holds each scheduler.
# Like the workers section, you may have as many schedulers as youd like.
schedulers:
  # Create a scheduler named `ci-change`
  # This scheduler will trigger the `rusty-ci-test` builder whenever it
  # detects a change in a yaml file for any branch.
  ci-change:
    # This scheduler triggers the `rusty-ci-test` builder.
    # You can put as many builders as youd like here, and the scheduler will start them all.
    builders:
      - rusty-ci-test

    # This will make the current scheduler run if the &quot;your-scheduler-name-here&quot;
    # has run successfully. You can only put one scheduler name in this section.
    # depends: &quot;your-scheduler-name-here&quot;
    # IF YOU USE THE `depends` SECTION, YOU SHOULD REMOVE OR COMMENT THE FOLLOWING SECTIONS
    # Using the depends section will ignore the `branch`, `triggers`, and `password` sections

    # This is a regular expression that matches a branch.
    # If there is a change in a branch whos name matches this regex,
    # it will be checked by the following triggers section.
    # THIS WILL ONLY USE THE FIRST REGULAR EXPRESSION IN THIS SECTION TO MATCH THE BRANCH
    branch: &quot;.*&quot;
    # If a change has occurred in a branch that matches the regex in the branch section,
    # Then the files that were changed are matched against the regular expressions in the
    # triggers section. You can have any number of regular expressions in the triggers section.
    # If any one of them matches the name of a file that was changed in a matched branch,
    # then the builders in this scheduler's `builders` section are executed.
    triggers:
      - '.*\.yaml'
      - '.*\.sh'
      - &quot;.*Makefile&quot;
    # The password a whitelisted user can comment on a merge / pull request
    # to mark it for testing; that is if the pull request was made by a non-whitelisted
    # user. If the pull request was made by a whitelisted user, it is automatically run.
    password: &quot;ok to test&quot;
</code></pre>
<h2><a class="header" href="#the-builders-section" id="the-builders-section">The builders section</a></h2>
<p>The builders describe the tasks given to workers.</p>
<pre><code class="language-yaml"># These are the builders that are executed by the schedulers
# Each has its own specific task that is delegated to one or more workers
# When a builder is run, its script is run on the command line.
# You can have as many builders as youd like as well.
builders:
  # The name of the builder is `rusty-ci-test`
  rusty-ci-test:
    # This is the shell script that the workers will run when this builder is executed
    # You can have as many instructions as youd like
    # Mind you, you cannot use the |, &gt;, &lt;, &gt;&gt;, &lt;&lt;, etc. operators. Sadly, buildbot
    # passes each item separated by whitespace as another parameter to function.
    script:
      - echo Hello world!
      - echo Im an instruction in a script!
    # These are the workers to delegate this build job to
    workers:
      - test-worker
    # The repo to refresh from before running
    repo: &quot;https://github.com/adam-mcdaniel/rusty-ci&quot;
</code></pre>
<h1><a class="header" href="#tldr" id="tldr">TL;DR</a></h1>
<p>If you were too bored to read the whole thing, just paste this stuff into your terminal (I'm assuming you're using a Debian based OS).</p>
<pre><code class="language-bash"># Update &amp;&amp; Upgrade
apt update -y &amp;&amp; apt upgrade -y
apt install -y build-essential python3-dev python3-pip python3-venv

# Install rust
curl https://sh.rustup.rs -sSf | sh # Run the rust installer
source $HOME/.cargo/env             # Add `cargo` to your path
cargo install -f rusty-ci           # Install the latest rusty-ci release


# Write template yaml files
rusty-ci setup template.yaml mail.yaml

# Uncomment to modify your CI's settings to fit your project
# nano template.yaml # Controls how your CI tests your code
# nano mail.yaml     # Defines email update / notification settings

# Install rusty-ci dependencies
rusty-ci install -q   # Build install.sh
chmod +x ./install.sh # Make install.sh executable
./install.sh          # Install!

# Enter venv
. venv/bin/activate   # Enter the venv created by rusty-ci
                      # to avoid poisoning your environment

# Add an authentication token from your VCS (github)
echo &quot;YOUR AUTH TOKEN HERE&quot; &gt; auth.token

# Construct your ci bot
rusty-ci build -q template.yaml --mail mail.yaml

# Spin up the workers!
rusty-ci start template.yaml -q

# All done!
</code></pre>

                    </main>

                    <nav class="nav-wrapper" aria-label="Page navigation">
                        <!-- Mobile navigation buttons -->
                        

                        

                        <div style="clear: both"></div>
                    </nav>
                </div>
            </div>

            <nav class="nav-wide-wrapper" aria-label="Page navigation">
                

                
            </nav>

        </div>

        
        <!-- Livereload script (if served using the cli tool) -->
        <script type="text/javascript">
            var socket = new WebSocket("ws://localhost:3001");
            socket.onmessage = function (event) {
                if (event.data === "reload") {
                    socket.close();
                    location.reload(true); // force reload from server (not from cache)
                }
            };

            window.onbeforeunload = function() {
                socket.close();
            }
        </script>
        

        

        

        
        <script src="elasticlunr.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="mark.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="searcher.js" type="text/javascript" charset="utf-8"></script>
        

        <script src="clipboard.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="highlight.js" type="text/javascript" charset="utf-8"></script>
        <script src="book.js" type="text/javascript" charset="utf-8"></script>

        <!-- Custom JS scripts -->
        

        
        
        <script type="text/javascript">
        window.addEventListener('load', function() {
            window.setTimeout(window.print, 100);
        });
        </script>
        
        

    </body>
</html>