Docker in DockerのJenkins環境をdockerで構築

dockerで構築したjnekins内でdockerイメージを作成する

これができるとjenkinsでDockerイメージまで作成し、デプロイが簡単になります。

Dindイメージを使って作成してみます

Dockerfile

FROM docker:dind

############### add tools(jdk etc...) ####################
RUN apk update
RUN apk add wget git curl zip unzip	make bzip2 zlib openssl g++ libstdc++

# jdk
RUN apk add	openjdk7

# ant
RUN apk add apache-ant --update-cache --repository http://dl-4.alpinelinux.org/alpine/edge/testing/ --allow-untrusted
RUN echo "export PATH=$PATH:/usr/share/java/apache-ant/bin" >> /root/.bashrc

# node
RUN apk add	nodejs

# grunt
RUN npm install -g grunt-cli
# gulp
RUN npm install -g gulp

# Ruby
RUN apk add libffi libffi-dev gcc
RUN apk add ruby ruby-dev

# add
RUN apk add	expect

RUN apk add freetype freetype-dev fontconfig
RUN apk add xorg-server
RUN apk add bash
RUN apk add rsync --update-cache --repository http://dl-4.alpinelinux.org/alpine/edge/testing/ --allow-untrusted
RUN apk add openssh --update-cache --repository http://dl-4.alpinelinux.org/alpine/edge/testing/ --allow-untrusted

################## set up Jenkins ##########################

RUN apk --update add openjdk7 ttf-dejavu && rm -rf /var/cache/apk/*
ENV JENKINS_HOME /var/lib/jenkins

RUN mkdir -p /usr/local/jenkins
RUN adduser -D -H -s /bin/sh jenkins
RUN chown -R jenkins:jenkins /usr/local/jenkins/
ADD jenkins.war /usr/local/jenkins/jenkins.war
RUN chmod 644 /usr/local/jenkins/jenkins.war

# jst
RUN apk add tzdata --update-cache --repository http://dl-4.alpinelinux.org/alpine/edge/testing/ --allow-untrusted
RUN ln -sf	/usr/share/zoneinfo/Asia/Tokyo /etc/localtime

################### set process ##################
COPY jenkins.sh /usr/local/bin/jenkins.sh
ENTRYPOINT /usr/local/bin/start.sh && /bin/bash

start.sh

#!/bin/sh
set -eo pipefail

# If there are any arguments then we want to run those instead
java -jar /usr/local/jenkins/jenkins.war --httpPort=8080	> /tmp/jenkins.log 2>&1 &	

set -e
docker daemon \
								--host=unix:///var/run/docker.sock \
								--host=tcp://0.0.0.0:2375 \
								--storage-driver=vfs \
--bip=172.17.101.1/24		# docker0のアドレス域を変更

docker-compose.xml

ついでにdocker-composeで起動するように設定します

myjenkins:
	restart: always
	image: myjenkins:1.0
	ports: 
		- "8080:8080"
	volumes:
		- /data/jenkins:/var/lib/jenkins		# host volumeをマップング
		- /data/git:/opt/git:ro
	env_file:
		- ./.docker-compose.env
	environment:
		- JAVA_OPTS=-XX:MaxPermSize=256m
	privileged: true

.docker-compose.env

NO_PROXY=localhost,127.0.0.1
no_proxy=localhost,127.0.0.1
HTTP_PROXY=
HTTPS_PROXY=
http_proxy=
https_proxy=

起動

# docker build -t myjenkins:1.0 .
# docker-compose -f docker-compose.yml up -d myjenkins

RでSHA

RでSHA1を作成する。serialize=Fを入れるのがポイント

> install.packages("digest")
> library(digest)
> digest("abcdefg",algo="sha1",serialize=F)
[1] "2fb5e13419fc89246865e7a324f476ec624e8740"

rubyの出力との比較

$ irb
irb(main):001:0> require 'digest/sha1'
=> true
irb(main):002:0> Digest::SHA1.hexdigest("abcdefg")
=> "2fb5e13419fc89246865e7a324f476ec624e8740"

expectの書き方

よく忘れるので備忘録

#!/bin/bash
my_ssh(){
/usr/bin/expect << Eof
set timeout -1
spawn /usr/bin/ssh -o stricthostkeychecking=no root@hostname bash /path/to/script.sh
match_max 100000
expect -exact "root@hostname's password: "
send -- "password\r"
expect eof
Eof
}
my_ssh