描述:

由于需求不一致,有的时候需要给所有应用商店打包,有的时候需要指定应用商店打包,所以在gitlab-ci文件里面需要将构建单独的应用商店的job全部列出来,在加上构建所有应用商店的job,一共13个job。打包完apk需要上传到oss上,并给相关的人员发送邮件,这部分用Python来实现的。

编写gitlab-ci.yaml文件

gitlab-ci.yaml文件如下:

variables:GRADLE_OPTS: "-Dorg.gradle.daemon=false" # 禁用 gradle 守护进程before_script:#  配置 gradle 的缓存目录- export GRADLE_USER_HOME=cache/.gradle#  获取权限- chmod +x ./gradlewstages:- 构建apk包- uploadOssAndSendMail.构建apk: &buildApkstage: 构建apk包tags:- androidonly:- /^release-pro-.*$/artifacts:paths:# 设置输出路径- app/build/outputs/构建所有apk包:<<: *buildApkwhen: manualscript:# 创建apk输出路径- mkdir -p app/build/outputs- ./gradlew assembleRelease木蚂蚁:<<: *buildApkwhen: manualscript:# 创建apk输出路径- mkdir -p app/build/outputs- ./gradlew assembleMumayiRelease联想:<<: *buildApkwhen: manualscript:# 创建apk输出路径- mkdir -p app/build/outputs- ./gradlew assembleLianxiangRelease酷安:<<: *buildApkwhen: manualscript:# 创建apk输出路径- mkdir -p app/build/outputs- ./gradlew assembleKuanRelease阿里:<<: *buildApkwhen: manualscript:# 创建apk输出路径- mkdir -p app/build/outputs- ./gradlew assembleAliRelease应用宝:<<: *buildApkwhen: manualscript:# 创建apk输出路径- mkdir -p app/build/outputs- ./gradlew assembleYingyongbaoReleaseoppo:<<: *buildApkwhen: manualscript:# 创建apk输出路径- mkdir -p app/build/outputs- ./gradlew assembleOppoRelease华为:<<: *buildApkwhen: manualscript:# 创建apk输出路径- mkdir -p app/build/outputs- ./gradlew assembleHuaweiReleasevivo:<<: *buildApkwhen: manualscript:# 创建apk输出路径- mkdir -p app/build/outputs- ./gradlew assembleVivoRelease百度:<<: *buildApkwhen: manualscript:# 创建apk输出路径- mkdir -p app/build/outputs- ./gradlew assembleBaiduRelease三星:<<: *buildApkwhen: manualscript:# 创建apk输出路径- mkdir -p app/build/outputs- ./gradlew assembleSanxingRelease魅族:<<: *buildApkwhen: manualscript:# 创建apk输出路径- mkdir -p app/build/outputs- ./gradlew assembleMeizuReleaseuploadOssAndSendMail:stage: uploadOssAndSendMailtags:- androidwhen: manualonly:- /^release-pro-.*$/script:- cd app/build/outputs - /usr/bin/python3  /home/gitlab-runner/zip_GetUrl_SendMail.py  - rm -rf *

编写python文件

编写python文件实现apk文件压缩打包,并上传到指定oss上,并给相关人员发送邮件,对应人员在邮件中点击下载链接即可对apk的压缩文件进行下载。

