Mac OSX Docker下搭建Android+Jenkins+Gitlab

之前写过一篇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进行集成,自己去研究吧

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值