duci [zushi] (Docker Under Continuous Integration) is a simple ci server.
Let's define the task in the task runner.
Let's define the necessary infrastructure for the task in the Dockerfile.
duci just only execute the task in docker container.
- Execute the task in Docker container
- Execute the task triggered by GitHub pull request comment or push
- Execute tasks asynchronously
- Create GitHub commit status
- Store and Show logs
The target repository must have Dockerfile in repository root or .duci/Dockerfile.
If there is .duci/Dockerfile, duci read it preferentially.
In Dockerfile, I suggest to use ENTRYPOINT.
e.g.
ENTRYPOINT ["mvn"]
CMD ["compile"]ENTRYPOINT ["fastlane"]
CMD ["build"]When push to github, duci execute mvn compile / fastlane build.
And when comment ci test on github pull request, execute mvn test / fastlane test.
If exists ARG instruction in Dockerfile, override value from host environment variable.
ARG FOO=default
ARG BARand you can use as envrionment variable in command.
ARG FOO=default
ENV FOO=$FOOYou can use volumes options for external dependency, cache and etc.
Set configurations in .duci/config.yml
volumes:
- '/path/to/host/dir:/path/to/container/dir'You can set environment variables in docker container.
Add the following to .duci/config.yml
environments:
- ENVIRONMENT_VAIRABLE=value# binary will be $(go env GOPATH)/bin/duci
curl -sfL https://raw.githubusercontent.com/duck8823/duci/master/install.sh | sh -s -- -b $(go env GOPATH)/bin
duci versionYou can also install a specific version. (replace vX.Y.Z with the specific version from the releases page):
# binary will be $(go env GOPATH)/bin/duci
curl -sfL https://raw.githubusercontent.com/duck8823/duci/master/install.sh | sh -s -- -b $(go env GOPATH)/bin vX.Y.Z
duci versionIf target repository is private, You can use SSH key to clone repository from github.com.
Please set the public key of the pair at https://github.com/settings/keys.
duci start to listen webhook with port 8080 (default) and endpoint /.
In GitHub target repository settings (https://github.com/<owner>/<repository>/settings/hooks),
Add endpoint of duci to Payload URL and application/json to Content type respectively.
$ duci serverYou can specify configuration file with -c option.
The configuration file must be yaml format.
Possible values are as follows.
server:
workdir: '/path/to/tmp/duci'
port: 8080
database_path: '$HOME/.duci/db'
github:
# (optional) You can use SSH key to clone. ex. '${HOME}/.ssh/id_rsa'
ssh_key_path: ''
# For create commit status. You can also use environment variable
api_token: ${GITHUB_API_TOKEN}
job:
timeout: 600
concurrency: 4 # default is number of cpuYou can check the configuration values.
$ duci configYou can use Docker to run server.
$ docker run -p 8080:8080 \
-e GITHUB_API_TOKEN=<your toekn> \
-v /var/run/docker.sock:/var/run/docker.sock \
duck8823/duci
When you want to clone with SSH in container,
$ docker run -p 8080:8080 \
-e GITHUB_API_TOKEN=<your toekn> \
-e SSH_KEY_PATH=/root/.ssh/id_rsa \
-v ~/.ssh:/root/.ssh:ro \
-v /var/run/docker.sock:/var/run/docker.sock \
duck8823/duci
With docker-compose, you can also start ui and reverse proxy together.
$ git clone https://github.com/duck8823/duci.git
$ cd duci
$ docker-compose up -dIf you start up on another host, set your host name (default: localhost) to environment variable DUCI_HOST.
GitHub send payload as webhook including X-GitHub-Delivery header.
You can read job log with the X-GitHub-Delivery value formatted UUID.
$ curl -XGET http://localhost:8080/logs/{X-GitHub-Delivery}The endpoint returns NDJSON (Newline Delimited JSON) formatted log.
{"time":"2018-09-21T22:19:42.572879+09:00","message":"Step 1/10 : FROM golang:1.11-alpine"}
{"time":"2018-09-21T22:19:42.573093+09:00","message":"\n"}
{"time":"2018-09-21T22:19:42.573494+09:00","message":" ---\u003e 233ed4ed14bf\n"}
{"time":"2018-09-21T22:19:42.573616+09:00","message":"Step 2/10 : MAINTAINER shunsuke maeda \[email protected]\u003e"}
{"time":"2018-09-21T22:19:42.573734+09:00","message":"\n"}
...
This server has an health check API endpoint (/health) that returns the health of the service. The endpoint returns 200 status code if all green.
$ curl -XGET -I http://localhost:8080/healthHTTP/1.1 200 OK
Date: Wed, 31 Oct 2018 20:33:42 GMT
Content-Length: 0
The check items are as follows
- Whether the Docker daemon is running or not
You can also check with health sub-command.
$ duci healthINFO[14/Jan/2019 07:17:38.864] ok.
MIT License
Copyright (c) 2018 Shunsuke Maeda
See LICENSE file