Gitlab-CI自动化打包之Runner配置和CI脚本说明

Gitlab-CI自动化CocosCreator安卓打包之Runner配置和CI脚本说明

一. 新建打包工程

在gitlab上新建一个打包工程目录,比如auto_build_game_apk(https://gitlab.com/CocosTool/auto_build_game_apk),必须获取工程的master权限。

示例Cocos Hello World工程:https://gitlab.com/CocosTool/cocos_example

二. Runner配置

  1. 安装Runner

    https://docs.gitlab.com/runner/install/
    下载对应平台源文件,我这里以win10为例。

    在任意位置,新建文件夹GitLab-Runner,将gitlab-runner-windows-386.exe放入重命名gitlab-runner.exe,然后命令行执行安装。

    cd C:\GitLab-Runner
    //无用户安装,由于此时运行runner时使用的并不是当前系统账号,后面使用git的时候会有权限问题,不推荐
    ./gitlab-runner.exe install
    
    //以当前管理员账号安装
    ./gitlab-runner.exe install --user ENTER-YOUR-USERNAME --password ENTER-YOUR-PASSWORD
    //如果提示账号不存在,尝试添加.\
    ./gitlab-runner.exe install --user ".\ENTER-YOUR-USERNAME" --password "ENTER-YOUR-PASSWORD"
    
    //启动runner
    ./gitlab-runner.exe start
    
    //停止runner
    ./gitlab-runner.exe stop
    
  2. 注册Runner

    gitlab的工程界面,进入Settings => CI/CD => Runners settings 获取相关参数,如图:
    runner-register-var.png

    运行以下命令:

    gitlab-runner register
    

    输入您的GitLab实例URL:

    Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
    https://gitlab.com/
    

    输入您获得的令牌以注册Runner:

    Please enter the gitlab-ci token for this runner
    4G257zVcnRJzxjGd3evs
    

    输入Runner的描述,您可以稍后在GitLab的UI中更改:

    Please enter the gitlab-ci description for this runner
    my-runner
    

    输入与Runner关联的标签,您可以稍后在GitLab的UI中更改:

    Please enter the gitlab-ci tags for this runner (comma separated):
    my-tag
    

    输入Runner执行程序:

    Please enter the executor: parallels, shell, kubernetes, custom, docker-ssh, ssh, virtualbox, docker+machine, docker-ssh+machine, docker, docker-windows:
    shell
    

    注册完成后可在gitlab页面看到一个新的runner:


    runner-state.png

    我这边是将机器的tag命名为my-tag,这个后面写CI脚本时指定Runner需要用到。

    如果启动时遇到FATAL: Failed to start gitlab-runner: The service did not start due to a logon failure.按以下步骤可解决:
    计算机管理 => 服务 => gitlab-runner =>登录 重新输入密码即可

三. CI/CD脚本编写

新建脚本文件.gitlab-ci.yml:

stages:
- prepare
- build
- notice

prepare_out:
  stage: prepare
  script:
  - python ./prepare.py
  only:
  - web
  - triggers
  artifacts:
    paths:
      - config/
    when: on_success
  tags:
  - my-tag

build_apk_cocos:
  stage: build
  script:
  - python ./build_cocos.py
  only:
    variables:
      - $build_apk == "true"
  tags:
  - my-tag

notice_job:
  stage: notice
  script:
  - python ./notice.py
  only:
  - web
  - triggers
  tags:
  - my-tag
  1. my-tag 替换成你自己的Runner的tag。
  2. only下面的配置表示只有在gitlab网页操作和Pipeline triggers时才会触发
only:
  - web
  - triggers
  1. 配置Pipeline triggers:
    gitlab的工程界面,进入Settings => CI/CD => Pipeline triggers 配置相关参数
    Add trigger 然后会获取一个token,页面下方会有具体请求的URL,variables用来传参数给执行runner的环境变量如:

    curl -X POST \
      -F token=TOKEN \
      -F "ref=REF_NAME" \
      -F "variables[RUN_NIGHTLY_BUILD]=true" \
      https://gitlab.com/api/v4/projects/15418684/trigger/pipeline
    

    以cocos_example为例,用PostMan进行测试:

    Post请求Url:
        https://gitlab.com/api/v4/projects/15418684/trigger/pipeline
    Body:
        token:437ad5074f67b38e5b97699f004a56
        ref:master
        variables[branch]:master
        variables[client_version]:1
        variables[client_version_code]:100
        variables[dingding_open]:true
        variables[build_apk_res]:false
        variables[build_apk_dev]:true
        variables[cocos_version_code]:212
        variables[build_apk]:true
        variables[hotupdate_packageUrl]:https://cdn.wxgame.youxi765.com/ylcy/remote_assets
        variables[hotupdate_packageVersion]:2.0.0.8
        variables[outPut_suffix]:patch_2008
        variables[is_skip_u8]:true
        variables[gameConfig_client_version]:200011018002
        variables[outPut_dir]:D:/outPutDir/apk
    

    各个参数说明:

    branch:要打包apk的分支
    client_version:apk版本名
    client_version_code:apk版本号
    dingding_open:是否打开钉钉通知
    build_apk_res:是否连接正式服
    build_apk_dev:是否连接测试服
    cocos_version_code:cocos creator的版本
    build_apk:是否构建apk
    hotupdate_packageUrl:热更新地址
    hotupdate_packageVersion:热更新版本号
    outPut_suffix:生成的apk命名的后缀添加
    is_skip_u8:是否跳过U8,登录广告等接口默认成功
    gameConfig_client_version:游戏客户端版本号
    outPut_dir:apk输出路径
    
    //以下可不传,用默认的配置
    game_name:游戏名字
    game_config_path:游戏配置文件的路径
    hotupdate_config_path:热更新文件的路径
    
  2. 修改Python脚本
    ciparams.py文件:

    修改为当前目标打包工程路径
    self.root_dir = r'H:/Code/ylcy'
    
    修改游戏配置文件的路径
    self.game_config_path = r'/client/assets/resources/game_config/game_config.json'
    if "game_config_path" in os.environ:
        self.game_config_path = os.environ["game_config_path"]
    
    修改游戏热更新文件的路径
    self.hotupdate_config_path = r'/client/PluginDir/hotUpdate/cfg.json'
    if "hotupdate_config_path" in os.environ:
        self.hotupdate_config_path = os.environ["hotupdate_config_path"]
    

    game_config的修改需要游戏自己具体实现,cocos_example中已经实现的修改配置

    {
        "version":124011015001,
        "is_dev":true,
        "is_skip_u8":true
    }
    

    hotupdate_config_path依赖cocos的构建完自动替换热更新文件的插件.

  3. 修改安卓工程

    修改gradle脚本支持修改Apk的versionCode,versionName,文件名字及Apk输出路径

    proj.android-studio => app => build.gradle

    defaultConfig {
         if (project.hasProperty('VERSION_CODE_PARA')) {
             versionCode Integer.parseInt(VERSION_CODE_PARA)
         }
         else{
             versionCode 1
         }
         if (project.hasProperty('VERSION_NAME_PARA')) {
             versionName VERSION_NAME_PARA
         }
         else{
             versionName "1.0.0"
         }
    }
    
    buildTypes {
         release {
             android.applicationVariants.all { variant ->
                 variant.outputs.all { output ->
                     def outputFile = output.outputFile
                     if (outputFile != null && outputFile.name.endsWith('.apk')) {
                         def fileName = outputFile.name;
                         if (project.hasProperty('OUT_PUT_APK_FILE_NAME')) {
                             fileName = "${OUT_PUT_APK_FILE_NAME}";
                         }
                         if (project.hasProperty('OUT_PUT_DIR_PARA')) {
                             File output_dir1 = file("${OUT_PUT_DIR_PARA}");
    
                             println "输出文件位置: " + output_dir1
                             variant.getPackageApplication().outputDirectory = output_dir1
                             outputFileName = fileName;
                             println "输出文件位置: " + output.outputFile
                         } else {
                             outputFileName = fileName
                             println "输出文件位置: " + output.outputFile
                         }
                     }
                 }
             }
         }
    
  4. 开始正式打包

    在Runner的机子上,先手动构建一次Cocos Creator工程,将打包相关配置都配置好,确认Android studio能生成正常的Apk.
    用PostMan抛送Post请求,触发Pipeline trigger,开始自动构建
    notice_job 用来触发打包完成通知
    由于打包完成后包在本地,所以需要在本机上建了一个web服务,支持指定目录的文件下载。参考Win10搭建web服务实现文件共享

    修改notice.py文件:

    if ci_params.dingding_open != 'false':
        apk_name = ci_params.apk_name
    
        msg = '#### 打包完成 '
        if ci_params.build_apk != 'false':
            root_url = 'YOUR_WEB_DOWNLOAD_URL'#替换下载地址,例如root_url = 'http://10.0.19.61/apk/'
            if ci_params.build_apk_dev != 'false':
                msg += '\n> 安卓_连测试服包:'+apk_name+'[点击下载](' + root_url + apk_name + ')'
            if ci_params.build_apk_res != 'false':
                msg += '\n\n> 安卓_连正式服包:'+apk_name+'[点击下载](' + root_url + apk_name + ')'
    
        dingding.sendMarkdown(cmd_logger, '打包完成,抓紧测试', msg, True)
    

    修改dingding.py文件:
    dingding_url1,dingding_url2替换成对应游戏打包群的地址

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容