import oss2
import zipfile
import os
import datetime
from smtplib import SMTP_SSL
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Headeraccess_key_id = 'my_key_id'
access_key_secret = 'my_key_secret'
bucket_name = 'my_bucket_name'
endpoint = 'https://oss-cn-xxx.aliyuncs.com'filename = "apk-" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S") + ".zip"
oss_file_path = "apk/" + filenamedef zipDir(dirpath, outFullName):"""压缩指定文件夹:param dirpath: 目标文件夹路径:param outFullName: 压缩文件保存路径+xxxx.zip:return: 无"""zip = zipfile.ZipFile(outFullName, "w", zipfile.ZIP_DEFLATED)for path, dirnames, filenames in os.walk(dirpath):# 去掉目标跟路径,只对目标文件夹下边的文件及文件夹进行压缩fpath = path.replace(dirpath, '')for filename in filenames:zip.write(os.path.join(path, filename), os.path.join(fpath, filename))zip.close()def uploadOss_getUrl():# 创建对象bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)# 上传with open(filename, "rb") as fileobj:# Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。fileobj.seek(0, os.SEEK_SET)# Tell方法用于返回当前位置。current = fileobj.tell()# 填写Object完整路径。Object完整路径中不能包含Bucket名称。res = bucket.put_object("apk/" + filename, fileobj)print(res)file_url = "https://" + bucket_name + ".oss-cn-xxx.aliyuncs.com/apk/" + filenameprint(file_url)return file_urldef sendMail(url):# smtplib模块主要负责发送邮件:是一个发送邮件的动作,连接邮箱服务器,登录邮箱,发送邮件(有发件人,收信人,邮件内容)。# email模块主要负责构造邮件:指的是邮箱页面显示的一些构造,如发件人,收件人,主题,正文,附件等。host_server = 'smtp.exmail.qq.com'  # qq邮箱smtp服务器sender_qq = 'xxx@xxx.com'  # 发件人邮箱pwd = 'password'receiver = ['xxx@xxx.com',"xxx@xxx.com"]  # 收件人邮箱mail_title = '安卓apk打包成功'  # 邮件标题# 添加链接html_data = f'''<p>您好,安卓apk打包成功,请点击链接进行下载</p><p><a href='{url}'>点这里</a></p>'''# mail_content = "您好,安卓apk打包成功,请点击链接进行下载" + url  # 邮件正文内容# 初始化一个邮件主体msg = MIMEMultipart()msg["Subject"] = Header(mail_title, 'utf-8')msg["From"] = sender_qq# msg["To"] = Header("测试邮箱",'utf-8')msg['To'] = ";".join(receiver)# 邮件正文内容msg.attach(MIMEText(html_data, 'html', 'utf-8'))smtp = SMTP_SSL(host_server)  # ssl登录# login(user,password):# user:登录邮箱的用户名。# password:登录邮箱的密码,像笔者用的是网易邮箱,网易邮箱一般是网页版,需要用到客户端密码,需要在网页版的网易邮箱中设置授权码,该授权码即为客户端密码。smtp.login(sender_qq, pwd)# sendmail(from_addr,to_addrs,msg,...):# from_addr:邮件发送者地址# to_addrs:邮件接收者地址。字符串列表['接收地址1','接收地址2','接收地址3',...]或'接收地址'# msg:发送消息:邮件内容。一般是msg.as_string():as_string()是将msg(MIMEText对象或者MIMEMultipart对象)变为str。smtp.sendmail(sender_qq, receiver, msg.as_string())# quit():用于结束SMTP会话。smtp.quit()if __name__ == "__main__":input_path = "./abc"output_path = filenamezipDir(input_path, output_path)url = uploadOss_getUrl()sendMail(url)

