Giter VIP home page Giter VIP logo

murdock-scripts's Introduction

Introduction

This repository contains RIOT specific Murdock build scripts. It is also the place to collect documentation about RIOT's CI system.

See https://github.com/kaspar030/murdock for general information about Murdock.

Overview

RIOT's CI is composed of the following tools:

Setup of Murdock master node

disque

Ubuntu has disque packaged. Other distros might need compilation by hand. Make sure disque is running and listening on 127.0.0.1.

python modules

# pip3 install dwq
# pip3 install agithub
# pip3 install pytoml

Murdock

See https://github.com/kaspar030/murdock/blob/master/README.md for generic Murdock instructions. This guide assumes that there's a murdock user, its home directory is "/srv/murdock".

Additionally, clone this repository (murdock-scripts) to "/srv/murdock/murdock-scripts".

Create "/etc/murdock.toml" with the following content (adapt URLs, paths and credentials):

data_dir = "/srv/http/ci.riot-labs.de-devel/devel"
scripts_dir = "/srv/murdock/murdock-scripts"
http_root = "https://ci.riot-labs.de/devel"
context = "Murdock2"
github_username = "kaspar030"
github_password = "xxx"
repos = ["RIOT-OS/RIOT"]
fail_labels = [ "NEEDS SQUASHING", "Waiting For Other PR" ]
set_status = true

(For testing, better keep "set_status" set to false"...)

Now start "/srv/murdock/murdock/murdock.py /etc/murdock.toml" using your service supervisor of choice.

setup dwq authentication

Create a user that'll be used as SSH authentication user. This user can be restricted to do port forwarding to localhost:7711. Its .ssh/authorized_keys will contain ssh keys for every allowed worker.

Setup worker nodes

See https://github.com/kaspar030/riotdocker/blob/dwq/README.md.

Setup frontend HTTP proxy

nginx example (in addition to SSL setup):

    location /github {

        proxy_set_header        Host $host;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto $scheme;

    # Fix the “It appears that your reverse proxy set up is broken" error.
        proxy_pass          http://localhost:3000/github;
        proxy_read_timeout  90;
    }


    location /api {

        proxy_set_header        Host $host;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto $scheme;

    # Fix the “It appears that your reverse proxy set up is broken" error.
        proxy_pass          http://localhost:3000/api;
        proxy_read_timeout  90;
    }

    location /status {
        proxy_pass http://localhost:3000/status;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

Cluster management

Perequisites

Install autossh using package manager, and "dwq" from pip3.

Setup

  1. set up ssh authentication to ci.riot-os.org.

E.g., add this to ~/.ssh/config:

Host murdock
HostName ci.riot-os.org
User murdock-slave
Port 22
IdentityFile ~/.ssh/id_rsa_murdock-slave
IdentitiesOnly yes
LocalForward 7711 127.0.0.1:7711
LocalForward 6379 127.0.0.1:6379
ServerAliveInterval 60
ServerAliveCountMax 2

Make sure ~/.ssh/id_rsa_murdock-slave can log in to [email protected].

  1. keep an ssh connection open that forwards the ports 7711 and 6379.

E.g., use this alias and "autossh":

$ alias dwq_connect='autossh -M0 -N -C -f murdock'

Then start up autossh with dwq_connect (automate this or repeat for each session).

dwqm (dwq management utility)

Try "dwqm --help".

Useful things:

  • list all queues in the disque instance:

    $ dwqm queue --list

This is a raw queue listing and includes queues used internally by dwq. Those are named "control::" and "status::".

  • list all connected workers:

    $ dwqm control --list

  • set worker(s) to "paused", will not run any jubs until resumed or restarted:

    $ dwqm control --pause worker1 [worker2] ...

  • resume worker(s):

    $ dwqm control --resume worker1 [worker2] ...

  • shutdown worker(s) (with our current murdock scripts, this will shutdown the worker, pull the newest build container, then restart the worker):

    $ dwqm control --shutdown worker1 [worker2] ...

dwqc (dwq client, runs jobs on queue)

In our setup, every build worker listens on the "default" queue. Those workers are executing inside of the build container.

Every test worker listens on a queue named after the board it is connected to, e.g., "samr21-xpro", "nrf52dk" or "esp32-wroom-32".

every worker also listens on a queue named after it's hostname

For example, in our setup, "riotbuild" listens on the queues "default" and "riotbuild", "pi-36f90aef" listend on "pi-36f90aef" and "nrf52dk".

dwqc needs a git repo and commit either as parameters or via environment. Either manually set "DWQ_REPO" and "DWQ_COMMIT", or use an alias:

$ alias dwqset='export DWQ_REPO=https://github.com/RIOT-OS/RIOT DWQ_COMMIT=$(git rev-parse HEAD)'
$ cd src/riot
$ dwqset    # following dwqc jobs will now be executed in the specified checkout

Run a single job on the queue named "default":

$ dwqc "echo hello world!"

Run a single job on a specific queue:

$ dwqc -q riotbuild "ccache -s"

Run multiple jobs on a single queue:

$ for i in $(seq 10); do echo "echo $i"; done | dwqc -q queue_name

Create command from stdin plus base command:

$ echo "first second third" | dwqc -s "echo \${1}" # will create job "echo first"

murdock-scripts's People

Contributors

aabadie avatar kaspar030 avatar miri64 avatar cgundogan avatar smlng avatar mrkevinweiss avatar maribu avatar yegorich avatar chrysn avatar

Watchers

James Cloos avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.