2021-01-27 21:08:16 +01:00
# Dagger: the devops superglu, by the creators of docker
2020-12-30 03:45:16 +01:00
2021-01-27 21:08:16 +01:00
Dagger is a scripting environment for automating the delivery of your application to the cloud,
from code to production.
2020-12-30 03:45:16 +01:00
2021-01-27 21:08:16 +01:00
If you are familiar with PaaS services like Heroku, Firebase or Openshift:
Dagger makes it easy to create a custom PaaS that is perfectly tailored to each application,
instead of forcing it into a rigid, homogeneous mold. The Dagger philosophy
is that the platform should adapt to the application, not the other way around.
This means that, unlike traditional PaaS, you can use Dagger with all your applications,
*without having to change your tooling, software stack or infrastructure*.
TODO:
*[... principles: productivity + compat]*
*[.. do out-of-the-box things that would require months of work otherwise]*
*[.. alternative to the dilemna: paas or build your own?]*
## Warning: alpha software
Please note that Dagger is *alpha-quality software* . This means it has many bugs,
the user interface is minimal, and it may change in incompatible ways at any time.
If you are still willing to try it, thank you! We appreciate your help.
Please do not hesitate to ask questions, report bugs, or share feedback,
either in a github or in the discord chatroom.
## Platform as code
The most important feature of Dagger is that it is *programmable* .
Thanks to its powerful scripting environment and growing catalog of reusable components,
anyone with basic programming knowledge can assemble a custom platform for their application,
and quickly start automating repetitive and complex tasks, so the entire team can spend
less time getting deployment to work, and more time developing.
2020-12-30 03:45:16 +01:00
2020-12-30 10:16:15 +01:00
Whether you're a seasoned SRE building a custom PAAS for your organization, a hobbyist on a fun
over-engineered week-end project, or a developer trying to setup CICD because, well, someone has to do it..
2021-01-27 21:08:16 +01:00
There's a whole community of fellow automation enthusiasts ready to help you write your first script.
2020-12-30 03:45:16 +01:00
2020-12-30 10:16:15 +01:00
## Usage examples
2020-12-30 03:45:16 +01:00
2020-12-30 10:16:15 +01:00
A few examples of how Dagger is used in the wild:
2020-12-30 03:45:16 +01:00
2021-01-27 21:08:16 +01:00
- Use AWS Elastic Container Service to deploy the new API, while continuing to deploy the main app on Heroku.
2020-12-30 10:16:15 +01:00
- Deploy lightweight staging environments on-demand for QA, integration testing or product demos.
- Run integration tests on a live production-like deployment, automatically, for each pull request.
- Deploy the same app on Netlify for testing, and on Kubernetes for production
- Replace a 500-line deploy.sh with a 10-line configuration file
- Control sprawl of serverless functions on AWS, Google Cloud, Cloudflare, Netlify etc. by gradually
moving them to a generic interface, and switching backend at will.
- When the ML team uploads a new model to their S3 bucket, automatically incorporate it into staging
deployments, but not into production until manual confirmation!
- Rotate database credentials, and automatically re-deploy all staging environments with the new credentials.
- Allocate cool auto-generated URLs to development instances, and automatically configure your DNS,
load-balancer and SSL certificate manager to route traffic to them.
- Orchestrate application deployment across 2 infrastructure siloes, one managed with CloudFormation, the other with Terraform.
- Migrate from Helm to Kustomize, without disrupting next week's big release.
2020-12-30 03:45:16 +01:00
2021-01-27 21:08:16 +01:00
## Getting started
1. Build the `dagger` command-line tool. You will need [Go ](https://golang.org ) version 1.13 or later.
```
$ make
```
2. Copy the `dagger` tool to a location listed in your `$PATH` . For example, to copy it to `/usr/local/bin` :
```
$ cp ./cmd/dagger/dagger /usr/local/bin
```
2021-02-02 08:51:55 +01:00
3. Run [buildkitd ](https://github.com/moby/buildkit ) on your local machine. The simplest way to do this is using [Docker ](https://docker.com ): `docker run -d --name buildkitd --privileged moby/buildkit:latest`
2021-01-27 21:08:16 +01:00
On a machine with Docker installed, run:
```
$ docker run -d --name buildkitd --privileged moby/buildkit:latest
```
4. Compute a test configuration
Currently `dagger` can only do one thing: compute a configuration with optional inputs, and print the result.
If you are confused by how to use this for your application, that is normal: `dagger compute` is a low-level command
which exposes the naked plumbing of the Dagger engine. In future versions, more user-friendly commands will be available
which hide the complexity of `dagger compute` (but it will always be available to power users, of course!).
Here is an example command, using an example configuration:
```
$ dagger compute \
./examples/simple \
--input 'www: hostname: "www.mysuperapp.com"' \
2021-01-31 00:55:46 +01:00
--input 'www: source: #dagger: compute: [{do:"fetch-git", remote:"https://github.com/samalba/hello-go", ref:"master"}]'
2021-01-27 21:08:16 +01:00
```
## Custom buildkit setup
Dagger can be configured to use an existing buildkit daemon, running either locally or remotely. This can be done using two environment variables: `BUILDKIT_HOST` and `DOCKER_HOST` .
To use a buildkit daemon listening on TCP port `1234` on localhost:
```
$ export BUILDKIT_HOST=tcp://localhost:1234
```
To use a buildkit daemon running in a container named "super-buildkit" on the local docker host:
```
$ export BUILDKIT_HOST=docker-container://super-buildkit
```
To use a buildkit daemon running on a remote docker host (be careful to properly secure remotely accessible docker hosts!)
```
$ export BUILDKIT_HOST=docker-container://super-buildkit
$ export DOCKER_HOST=tcp://my-remote-docker-host:2376
```
2020-12-30 10:16:15 +01:00
## Comparison to other automation platforms
2020-12-30 03:45:16 +01:00
2020-12-30 10:16:15 +01:00
### CICD
2020-12-30 03:45:16 +01:00
2020-12-30 10:16:15 +01:00
Github, Gitlab, Jenkins, Spinnaker, Tekton
2020-12-30 03:45:16 +01:00
2020-12-30 10:16:15 +01:00
### Build systems
2020-12-30 03:45:16 +01:00
2020-12-30 10:16:15 +01:00
Bazel, Nix, Skopeo
2020-12-30 03:45:16 +01:00
2020-12-30 10:16:15 +01:00
### Infrastructure automation
2020-12-30 03:45:16 +01:00
2020-12-30 10:16:15 +01:00
Terraform, Pulumi, Ansible
2020-12-30 03:45:16 +01:00
2020-12-30 10:16:15 +01:00
### Traditional scripting
2020-12-30 03:45:16 +01:00
2020-12-30 10:16:15 +01:00
Bash, Make, Python
2020-12-30 03:45:16 +01:00
2020-12-30 10:16:15 +01:00
### PaaS
Heroku, Elastic Beanstalk, Cloud Foundry, Openshift
### Kubernetes management
Kustomize, Helm, jsonnet
### Gitops
Flux, ...
2021-01-27 21:08:16 +01:00