新手区 自动打包平台

xiaoluosun · 发布于 2017年03月01日 · 最后由 friday 回复于 2017年03月24日 · 3424 次阅读
本帖已被设为精华帖!

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

自动打包的流程

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()

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 31 条回复
1楼 已删除
3341

我来点个赞

104 seveniruby 将本帖设为了精华贴 03月01日 17:20
104

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

4817

Xcrun在xcode 8上还能用?

9492
4817xiaobeiying 回复

刚试过,可以

9fa33f

不错哈

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

3206
4817xiaobeiying 回复

恩,可以的

9260

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

4365

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

96

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

3206
xiaoluosun · #12 · 2017年03月02日 作者
4365neyo 回复

fastlane不错

3206
xiaoluosun · #13 · 2017年03月02日 作者
32lishenghong 回复

分析下报错

3206
xiaoluosun · #14 · 2017年03月02日 作者
9260willys 回复

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

9fa33f

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

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

3206
xiaoluosun · #16 · 2017年03月03日 作者
9fa33fhu_qingen 回复

😅 没检查,,谢了

4093

@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"
   },

3206
xiaoluosun · #18 · 2017年03月06日 作者
4093diao2007 回复

👍赞

2316


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

3206
xiaoluosun · #20 · 2017年03月06日 作者
2316charles 回复

如果用的gitlab

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

原来你喜欢这样风格的😆

3206
xiaoluosun · #22 · 2017年03月06日 作者
6109debugtalk 回复

6241

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

96

666,明昌也要出道了~

3206
xiaoluosun · #25 · 2017年03月19日 作者
32gaopeng1106 回复

😓

3206
xiaoluosun · #26 · 2017年03月19日 作者
6241xxoomyoppo 回复

微信:xiaoluosun

4503

6666.

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

104

记得更新打赏二维码

3206
xiaoluosun · #29 · 2017年03月20日 作者
104seveniruby 回复

😬更新了

13516


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

3206
xiaoluosun · #31 · 2017年03月21日 作者
13516friday 回复

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

13516
3206xiaoluosun 回复

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

13516
13516friday 回复





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

9fa33f hu_qingen 开源:App 发布平台--服务和前端实现 中提及了此贴 04月19日 18:19
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册