Android 在jenkins自动打包

一、背景

由于公司的jenkins运行在k8s集群中,在jenkins打包时调用jenkins-slave 来工作,所以需先构建android-jenkins-slave镜像。

jenkins-slave 在打包过程中会用到gradle和sdk,那么就牵涉到gradle插件和sdk持久化。

Android打包对资源要求较高,也可以单独建立jenkins工作节点,将Android打包调度到物理机节点进行。

二、NFS存储

//安装NFS服务端[root@nfs-server ~]# yum install -y nfs-utils[root@nfs-server ~]# mkdir -p /data/android[root@nfs-server ~]# mkdir -p /data/gradle[root@nfs-server ~]# vi /etc/exports/data/android 192.168.10.0/24(rw,no_root_squash)/data/gradle 192.168.10.0/24(rw,no_root_squash)[root@nfs-server ~]# systemctl enable rpcbind.service[root@nfs-server ~]# systemctl enable nfs-server.service[root@nfs-server ~]# systemctl start rpcbind.service[root@nfs-server ~]# systemctl start nfs-server.service[root@nfs-server ~]# exportfs -r//可能存在NFS无法访问,需提高权限[root@nfs-server ~]# chmod -R 777 /data/android /data/gradle

三、android-jenkins-slave镜像的Dockerfile

[root@mayi-ops jenkins-slave-android]# vim DockerfileFROM centos:7LABEL maintainer dengyouchengCOPY jdk-8u261-linux-x64.rpm /optCOPY gradle-6.7.1-all.zip /optCOPY sdk-tools-linux-3859397.zip /opt COPY slave.jar /usr/share/jenkins/slave.jarCOPY jenkins-slave /usr/bin/jenkins-slave#initRUN yum -y install wget && mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak && wget -O /etc/yum.repos.d/CentOS-Base.repo && yum makecache && yum -y install epel-release && yum -y install gcc gcc-c++ jq net-tools git unzip && yum clean all && rm -rf /var/cache/yum/* && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && mkdir -p /opt/android/sdk && mkdir -p /usr/share/jenkins && chmod +x /usr/bin/jenkins-slave#install javaRUN yum -y install /opt/jdk-8u261-linux-x64.rpmENV JAVA_HOME /usr/java/jdk1.8.0_261-amd64ENV JRE_HOME ${JAVA_HOME}/jreENV CLASSPATH .$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jarENV PATH $PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin#install sdk#./sdkmanager –list查看有哪些版本RUN unzip /opt/sdk-tools-linux-3859397.zip -d /opt/android/sdk && mkdir /root/.android/ && touch /root/.android/repositories.cfg && cd /opt/android/sdk/tools/bin && ./sdkmanager –listENV ANDROID_HOME /root/.androidENV PATH $PATH:$ANDROID_HOME:$ANDROID_HOME/emulator:$ANDROID_HOME/platform-toolsENV ANDROID_ROOT /opt/android/sdk ENV PATH $PATH:$ANDROID_ROOT/tools:$ANDROID_ROOT/tools/bin# sdkmanagerSDK指定目录,可以持久化存储# yes | ./sdkmanager –licenses && # yes | ./sdkmanager “build-tools;33.0.0” “platforms;android-33” “build-tools;30.0.2” “platforms;android-30” “platform-tools” –sdk_root=/root/.android#install gradleRUN cd /opt/ && unzip gradle-6.7.1-all.zip && mv gradle-6.7.1 gradleENV PATH $PATH:/opt/gradle/binWORKDIR /optENTRYPOINT [“jenkins-slave”]

三、pipeline 脚本(测试脚本)

