利用Docker+Jenkins+Pipeline完成Android自动化测试打包服务

简介: 利用Docker+Jenkins+Pipeline完成Android自动化测试打包服务

前言



Docker首次创造了一种简单易行并且覆盖应用全生命周期的工作流。用户可以通过简单的指令或Restful API来拉取、打包、运行和维护容器。这种简化从根本上降低了应用程序部署的难度,极大地提高了应用运行时环境的部署与维护的效率。


Docker提供了一种统一的实践方法,每个服务(或应用)维护一个Dockerfile文件。即便使用编排工具如Docker Compose,一个服务(或应用)也只需维护一个docker-compose.yml文件。应用程序及其运行时环境全部打包到一个简单易读的Dockerfile或Compose文件中,开发团队和运维团队都可以透明地合作维护这个文件,极大地降低了沟通成本与部署成本,满足了研发团队与DevOps团队、运维团队之间的沟通需求,清晰划分了责任边界。


这对应用开发者来说也是一种福音,使用各种开发环境的用户,再也不必担心破坏主机的系统环境(如环境变量)和应用程序。


今天以自动化测试过程中的Android应用每日版本构建为例,讲解如何利用Docker+Jenkins+Pipeline来简化持续集成服务的部署。


下面主要还是讲实践,对于Docker、Jenkins、Pipeline还有Android等的基础知识不会做过多说明。


Jenkins安装



在我的系列文章中,如果没有特殊说明,均是指在Mac OS环境下的操作。


Jenkins在Mac上的安装方式有很多种,我主要尝试过下面几种:


  1. 在官网直接下载对应Mac系统的.pkg安装包,像Mac普通应用程序一样安装即可(但这种方式安装后会存在很多Jenkins主目录权限问题,后期实际工作过程中填过不少坑);
  2. 在官网下载最稳定的Jenkins WAR包,运行命令:java -jar jenkins.war 即可;
  3. 通过brew直接安装:brew install jenkins;


今天这里介绍一下通过Docker的方式来安装部署Jenkins:

docker run \
  -u root \
  --rm \
  -d \
  -p 8080:8080 \
  -p 50000:50000 \
  -v jenkins-data:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkinsci/blueocean


后续的引导设置步骤比较简单这里就不多说了,这里要提一点的是当你通过docker第一次启动Jenkins后,会在控制台中打印出解锁Jenkins的密码:

微信图片_20220518183612.jpg


但有时候会不小心在启动命令中多加了-d参数,这样docker容器会进入后台运行,就不会在前台输出日志信息了,这时可以运行下面这条命令:

docker logs 161286d9b973(容器ID)


这样就可以重新看到上面截图中的日志信息了,But还有一种意外情况,就是不小心把容器给关闭了,这时候即便通过上面的命令查看日志,也找不到解锁Jenkins的密码信息了,不要慌,我们还可以执行下面的命令直接进入容器来查看

docker exec 161286d9b973(容器ID) cat /var/jenkins_home/secrets/initialAdminPassword


自动创建Android编译环境



自动创建(Automated Builds)是Docker Hub提供的自动化服务,这一功能可以自动跟随项目代码的变更而重新构建镜像。


例如,这里我通过Dockerfile的形式构建了一个包含Android编译环境的镜像,如果这个Dockerfile有更新,我需要手动更新镜像。而自动创建则允许我通过Docker Hub指定跟踪一个目标网站(目前支持GitHub或BitBucket)上的项目,一旦项目发生新的提交,则自动执行创建。


要配置自动创建,包括如下的步骤:


1)创建并登录Docker Hub,进入账户设置页面,允许Docker Hub访问Github

 

微信图片_20220518183622.jpg


2)在Docker Hub中配置一个“自动创建”类型的项目;

微信图片_20220518183626.jpg

3)选取一个目标网站中的项目(需要含Dockerfile)和分支;


微信图片_20220518183632.jpg

 

4)指定Dockerfile的位置,并提交创建。 之后,可以在Docker Hub的“自动创建”页面中跟踪每次创建的状态。


微信图片_20220518183637.jpg

微信图片_20220518183646.jpg


Dockerfile的完整内容如下:

FROM ubuntu:16.04
MAINTAINER Samuel "logan62334@gmail.com"
ENV DEBIAN_FRONTEND noninteractive
WORKDIR /root
RUN apt-get update && \
    apt-get install -y qemu-kvm qemu-utils bridge-utils dnsmasq uml-utilities iptables wget net-tools && \
    apt-get install -y build-essential git vim make zip unzip curl wget bzip2 ssh openssh-server socat && \
    apt-get install -y openjdk-8-jdk && \
    apt-get install -y software-properties-common && \
    apt-get install -y net-tools iputils-ping dnsutils && \
    apt-get install -y python-dev python-pip  && \
    apt-get install -y apt-utils usbutils locales udev && \
    apt-get autoremove -y && \
    apt-get clean
# Install packages needed for android sdk tools
RUN dpkg --add-architecture i386 && \
    apt-get update && \
    apt-get -y install libstdc++6:i386 libgcc1:i386 zlib1g:i386 libncurses5:i386
