Continuous fun with Ick
-----------------------------------------------------------------------------
Lars Wirzenius
---
Demo
-----------------------------------------------------------------------------
Ask me for access to demo instance
Note:
* apologize for the 90s aesthetic
* show web interface
* projects, a project
* builds
* build log
---
Ick?
-----------------------------------------------------------------------------
* Continuous integration, delivery, and deployment
* See "**Continuous Delivery**", by Humble, Farley
* Aims to be nice to install, run, admin, use
* Aims to be powerful but simple
* Not there yet
Note:
* you push changes to git server
* this triggers ick
* ick gets code from git server, builds, tests, deploys
vvv
WHY?
-----------------------------------------------------------------------------
* Needed something for myself
* Fed up with Jenkins
* implementation irritants
* architecture annoyances.
* Wrote a simplistic replacement in two weeks
* command line tool, not service
* fragile, but worked well enough for me
vvv
* Decided to make a **good** CI engine and service
* this will be the best software I ever write
* "NIH is strong with this one."
* did not like anything I looked at, but not an extensive survey
* language (don't like Java, Go)
* architecture (don't like Docker)
* My current hobby project. One of many.
* a couple of contributors, aiming to grow
* my new main project, after retiring Obnam
Note:
* I like to write my own crappy code, not configure other people's
silly stuff.
* Turns out there's many options now, and I can afford to pay for
cloudy stuff. Might not start Ick now.
---
Not ready for you
-----------------------------------------------------------------------------
* Seriously not ready
* Unless you like fixing things
* ALPHA quality software
* slow, lacks features, buggy, ...
---
Highlights
-----------------------------------------------------------------------------
* Builds run natively on the host, or in a systemd-nspawn container
* In my own active use
* builds, tests all my software
* builds, publishes .deb packages of my software
* builds my websites from source in git
* A demo instance with restricted access
Note:
* still feeling my way forward to what a good solution should be like
* on purpose not using Docker: it's too complicated
---
Tech stack
-----------------------------------------------------------------------------
* Python 3, gunicorn, bottle.py, python-requests
* haproxy for TLS
* data storage
* files on disk, for now
* switching to Muck, a custom key-to-JSON store
* Looking at switching to Rust instead of Python
---
The Ick Project
-----------------------------------------------------------------------------
* source: [git.liw.fi](http://git.liw.fi/ick2/)
* homepage: [ick.liw.fi](https://ick.liw.fi/)
* [bugs](https://ick.liw.fi/issues/),
[contact](https://ick.liw.fi/contact/),
[roadmap](https://ick.liw.fi/roadmap/)
* license: Affero GPL v3 or later
* governance based on lazy consensus, voting
* Contributor Covenant Code of Conduct
* explicit development iterations
* weird bug tracker (email+git)
---
Some day in the future
-----------------------------------------------------------------------------
* **Hostable**: secure, safe, reliable
* **Hosted**: open registration, free for free stuff
* **Distributed, federated**: a healthy ecosystem of providers of
components
* **Scalable**: large projects (Debian), many projects ("the world's CI")
* **Fast**: nearly no overhead over local build+test
* **Fun**: to use, not just to develop
vvv
---
Architecture
-----------------------------------------------------------------------------
vvv
* multiple components, potentially running on different hosts,
communicating over HTTPS using RESTful APIs and JSON, authenticating
via OAuth2, OpenID Connect
* **controller** - what to build, what's building now
* worker and **worker-manager** - actually build
* **qvisqve** - authenticate users, API clients (OAuth2, OIDC)
* **artifact store** - stores workspace, any build artifacts
* **apt** - .deb package repository
* **notification service** - tell people builds have finished
---
Data model
-----------------------------------------------------------------------------
* User defines **projects**
* A project invokes **pipelines** and defines **parameters**
* A pipeline consists of a sequence of **actions**
* Each action is executed by the worker-manger
* Action are affected by parameters
* Which git repo to clone, where to publish artifacts, ...
vvv
```yaml
project: hello
parameter:
whom: world
pipelines:
- hello
pipeline: hello
actions:
- where: host
python: |
whom = params['whom']
print('hello', whom)
```
---
Near future plans
-----------------------------------------------------------------------------
* good web UI - react; work is starting
* trigger service - tells controller when to start builds
* gets change events from git server, etc
* only for change to master?
* every night?
* when dependencies build successfully?
* yuck - replace qvisqve for authentication
* rock - new artifact store
---
Help?
-----------------------------------------------------------------------------
* use, give feedback
* improve documentation
* fix bugs
* adopt a component
* make new components
* security reviews
* ...
---
Thank you
-----------------------------------------------------------------------------