//*************************************************// Author : mayi-ops// Last modified: 2021-01-06// wechat: a403182580// Description : 安卓打包脚本//*************************************************//定义java-slave的yamldef podTemplate = “””kind: Podmetadata: name: android-slavespec: containers: – name: jnlp image: “${registry}/library/jenkins-slave-android:1.3” imagePullPolicy: Always volumeMounts: – name: docker-cmd mountPath: /usr/bin/docker – name: docker-sock mountPath: /var/run/docker.sock – name: gradlecache mountPath: /root/.gradle – name: androidcache mountPath: /root/.android volumes: – name: docker-cmd hostPath: path: /usr/bin/docker – name: docker-sock hostPath: path: /var/run/docker.sock – name: gradlecache nfs: server: ${nfsip} path: ${gradle_cache} – name: androidcache nfs: server: ${nfsip} path: ${android_cache}”””//pipeline构建过程pipeline { agent { //根据yaml创建salve kubernetes { label “android-slave” yaml podTemplate } } //变量 environment { DingTalkHook = “” } stages { //如果是非admin、打包、打包部署,才会打包 stage(‘拉取代码’) { steps{ script { /* 获取git地址 */ if ( env.GitAddress ){ if ( env.GitAddress == ” ) { echo “请输入git分支!” } }else{ echo “请输入gitlab项目地址。” exit 0 } /* 代码分支 */ //输入分支:参数化构建过程->字符参数->名称:codeBranch->默认值:fat if ( env.codeBranch ){ if ( env.codeBranch == ” ){ echo “请输入git分支!” } }else{ echo “没输入分支,默认使用master” env.codeBranch = “master” } echo “git:”+env.GitAddress echo “Branch:”+env.codeBranch //拉取业务代码 checkout([ $class: ‘GitSCM’, branches: [[name: “${codeBranch}”]], doGenerateSubmoduleConfigurations: false, extensions: [[$class: ‘RelativeTargetDirectory’, relativeTargetDir: ‘code’]], submoduleCfg: [], userRemoteConfigs: [[credentialsId: “build_auth”, url: “${GitAddress}”]] ]) } } } stage(‘android打包’){ steps{ script { dir(“code”){ /* 打包脚本 */ sh “java -version” sh “adb version” sh “gradle -v” echo “=================gradle打包中===============================” sh “gradle assembleRelease” echo “=================gradle打包完成=============================” sh “cp app/build/outputs/apk/*/*.apk /root/ttt.apk” echo “=================gradle clean==============================” //sh “gradle clean” } } } } stage(‘push APK’){ steps{ script { env.Apkurl = sh returnStdout: true, script: “””curl -F “file=@/root/ttt.apk” -F “uKey=${env.USER_KEY}” -F “_api_key=${env.API_KEY}” appQRCodeURL|awk -F'”‘ ‘{print $4}'””” echo “蒲公英二维码地址: “+env.Apkurl } } } } //使用post 插件必须使用pipeline,不能使用podTemplate插件 post { //安装插件 HTTP Request Plugin和 Post build task success{ script { //打包成功 def ReqBody = “””{ “msgtype”: “markdown”, “markdown”: { “title”: “APK打包信息”, “text”: “## 【${env.objectname}】打包成功 n>- **打包分支:${env.codeBranch}**n>- **扫描二维码下载APK:**n>- ![screenshot](${env.Apkurl}) n>- 构建日志: [点击查看详情](${env.BUILD_URL}console)” }, “at”: { “isAtAll”: true } }””” httpRequest acceptType: ‘APPLICATION_JSON_UTF8’, consoleLogResponseBody: false, contentType: ‘APPLICATION_JSON_UTF8’, httpMode: ‘POST’, ignoreSslErrors: true, requestBody: ReqBody, responseHandle: ‘NONE’, url: “${env.DingTalkHook}”, quiet: true } } failure{ script { //打包失败 def ReqBody = “””{ “msgtype”: “markdown”, “markdown”: { “title”: “APK打包信息”, “text”: “## 【${env.objectname}】打包失败 n>- **打包分支:${env.codeBranch}**n>- 构建日志: [点击查看详情](${env.BUILD_URL}console)” }, “at”: { “isAtAll”: true } }””” httpRequest acceptType: ‘APPLICATION_JSON_UTF8’, consoleLogResponseBody: false, contentType: ‘APPLICATION_JSON_UTF8’, httpMode: ‘POST’, ignoreSslErrors: true, requestBody: ReqBody, responseHandle: ‘NONE’, url: “${env.DingTalkHook}”, quiet: true } } }}

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年6月18日
下一篇 2022年6月18日

