新手区 自动打包平台

xiaoluosun · March 01, 2017 · Last by 文若 replied at August 04, 2023 · 3738 hits
本帖已被设为精华帖!

记录之前做过的一些东西,避免忘了。。。

自动打包的流程

Jenkins 配置项目

源码管理

构建触发器

一分钟查询一次 Git 服务器的代码是否有提交

Android Gradle 编译

-Plog_enable_cmd='true'    是否开启log开关(线上设置的false)
-Pserver_environment_cmd='测试'    传一个全局属性,编译指定的环境
-q config    执行config任务,使上面两个全局属性生效

iOS xcodebuild 编译

xcodebuild先编译成.app文件
-workspace  工程的.xcworkspace路径
-scheme  在工程目录下,xcodebuild -list查询
-configuration  在xcode新建三个configuration,用以区分测试、仿真、线上环境
-derivedDataPath build目录

xcrun把.app文件编译成.ipa文件
-sdk  iOS sdk,iphoneos是真机
-v 要编译的.app文件路径
-o .ipa输出路口

构建后操作

执行 Python 脚本,做以下的事情:

1. 拿到此次编译的环境和版本号(到项目文件查询)
2. 修改安装包名字,格式:项目名_版本号_环境_时间戳.apk
3. 生成下载地址二维码和下载页(每个app都有自己的二维码下载地址和下载页,类似蒲公英,扫描二维码跳转app下载页)
4. iOS每个安装包需要配置一个plist文件,配置app信息,用于下载 (下面有模板)
5. 上传二维码图片、下载页和安装包到下载服务器
6. 保存安装包数据到数据库

iOS 的安装命令(在下载页的 “下载安装” 按钮里配置的此命令)

下面的命令可以在线安装 iOS 的 ipa 安装包,url 后面跟 plist 文件地址
plist 文件里面要配置你的安装包的一些信息,下面有模板。
每次执行 python 脚本的时候生成一个 plist 文件用于下载

itms-services://?action=download-manifest&url=plist文件url

plist 文件模板

<plist version="1.0">
<dict>
    <key>items</key>
    <array>
        <dict>
            <key>assets</key>
            <array>
                <dict>
                    <key>kind</key>
                    <string>software-package</string>
                    <key>url</key>
                    <string>此处填写ipa文件的下载地址,如http://xxx.xxx/xxxx.ipa</string>
                </dict>
            </array>
            <key>metadata</key>
            <dict>
                <key>bundle-identifier</key>
                <string>此处填写工程的bundle-identifier</string>
                <key>bundle-version</key>
                <string>此处填写工程的版本号</string>
                <key>kind</key>
                <string>software</string>
                <key>title</key>
                <string>&#24471;</string>
            </dict>
        </dict>
    </array>
</dict>
</plist>

生成二维码

def gen_qrcode(install_app, config_info, file_name, ftp_url, project_path):
    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_L,
        box_size=4,
        border=1
    )

    image_name = file_name.replace(".ipa", "") + ".png"
    qr.add_data(install_app)
    qr.make(fit=True)
    img = qr.make_image()
    img.save(project_path + image_name)

编译失败发送报警邮件

用的 Editable Email Notification 插件

下载页面

数据库表

