Backing Your Own CI in 5 minutes by using Sparrowdo, Sparky and Docker
Tags: ci, devops, perl6, docker
Published: 2017-12-04 14:31:20

---
title: Backing Your Own CI in 5 minutes by using Sparrowdo, Sparky and Docker
published: true
description: How to build your CI work flow by using Sparky and Docker
tags: ci, devops, Perl6, docker
---

What I often need is to test my code against different environments. In this small post I am going to show how one can build hosted solution to test your source code in running Docker container by using [Sparrowdo](https://github.com/melezhik/sparrowdo) and [Sparky](https://github.com/melezhik/sparky). 

Imperative deployment scenarios written on [Perl6](https://perl6.org/), nice web UI and asynchronous task execution is what you'll get for free! 


# Part1 / Spinning up a docker container

This step is trivial, as we pull desired docker image and run it as a container:

```
$ git pull docker pull base/archlinux
$ docker run -itd base/archlinux sh

```

So as we might guess I want to test my code against Arch Linux server. The same pattern is applied if you need to test against different environments, just change the docker image. 


# Part2 / Here is my code

Say, I keep my source code somewhere in  GitHub repository - https://github.com/melezhik/hello-world/blob/master/hello.bash - and for example purpose it is as simple as "hello world" Bash script:

```
#!bash
echo "Hello World!"
```

Of course real life application are much more sophisticated, however this does not limit our approach. 


# Part 3 / Deployment scenario

I am going to use [Sparrowdo](https://github.com/melezhik/sparrowdo) to deploy an application code, so as the code is quite trivial this one should be as simple as fetching a source code from GitHub and running the "main" script:

```
#!perl6
git-scm "https://github.com/melezhik/hello-world.git";
bash "bash ./hello.bash";

```

# Part4 / Sparky project

Let's create a [Sparky](https://github.com/melezhik/sparky) project to deploy mentioned Sparrowdo scenario on the running docker container. Sparky profile `sparky.yaml` would be:


```yaml

crontab: "*/10 * * * *"
sparrowdo:
  docker: elastic_sinoussi
  no_sudo: true
```

Here we ask Sparky to run our deployment scenario every 10 minutes on the running docker container named  `elastic_sinoussi` ( the name of the container could be given by command `docker ps`).


So the final structure of our Sparky project would be:

```
$ tree hello-world/
hello-world/
├── sparky.yaml
└── sparrowfile
```

Where `sparrowfile` file contains a Sparrow deployment scenario and `sparky.yaml` does a Sparky settings ( like scheduler parameters, docker instance name and so on ).



# Part5 / Sparky Web UI

It will take for awhile to build a project by Sparky, meanwhile we can observer the project builds by visiting nice Sparky web UI, following is couple of screen shots:

* Recent builds page: ![sparky1.png](https://raw.githubusercontent.com/melezhik/stuff/master/sparky1.png)

* And a certain build details:

![sparky2.png](https://raw.githubusercontent.com/melezhik/stuff/master/sparky2.png)


And finally we might notice that the project gets built successfully:


```
running sparrow tasks on 127.0.0.1 ... 
target OS is - archlinux
push [task] fetch from git source: https://github.com/melezhik ... OK
push [task] run bash: bash ./hello.bash ... OK
SPL file /opt/sparky-sparrowdo/hello-world/sparrow.list is empty
get index updates from SparrowHub ... OK
set up task box file - /home/melezhik/.sparrowdo//opt/sparky-sparrowdo/hello-world/task-box.json - OK
public@bash is uptodate (0.1.7)
running task box from /opt/sparky-sparrowdo/hello-world/sparrow-cache/task-box.json ... 
2017-12-04 14:13:34 : [task] fetch from git source: https://github.com/melezhik ... [path] modules/bash-command/ [params] envvars:
2017-12-04 14:13:35 : [task] run bash: bash ./hello.bash ... [path] modules/bash-command/ [params] envvars:
```

# Conclusion


[Sparky](https://github.com/melezhik/sparky) is a lightweight CI server built upon Sparrowdo framework. In just a few moments in enables integration tests under various environments working smoothly with Docker containers or ssh accessed hosts.