Skip to content

Commit ef21fe2

Browse files
committed
feature: added support for dockerizing final-ci application
1 parent acac302 commit ef21fe2

23 files changed

Lines changed: 702 additions & 38 deletions

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
config/config.yml
2+
config/travis.yml
3+
config/worker.yml
4+
config/worker-*
5+
config/id_rsa*

Dockerfile

Lines changed: 0 additions & 37 deletions
This file was deleted.

README.md

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,87 @@
1-
# docker-final-base-image
1+
# Dockerized final-api application
2+
3+
4+
## create base image
5+
cd base-image
6+
sudo docker build -t "final-ci/base-image:latest" .
7+
cd ..
8+
9+
## create other app images
10+
cd travis-logs
11+
#create travis-logs image
12+
sudo docker build -t "final-ci/travis-logs:latest" .
13+
cd ../travis-hub
14+
15+
#create travis-hub image
16+
sudo docker build -t "final-ci/travis-hub:latest" .
17+
cd ../final-api
18+
19+
#create final-api image
20+
sudo docker build -t "final-ci/final-api:latest" .
21+
cd ../travis-worker
22+
23+
#create travis-worker image
24+
sudo docker build -t "final-ci/travis-worker:latest" .
25+
cd ..
26+
27+
## prepare custom configs
28+
cp config/config.example.yml config/config.yml
29+
#and adjust your users and repositories
30+
31+
cp config/travis.example.yml config/travis.yml
32+
#and adjust your config for travis-hub, final-api and travis-logs
33+
34+
cp config/worker.example.yml config/worker.yml
35+
#and adjust your config for travis-worker
36+
37+
## run pre-requisities
38+
sudo docker run --name final-postgress -e POSTGRES_PASSWORD=mysecretpassword -d postgres:9.3
39+
sudo docker run --name final-redis -d redis:3.0.3
40+
sudo docker run --name final-rabbitmq -d rabbitmq:3.5.3
41+
42+
## run travis services in development mode
43+
44+
cd config
45+
#logs
46+
sudo docker run --link final-postgress:pg --link final-redis:re --link final-rabbitmq:mq --name final-travis-logs --rm -v `pwd`/travis.yml:/travis.yml -v /mnt/data:/var/log/finalci/logs -e ENV=development -t 'final-ci/travis-logs:latest'
47+
48+
#hub
49+
sudo docker run --link final-postgress:pg --link final-redis:re --link final-rabbitmq:mq --name final-travis-hub --rm -v `pwd`/travis.yml:/travis.yml -v `pwd`/database.yml:/database.yml -v `pwd`/config.yml:/config.yml -e ENV=development -t 'final-ci/travis-hub:latest'
50+
51+
#api
52+
sudo docker run --link final-postgress:pg --link final-redis:re --link final-rabbitmq:mq --name final-api --rm -v `pwd`/travis.yml:/travis.yml -v /mnt/data:/var/log/finalci/logs -p 55555:55555 -e ENV=development -t 'final-ci/final-api:latest'
53+
54+
#worker
55+
sudo docker run --link final-postgress:pg --link final-redis:re --link final-rabbitmq:mq --name travis-worker-docker --rm -v `pwd`/worker.yml:/worker.yml -v /var/run/docker.sock:/var/run/docker.sock -v `pwd`/id_rsa:/id_rsa -e ENV=development -t 'final-ci/travis-worker:latest'
56+
cd ..
57+
58+
## run travis services in production mode
59+
60+
cd config
61+
#logs
62+
sudo docker run --link final-postgress:pg --link final-redis:re --link final-rabbitmq:mq --name final-travis-logs --rm -v `pwd`/travis.yml:/travis.yml -v /mnt/data:/var/log/finalci/logs -e ENV=production -t 'final-ci/travis-logs:latest'
63+
64+
#hub
65+
sudo docker run --link final-postgress:pg --link final-redis:re --link final-rabbitmq:mq --name final-travis-hub --rm -v `pwd`/travis.yml:/travis.yml -v `pwd`/database.yml:/database.yml -v `pwd`/config.yml:/config.yml -e ENV=production -t 'final-ci/travis-hub:latest'
66+
67+
#api
68+
sudo docker run --link final-postgress:pg --link final-redis:re --link final-rabbitmq:mq --name final-api --rm -v `pwd`/travis.yml:/travis.yml -v /mnt/data:/var/log/finalci/logs -p 55666:55555 -e ENV=production -t 'final-ci/final-api:latest'
69+
70+
#worker
71+
sudo docker run --link final-postgress:pg --link final-redis:re --link final-rabbitmq:mq --name travis-worker-docker --rm -v `pwd`/worker.yml:/worker.yml -v /var/run/docker.sock:/var/run/docker.sock -v `pwd`/id_rsa:/id_rsa -e ENV=production -t 'final-ci/travis-worker:latest'
72+
cd ..
73+
74+
## test dockerized application
75+
git clone https://github.com/final-ci/final-runner.git
76+
cd final-runner
77+
78+
#test development environment
79+
ruby ./run.rb -d -b http://localhost:55555 ./examples/stash-payload.json
80+
81+
#test production environment
82+
ruby ./run.rb -d -b http://localhost:55666 ./examples/stash-payload.json
83+
84+
#it should be noted that some fields from stash-payload.json file
85+
#should be adjusted before testing of the environment according to your configuration files.
86+
87+