CREATE TABLE `app_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `app_name` varchar(150) DEFAULT NULL COMMENT '安装包名称',
  `os_name` varchar(50) DEFAULT NULL COMMENT '手机系统(Android, IOS)',
  `config` varchar(50) DEFAULT NULL COMMENT '环境(测试-1,仿真-2,线上-3)',
  `versions` varchar(50) DEFAULT NULL COMMENT '版本号',
  `app_path` varchar(200) DEFAULT NULL COMMENT '安装包地址',
  `qrcode_path` varchar(150) DEFAULT NULL COMMENT '二维码图片地址',
  `app_time` datetime DEFAULT NULL COMMENT '安装包生成时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1624 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

下载页源码
Eclipse 可直接导入

APP 下载主页

扫描二维码下载页

def create_html(file_path, html_name, install_app):

    print "生成html文件"
    file = open(file_path + "html/" + html_name, 'w')
    file.write(u'\
        <html lang=zh-cmn-Hans> \
        <head> \
            <meta charset="utf-8"> \
            <title>安装APP</title> \
            <link href="index.css" rel="stylesheet" type="text/css" /> \
        </head> \
        <body> \
            <div id="" class="view row" style="margin-top:30px;"> \
                <div class="span12 margin-bottom-20" style="text-align:center;"> \
                    <div class="spinner"> \
                        <div id="showtext"><font size="7" color="red">请用浏览器打开</font></div> \
                        <div id="showtext"><font size="7" color="red">点击安装后,请按 Home 键在桌面查看</font></div> \
                        <a href="' + 
                        install_app + 
                        '" id="down_load" class="btn-u btn-u-lg btn-u-green"><i class="fa fa-download"></i> 点击安装</a> \
                   </div> \
                </div> \
            </div> \
        </body> \
        </html> \
    ')

    file.close()

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 32 条回复 时间 点赞
1Floor has deleted

我来点个赞

思寒_seveniruby 将本帖设为了精华贴 01 Mar 17:20

加精理由: 简明扼要.值得参考

Xcrun 在 xcode 8 上还能用?

小背影 回复

刚试过,可以

不错哈

—— 来自 TesterHome 官方 安卓客户端

小背影 回复

恩,可以的

ios 如果要做真机调试的话,构建持续集成的意义大吗?

挺好的,和我这边的差不多。ios 打包我们用 fastlane

Android 使用 gradle build 命令打包一直 crash,请教下是什么问题啊?

songz 回复

fastlane 不错

李胜红 回复

分析下报错

willys 回复

看你们自己,持续集成的意义是很大的,不管对什么测试

楼主,今天看了下你的源码,你上传 github 时没删除 target 文件。里面的 class 文件有你不想暴露的信息

—— 来自 TesterHome 官方 安卓客户端

CC 回复

😅 没检查,,谢了

@xiaoluosun 我搭建的持续集成平台(可能还比较基础,还不能叫平台)也是基于 jenkins,iOS 用了 fastlane,安卓比较简单就是用的 gradle,回收日志和 archive 文件用 flask 写的服务,把所有 job 执行的记录都归档,其中的一个 job 记录。只是写了 api。

{
       "build_cause": "TIMERTRIGGER", 
       "job_display_name": "XX自动化测试 #15547", 
       "ts_str": "20170304_13_30_59", 
       "log_url": "XX_13_30_59.log", 
       "build_url": "XXX", 
       "result": "FAILURE", 
       "duration": "00时03分14秒", 
       "id": 79, 
       "archive_url": "XXX/archive_20170304_13_30_59.tgz", 
       "ts": 1488605459, 
       "trigger": "timer", 
       "job_base_name": "XXX", 
       "job_name": "XXX"
   },

不二家 回复

👍赞


你们有碰到这个问题吗,已经在 gitlab 那边添加了 deploy key 了。

aabbcc 回复

如果用的 gitlab

  1. 在 gitlab 添加你的 key 和 repository 的权限
  2. Jenkins 装 gitlab 相关插件并在系统管理配置 connections 信息,然后在项目配置直接用。

原来你喜欢这样风格的😆

debugtalk 回复

楼主留个方便联系的方式不 ,请教下自动打包问题

666,明昌也要出道了~

零贰陆 回复

😓

萧帅 回复

微信:xiaoluosun

6666.

—— 来自 TesterHome 官方 安卓客户端

记得更新打赏二维码

😬更新了


大神,为什么我的这个和你的不一样啊,有什么版本之分吗,我这个是 windows 的,应该选择哪个可以继续按照你的流程进行呢?

123456 回复

你是要用 execute a set of scripts 执行脚本?需要安装个插件 Post-Build Script

xiaoluosun 回复

大神,谢谢你的回复,我是第一次弄这个打包平台,很蒙的状态,不太明白 jenkins 里的 git repositories url 怎么写啊,具体是怎么回事

123456 回复





大神,我第一次搞这个 Jenkins 打包,实在是懵逼,我现在就是不明白,我的那个 git 为什么是错误的,还有就是 build.gradle 是怎么回事,是把代码放在里面吗,然后放在哪个目录下呢?

CC 开源:App 发布平台 -- 服务和前端实现 中提及了此贴 19 Apr 18:19

源码在 github 上找不到了

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up