gitlab-ci添加安卓项目构建流程相关推荐

  1. winform 项目 发布后比本地运行慢_前端团队基于 GitLab CI/CD 的自动化构建、发布实践,快来学习吧...

    在公司搭建内部 GitLab 平台后,前端活动项目从 SVN 迁移到 GitLab.本文介绍如何基于 GitLab CI/CD 实现自动化构建及发布. 在从 SVN 迁移到 GitLab 和接入 Gi ...

  2. Cocos Creator发布H5游戏,做项目构建流程定制

    游戏实现 主要介绍游戏玩法,具体实现,参考游戏源码.玩法是:游戏开始后,通过虚拟摇杆控制猴子在屏幕左右方向跳动,屏幕上随机出现香蕉,过一段时间后消失,猴子吃到香蕉得分,如果等到香蕉消失时,猴子仍旧没吃 ...

  3. 【QT开发笔记-基础篇】| 第一章 QT入门 | 1.4 项目构建流程

    本节对应的视频讲解:B_站_链_接 https://www.bilibili.com/video/BV1cW4y1y7Lw 在上一节课中,我们新建了第一个 Qt 工程,其中包括 5 个文件: Hell ...

  4. 深度学习(五十六)tensorflow项目构建流程

    tensorflow项目构建流程 博客:http://blog.csdn.net/hjimce 微博:黄锦池-hjimce   qq:1393852684 一.构建路线 个人感觉对于任何一个深度学习库 ...

  5. iOS之深入解析CocoaPods的GitLab CI与组件自动化构建与发布

    一.Gitlab CI/CD 简介 ① GitLab GitLab 是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的 Git 项目仓库,可通过 Web 界面进行访问公开的或 ...

  6. GitLab CI/CD 自动化部署全流程

    CI/CD简介 CI/CD 是一种持续开发软件的方法,侧重于软件开发过程中的自动化,可以不断地进行构建.测试和部署代码.使用这种方法,从新代码开发到部署,可以减少人工干预甚至不用干预 CI(Conti ...

  7. 【Android Gradle】安卓应用构建流程 ( Java 源码编译 和 AIDL 文件编译 )

    文章目录 一.安卓应用构建简介 二.Java 源码编译 三.AIDL 源码编译 一.安卓应用构建简介 使用 Android Studio 开发 Android 应用时 , 编译应用后在 Module ...

  8. GitLab CI/CD 多项目,多流水线制品合并方案

    前言 在做CI/CD流水线时,有时会遇到非常复杂的项目架构,比如一个前后端分离的项目,在前端构建完成后,需要将前端的制品存放到后端项目的指定目录,以此来构建一个单体镜像,包含了前后端.有些情况是前后端 ...

  9. 【Android Gradle】安卓应用构建流程 ( 资源文件编译 )

    文章目录 一.资源文件编译 二.AndroidManifest.xml 清单文件编译 一.资源文件编译 参考 [Android 安装包优化]资源混淆 ( AAPT2 资源编译工具 | resource ...

最新文章

  1. 无数学不华为?人工智能时代的数学家还将走得更远
  2. javascript中replace使用方法总结
  3. python核心数据类型_Python核心数据类型-列表
  4. centos 7挂载windows共享目录
  5. 为什么一定要回家?因为我们是中国人
  6. 刚开始学ASP+ACCESS时,该注意的事项
  7. python 数据结构 基础
  8. Tensorflow 2 循环神经网络 GRU 豆瓣IMDB影评数据集训练模型
  9. Python面试题解答——第一部分
  10. 根据varchar排列是怎么比大小的_骨架大小怎么看?肩宽、胸腔宽、胯宽是关键,加码大骨架穿搭技巧...
  11. SqlServer中 Partition By 的使用
  12. 《编码规范和测试方法——C/C++版》学习笔记 ·001
  13. CentOS 7安装之后的七个事
  14. php判断学生姓名,PHP基础案例三:判断学生星座
  15. 复制id_rsa命令
  16. struct (5.31)
  17. dlp型3d打印机_创想三维一台3d打印机是多少钱
  18. 聊一聊DTM子事务屏障功能之SQL Server版
  19. git命令 之 切糕大全
  20. dnmap分布式集群扫描

热门文章

  1. 假币问题 (java)居然有假币!!!
  2. 聚划算的下沉市场生意
  3. Java 最常见 200+ 面试题全解析:面试必备(2019)
  4. 解决ip经常变动的问题
  5. JavaScript学习笔记——JS基础0
  6. 映射、散射、漫射、影射
  7. 另类的 ETL 工具 sed 进阶
  8. MHDD硬盘坏道检测修复教程(转)
  9. 软件测试有效性指标,如何衡量软件测试的有效性?
  10. luogu 1077