相关推荐

  • 长大是生命的一个过程

    人终要长大的,换言之,是自己慢慢学着长大!那什么是长大啊? 有很多人会认为,成熟就是长大,也就是被生活磨去棱角和个性,然后圆滑又现实! 我倒是觉得那是精神早衰、自我、和失去个性,也…

    2022年6月15日
  • wordpress使用the_excerpt函数显示文章的摘要信息

    如果你的文章需要摘要信息可以使用此函数,使用此函数需要了解如下四点1、它自动提取文章内容前55个字符作为文章摘要2、摘要不含有任何html和图片标签3、此函数只能用在循环中4、文章…

    2022年6月15日
  • 一篇学会如何使用Vite重构Vue3项目

    前言 截止发文时间,vite正式版已经发布快2年时间了,vue3也发布到3.2版本了,它的周边设施基本上已经齐活了。也是时候再次重构下我那个vue3.0的开源项目了。 本篇文章就记…

    2022年8月16日
  • iPhone14系列或有望全系配置6GB RAM?网友:安卓12GB已属正常

    不知道大家发现没有,苹果对于自家iPhone的运存(RAM)参数很少提及,就像是从来不标注自家产品的电池容量一样。而最近就有消息显示,iPhone14系列有望全系内置6GB运存,其…

    2022年7月29日
  • 我想知道起亚k5和迈锐宝xl选择哪个比较放心,毕竟家用,省心,小毛病少就行?

    两车对比迈锐宝XL完胜曾经的“DIAOS·三宝”现在只剩下一台销量尚可的车,这台车是雪佛兰迈锐宝XL,为何索纳塔和K5凯酷在这场漫长的角逐中一败涂地,这是个挺有趣的问题;其实可以先…

    2022年7月24日
  • 大灭绝鸟类怎么活下来的?《方舟生存进化》就能演示这一过程

    距离今天约6500万年之前,一颗巨大的陨石落下,把恐龙一族彻底的湮灭在了这颗星球之上,可奇怪的是,和恐龙们生活在同一时代的各种鸟类依旧存活了下来,为何会发生这种事情呢?从Steam…

    2022年6月29日
  • 《梦江湖》:世间本无分正邪,着白衣偷换天下

    作者:沐雨病 补完计划,未来可期。 本作是《我的侠客》手游移植版,单从名字上来看,可能是想要更加明确的去区分两者之间的区别,毕竟本作在手游之中也算武侠类的翘楚,并不想因为出了单机版…

    2022年8月5日
  • 汽车销售新手入门知识,汽车新手入门基本常识讲解

    一、具备扎实的汽车专业知识 作为一名汽车销售人员,必须具备扎实专业的汽车基础知识。只有这样,你才能引起客户的关注和重视;也只有这样,才能塑造自己在客户心中的专业形象。汽车销售人员应…

    2022年10月26日
  • 安全管理框架,用Shiro还是用Spring Security?

    开发Java应用项目的时候,安全管理通常来讲是必不可少的功能。常用的安全管理框架有Apache Shiro和Spring Security,那么作为一名开发人员的话,该如何选择自己…

    2022年6月16日
  • 锐意进取!搭贝零代码平台入选企业微信应用市场

    2022年6月,搭贝作为零代码平台正式上架企业微信应用市场,成为了企业微信的合作伙伴。 作为山东零代码市场的先驱者,搭贝一直在探索驱动企业数字化转型的途径,上架企业微信应用市场也是…

    2022年6月23日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息