base-image/Dockerfile

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
FROM ubuntu:14.04.2
2+
MAINTAINER Lukáš Svoboda <lukas.svoboda@gmail.com>
3+
4+
ENV DEBIAN_FRONTEND noninteractive
5+
6+
RUN useradd -m -s /bin/bash travis
7+
RUN chown -R travis:travis /home/travis
8+
RUN echo 'travis ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
9+
10+
RUN update-locale LANG=C.UTF-8 LC_MESSAGES=POSIX && \
11+
locale-gen en_US.UTF-8 && \
12+
dpkg-reconfigure locales
13+
14+
RUN apt-get update && \
15+
apt-get install -y \
16+
build-essential \
17+
curl \
18+
git-core \
19+
libssl-dev \
20+
libreadline-dev \
21+
libyaml-dev \
22+
libxml2-dev \
23+
libxslt-dev \
24+
libcurl4-openssl-dev \
25+
libffi-dev \
26+
python-software-properties \
27+
libpq-dev \
28+
zlib1g-dev \
29+
wget
30+
31+
USER travis
32+
33+
ENV CONFIGURE_OPTS --disable-install-doc
34+
RUN echo 'gem: --no-rdoc --no-ri' >> /home/travis/.gemrc
35+
36+
RUN curl -sSL https://rvm.io/mpapis.asc | gpg --import -
37+
#RUN gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
38+
RUN curl -sSL https://get.rvm.io | bash -s stable --ruby=2.2,2.2.2,2.1.5,jruby-1.7.16,jruby-1.7.18,jruby-1.7.19 --gems=foreman
39+
40+
# because invalid .gemspec file in remote gem https://github.com/joshk/sshjr/issues/3
41+
# old version of bundler does not validate .gemspec file
42+
RUN /bin/bash -lc 'source /home/travis/.rvm/scripts/rvm ; rvm 1.7.16,1.7.18,1.7.19,2.1.5,2.2.1,2.2.2 do gem install bundler -v 1.9.4'
43+
44+
ENV FINAL_VERSION master
45+
46+
USER root
47+
48+
COPY "./assets/*" "/home/travis/"
49+
50+
RUN [ "chown", "travis:travis", "/home/travis/prepare_version.sh", "/home/travis/start", "/home/travis/init.sh", "/home/travis/convert_config.rb", "/home/travis/env.sh", "/home/travis/default_db_content.rb"]
51+
52+
# in normal environment this should be removed
53+
# RUN [ "git", "config", "--global", "url.\"https://\".insteadOf", "git://" ]
54+
# RUN [ "git", "config", "--global", "url.\"https://\".insteadOf", "ssh://" ]
55+
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
require 'erb'
2+
require 'yaml'
3+
4+
puts YAML.load(ERB.new(ARGF.gets(nil)).result).to_yaml
5+
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#!/usr/bin/env ruby
2+
3+
require 'bundler/setup'
4+
require 'travis'
5+
6+
config = YAML.load(ARGF.gets(nil)).deep_symbolize_keys!
7+
Travis::Database.connect
8+
9+
config[:users].each do |u|
10+
User.where(name: u[:name]).first_or_create(u).update_attributes(u)
11+
end
12+
13+
config[:repos].each do |r|
14+
new_r = r.merge(owner: User.where(name: r[:owner_name]).first)
15+
Repository.where(name: r[:name], url: r[:url]).first_or_create(new_r).update_attributes(new_r)
16+
end
17+
18+
config[:users].each do |u|
19+
if u.has_key?(:permit_repos)
20+
u[:permit_repos].each do |r|
21+
owner_name, repo_name = r[:slug].to_s.split('/', 2)
22+
owner = User.where(name: owner_name).first
23+
repo = Repository.find_by_name(repo_name)
24+
puts owner.permissions.first_or_initialize({user: owner, repository: repo}).update_attributes(r[:permissions])
25+
end
26+
end
27+
end
28+