# Java Environment Path
ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
ENV JRE_HOME=${JAVA_HOME}/jre
ENV CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH=${JAVA_HOME}/bin:$PATH
# Install Android SDK
ENV ANDROID_HOME=/opt/android-sdk-linux
ENV ANDROID_NDK_HOME=$ANDROID_HOME/android-ndk-r14b
ENV PATH=$PATH:$ANDROID_HOME/tools/:$ANDROID_HOME/platform-tools:$ANDROID_NDK_HOME
RUN curl -o android-sdk.tgz https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz && tar -C /opt -zxvf android-sdk.tgz > /dev/null
RUN curl -o ndk-bundle.zip https://dl.google.com/android/repository/android-ndk-r14b-linux-x86_64.zip && unzip ndk-bundle.zip -d $ANDROID_HOME > /dev/null
RUN mkdir "$ANDROID_HOME/licenses" || true
RUN echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_HOME/licenses/android-sdk-license"
RUN echo -e "\d56f5187479451eabf01fb78af6dfcb131a6481e" >> "$ANDROID_HOME/licenses/android-sdk-license"
RUN echo -e "\n84831b9409646a918e30573bab4c9c91346d8abd" > "$ANDROID_HOME/licenses/android-sdk-preview-license"
# Install Android Build Tools and the required version of Android SDK
# You can create several versions of the Dockerfile if you need to test several versions
RUN ( sleep 4 && while [ 1 ]; do sleep 1; echo y; done ) | android update sdk --no-ui --force -a --filter \
    platform-tool,android-25,android-26,build-tools-25.0.3,build-tools-26.0.1,extra-android-support,extra-android-m2repository,extra-google-m2repository && \
    echo "y" | android update adb
# Gradle 5.2.1
ENV GRADLE_HOME=/usr/local/gradle-5.2.1
ENV PATH=$GRADLE_HOME/bin:$PATH
RUN curl -o gradle-5.2.1-all.zip -L https://services.gradle.org/distributions/gradle-5.2.1-all.zip && unzip gradle-5.2.1-all.zip -d /usr/local > /dev/null
RUN echo "y" | android update sdk -a --no-ui --filter sys-img-x86_64-android-21,Android-21
VOLUME /data


Jenkins Pipeline配置



Jenkins Pipeline的使用可以参考之前的一篇文章《通过Jenkins Pipeline实现自动化部署》,这里先贴出主要的Pipeline脚本:

#!/usr/bin/env groovy
pipeline {
    agent { 
        docker {
            image 'logan62334/android-docker'
            args '-v /Users/test/.gradle:/root/.gradle' (防止每次编译都要重新下载gradle依赖)
            args '-v /Users/test/ftp/app:/root/ftp'(将容器的ftp目录映射到宿主机的ftp目录)
        }
    }
    stages {
        stage('build') {
            steps {
                sh './gradlew clean assembleRelease'
                sh 'mv app/build/outputs/apk/app-release.apk /root/ftp/got.apk'
            }
        }
    }
    post {
        always {
            echo 'One way or another, I have finished'
        }
        success {
            echo 'I succeeeded!'
        }
        unstable {
            echo 'I am unstable :/'
        }
        failure {
            dingTalk accessToken: '', imageUrl: '', jenkinsUrl: 'http://ip:port', message: 'I failed', notifyPeople: ''
        }
        changed {
            echo 'Things were different before...'
        }
    }
}


这个Pipeline主要分为三部分,第一部分检出仓库代码,第二部编译Android工程,第三部通过钉钉插件发送结果通知。这些过程都是在docker容器中进行的,任务开始执行时会自动创建一个docker容器,完成后会自动销毁,非常方便,再也不用为各种环境配置发愁了!

image.png

image.png


相关文章
|
25天前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
25天前
|
Docker 容器
将本地的应用程序打包成Docker镜像
将本地的应用程序打包成Docker镜像
|
25天前
|
开发框架 安全 开发者
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。本文探讨了 Docker 在多平台应用构建与部署中的作用,包括环境一致性、依赖管理、快速构建等优势,以及部署流程和注意事项,展示了 Docker 如何简化开发与部署过程,提高效率和可移植性。
53 4
|
1月前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
65 3
|
2月前
|
监控 jenkins 持续交付
Docker和Jenkins有什么不同
【10月更文挑战第18天】Docker和Jenkins有什么不同
|
2月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
33 1
|
2月前
|
Java Docker 微服务
SpringBoot微服务打包Docker镜像
SpringBoot微服务打包Docker镜像
84 11
|
2月前
|
Java jenkins 持续交付
Centos7下docker的jenkins下载并配置jdk与maven
通过上述步骤,您将成功在CentOS 7上的Docker容器中部署了Jenkins,并配置好了JDK与Maven,为持续集成和自动化构建打下了坚实基础。
140 1
|
3月前
|
JavaScript 测试技术 Windows
vue配置webpack生产环境.env.production、测试环境.env.development(配置不同环境的打包访问地址)
本文介绍了如何使用vue-cli和webpack为Vue项目配置不同的生产和测试环境,包括修改`package.json`脚本、使用`cross-env`处理环境变量、创建不同环境的`.env`文件,并在`webpack.prod.conf.js`中使用`DefinePlugin`来应用这些环境变量。
184 2
vue配置webpack生产环境.env.production、测试环境.env.development(配置不同环境的打包访问地址)
|
2月前
|
运维 jenkins 持续交付
自动化部署的魅力:如何用Jenkins和Docker简化运维工作
【10月更文挑战第7天】在现代软件开发周期中,快速且高效的部署是至关重要的。本文将引导你理解如何使用Jenkins和Docker实现自动化部署,从而简化运维流程。我们将从基础概念开始,逐步深入到实战操作,让你轻松掌握这一强大的工具组合。通过这篇文章,你将学会如何利用这些工具来提升你的工作效率,并减少人为错误的可能性。