之前写过一篇Mac OSX搭建Jenkins持续集成环境,后来mac从10.11升到了10.11后,Jenkins就不可用了,最近测试一些功能需要再次用到Jenkins,为了杜绝之前发生的问题,这次就用Docker来搭建,记录一下。
安装Docker for mac
随着Docker的不断迭代,官方已经对Mac有了支持,不再像之前那样,mac下搭建个docker还要装各种东西。官方的地址https://www.docker.com/products/docker#/mac。首先下载官方的Docker安装包Docker.dmg,下载完成后安装即可,如果你需要一个GUI界面,可以再下载kitematic,这个可选,可不下载。
配置 Docker 加速器
Docker Hub 提供众多镜像,你可以从中自由下载数十万计的免费应用镜像, 这些镜像作为 docker 生态圈的基石,是我们使用和学习 docker 不可或缺的资源。但是国内的网络环境从Docker Hub上拉镜像速度一般,我们可以使用DaoCloud进行加速,具体使用见官方Mac文档配置 Docker 加速器
构建Docker android环境镜像
新建一个文件,命名为android_sdk_components.env,输入内容:
tools,platform-tools,build-tools-19.1.0,build-tools-22.0.0,build-tools-22.0.1,build-tools-21.1.2,build-tools-22.0.0,build-tools-23.0.1,build-tools-23.0.2,build-tools-23.0.3,build-tools-24.0.0,build-tools-24.0.1,android-14,android-15,android-16,android-17,android-18,android-19,android-20,android-21,android-22,android-23,android-24,extra-android-m2repository,extra-google-m2repository
代表我们需要安装这些组件组件,在同目录下新建Dockerfile文件,我们基于java:8-jdk镜像进行构建,只所以选择这个镜像是因为jenkins也是依赖这个镜像,后续jenkins直接依赖我们构建产生的android镜像即可。在Dockerfile文件中输入构建命令:
ENV DEBIAN_FRONTEND noninteractive
# install dependencies
RUN dpkg --add-architecture i386 && \
apt-get update && \
apt-get install -yq libstdc++6:i386 zlib1g:i386 libncurses5:i386 --no-install-recommends && \
apt-get -y install --reinstall locales && \
apt-get install -y git curl zip vim&& \
dpkg-reconfigure locales && \
echo 'ja_JP.UTF-8 UTF-8' >> /etc/locale.gen && \
locale-gen ja_JP.UTF-8 && \
localedef --list-archive && locale -a && \
update-locale && \
apt-get clean
# Download and untar SDK
ENV ANDROID_SDK_URL http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz
RUN curl -L "${ANDROID_SDK_URL}" | tar --no-same-owner -xz -C /usr/local
# set env
ENV ANDROID_HOME /usr/local/android-sdk-linux
ENV ANDROID_SDK /usr/local/android-sdk-linux
ENV PATH ${ANDROID_HOME}/tools:$ANDROID_HOME/platform-tools:$PATH
# install Android SDK components
COPY android_sdk_components.env /android_sdk_components.env
RUN (while :; do echo 'y'; sleep 3; done) | android update sdk --no-ui --all --filter "$(cat /android_sdk_components.env)"
# download gradle
RUN wget http://downloads.gradle.org/distributions/gradle-2.11-all.zip
RUN mkdir -p /usr/local/gradle
RUN unzip gradle-2.11-all.zip -d /usr/local/gradle
RUN rm gradle-2.11-all.zip
ENV GRADLE_HOME /usr/local/gradle/gradle-2.11
ENV PATH $GRADLE_HOME/bin:$PATH
# support gradle
ENV TERM dumb
" data-snippet-id="ext.60a4d64c35f46ac5a9b71d9804533587" data-snippet-saved="false" data-codota-status="done">FROM java:8-jdk
MAINTAINER Zhangqu Li <lizhangqu@weidian.com>
ENV DEBIAN_FRONTEND noninteractive
# install dependencies
RUN dpkg --add-architecture i386 && \
apt-get update && \
apt-get install -yq libstdc++6:i386 zlib1g:i386 libncurses5:i386 --no-install-recommends && \
apt-get -y install --reinstall locales && \
apt-get install -y git curl zip vim&& \
dpkg-reconfigure locales && \
echo 'ja_JP.UTF-8 UTF-8' >> /etc/locale.gen && \
locale-gen ja_JP.UTF-8 && \
localedef --list-archive && locale -a && \
update-locale && \
apt-get clean
# Download and untar SDK
ENV ANDROID_SDK_URL http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz
RUN curl -L "${ANDROID_SDK_URL}" | tar --no-same-owner -xz -C /usr/local
# set env
ENV ANDROID_HOME /usr/local/android-sdk-linux
ENV ANDROID_SDK /usr/local/android-sdk-linux
ENV PATH ${ANDROID_HOME}/tools:$ANDROID_HOME/platform-tools:$PATH
# install Android SDK components
COPY android_sdk_components.env /android_sdk_components.env
RUN (while :; do echo 'y'; sleep 3; done) | android update sdk --no-ui --all --filter "$(cat /android_sdk_components.env)"
# download gradle
RUN wget http://downloads.gradle.org/distributions/gradle-2.11-all.zip
RUN mkdir -p /usr/local/gradle
RUN unzip gradle-2.11-all.zip -d /usr/local/gradle
RUN rm gradle-2.11-all.zip
ENV GRADLE_HOME /usr/local/gradle/gradle-2.11
ENV PATH $GRADLE_HOME/bin:$PATH
# support gradle
ENV TERM dumb
构建命令很简单,首先就是安装一些依赖,然后是下载android sdk,通过运行无ui的android sdk来安装一些sdk所需的组件,这些组件我们定义在android_sdk_components.env文件中,此外还设置了Android的环境变量。当然除了Android sdk外,还需要安装一下gradle,下载,解压,设置环境变量即可。最后有一个ENV TERM dumb,这个是为了命令行能运行gradle命令。
终端进入Dockerfile所在目录,执行build命令构建镜像docker-android
docker build -t docker-android .
一直等镜像构建完,这里可能需要一定的时间,因为要去下载一些sdk组件。
构建jenkins镜像
jenkins镜像我们使用官方的Dockerfile文件进行定制,首先将官方的源码clone下来,项目地址:https://github.com/jenkinsci/docker
git clone git@github.com:jenkinsci/docker.git
clone完成后进入源码目录,修改Dockerfile文件内容,将From镜像修改为刚才我们构建完成的docker-android镜像,即
将
FROM openjdk:8-jdk
修改为
FROM docker-android:latest
由于docker-android镜像中已经把curl,wget,git,zip等软件都安装掉了,所以接下来的第二行的安装软件的命令可以去掉,即这一行去掉
RUN apt-get update && apt-get install -y git curl zip && rm -rf /var/lib/apt/lists/*
同时我们为了提权,可能需要安装一下sudo,这个视情况,如果你不需要的话可以不安装,如果需要的话就加上命令
RUN apt-get install -y sudo
还要在USER ${user}前面加上
### 如果没有安装sudo,这里也不需要执行
RUN echo "${user}:${user}" | chpasswd
RUN echo "${user} ALL=(ALL) ALL" >> /etc/sudoers
### 加在这个前面
USER ${user}
之后进入源码目录,执行docker build命令构建jenkins镜像
docker build -t docker-jenkins .
构建完成后运行容器,进行端口映射
docker run --name=myjenkins -d -p 8080:8080 -p 50000:50000 docker-jenkins
这时候等容器运行起来后,浏览器输入http://127.0.0.1:8080,即可进行安装,如果安装界面出现提示你输入密码,这个密码你可以从安装界面提示的文件中找到,也可以从docker的输出log中找到。
生成git ssh key
使用命令进入容器bash终端
docker exec -i -t myjenkins /bin/bash
进入到用户目录
cd ~
生成ssh key
git config --global user.name "lizhangqu"
git config --global user.email "lizhangqu@weidian.com"
ssh-keygen
把生成的key加入到你的github账户或者公司代码仓库中去
安装必要的jenkins插件及配置相关内容
这个不详细说,具体见这篇文章中的插件 Mac OSX搭建Jenkins持续集成环境,主要就是配置账户体系,配置ssh key的目录,安装插件。如果插件安装失败的话多安装几次就好了,安装完成后记得重启jenkins。
尝试构建一个gradle项目
新建一个Job,利用安装的Git Plugin插件,使用源码控制中的Git配置源码仓库。
利用安装的插件进行下面两个操作,一个是执行的shell命令,一个是断言构建输出的目录,如果目录下没有东西,则构建失败
尝试构建,构建成功后会如下图所示
jenkins api
jenkins 提供一些restful api进行调用,通过这些api我们可以获得我们想要的信息,比如构建是否成功等等,我们可以通过类似http://127.0.0.1:8080/api/json或者http://127.0.0.1:8080/api/xml获得我们想要的内容,如果对某个job感兴趣,可以使用http://127.0.0.1:8080/job/Test/api/json,如果对该job某次构建感兴趣,可以使用http://127.0.0.1:8080/job/Test/1/api/json,更多restful api见官方文档。
Gitlab集成
之前Gitlab集成到docker的过程中遇到了一点小问题,就是docker 容器中的内容不能持久化,一旦容器重启,容器中的数据也就没了。。。后来试了下官方的Docker for mac 版本,发现这个问题不存在,直接使用gitlab-ce的镜像即可。
docker run --name=mygitlab -d -p 4433:443 -p 2222:22 -p 8000:80 gitlab/gitlab-ce:latest
至于gitlab怎么和jenkins进行集成,自己去研究吧