base-image/assets/env.sh

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#!/bin/bash
2+
3+
export ENV=${ENV:-"production"}
4+
5+
export FINAL_LOGS_DATABASE=${FINAL_LOGS_DATABASE:-"finalci_logs_${ENV}_dockerized"}
6+
export FINAL_DATABASE=${FINAL_DATABASE:-"finalci_${ENV}_dockerized"}
7+
export FINAL_AMQP_VHOST=${FINAL_AMQP_VHOST:-"finalci.${ENV}.dockerized"}
8+
export FINAL_OUTPUT_LOGS_DIR=${FINAL_OUTPUT_LOGS_DIR:-"/var/log/finalci/logs"}
9+
export RAILS_ENV=${RAILS_ENV:-${ENV}}
10+
export RACK_ENV=${RACK_ENV:-${ENV}}
11+

base-image/assets/init.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#!/bin/bash
2+
3+
source ~/.rvm/scripts/rvm
4+
5+
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#!/bin/bash
2+
3+
#see man login(1) and ENVIRON(7)
4+
SHELL=/bin/bash
5+
USER=travis
6+
LOGNAME=travis
7+
LC_MESSAGES=POSIX
8+
LANG=en_US.UTF-8
9+
10+
CCOMMIT_FILE=/home/travis/$PROJECT_NAME/.current-commit
11+
[ -f $CCOMMIT_FILE ] && [ $FINAL_VERSION == $(cat $CCOMMIT_FILE) ] && exit 0
12+
13+
echo "The requested version needs to be re-checked out....."
14+
15+
source ~/.rvm/scripts/rvm
16+
17+
cd ~
18+
19+
if [ ! -d $PROJECT_NAME ]; then
20+
git clone $GIT_URL $PROJECT_NAME
21+
fi
22+
23+
cd $PROJECT_NAME
24+
echo -n "" > $CCOMMIT_FILE #in case that this script fails
25+
git fetch
26+
git checkout $FINAL_VERSION
27+
28+
#because of rvm and correct ruby version
29+
cd ..
30+
cd $PROJECT_NAME
31+
32+
git config --global url."https://".insteadof git://
33+
34+
bundle install --jobs 8
35+
36+
git rev-parse HEAD > $CCOMMIT_FILE
37+

base-image/assets/start

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#!/bin/bash
2+
3+
source ~/.rvm/scripts/rvm
4+
source ~/env.sh
5+
6+
cd ~/$PROJECT_NAME
7+
8+
~/prepare_version.sh
9+
10+
for file in `echo 'travis.yml worker.yml'` ; do
11+
if [ ! -f "$HOME/${PROJECT_NAME}/config/$file" -a -f "/$file" ] ; then
12+
ruby ~/convert_config.rb < "/$file" > "$HOME/$PROJECT_NAME/config/$file"
13+
fi
14+
done
15+
16+
for file in `echo 'database.yml config.yml'` ; do
17+
if [ -f "/$file" ] ; then
18+
ruby ~/convert_config.rb < "/$file" > "$HOME/$PROJECT_NAME/config/$file"
19+
fi
20+
done
21+
22+
23+
~/init.sh
24+
25+
if [ -n "$1" ] ; then
26+
exec "$@"
27+
else
28+
foreman start
29+
fi
30+

0 commit comments

Comments
 (0)