title: 上传安装包到 Bugly 发布平台脚本 date: 2016-07-17 20:45:00 categories:

  • CI feature: /images/logo/bugly-logo.webp tags:
  • Ant
  • Shell
  • Bugly toc: true

由于使用了 curl 命令,因此在 windows 平台运行脚本需要先安装 curl 才能执行。


#!/bin/sh
# -*- coding: UTF-8 -*-

set -e

function echo_green()
 {
    echo "\033[32m $1 \033[0m"
 }

function echo_red() 
 {
    echo "\033[31m $1 \033[0m"
 }

function echo_blue()
 {
    echo "\033[36m $1 \033[0m" 
 }
 
function get_ios_project_version()
{
    local info_plist_path=$1
    local version=$(/usr/libexec/PlistBuddy -c "print CFBundleVersionString" ${info_plist_path})
    local build=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" ${info_plist_path})
    echo "${versoin}-${build}"
    
    return 0;
}
 
function get_json_value()
{
    local json=$1
    local key=$2
    local num=1
    
    local value=$(echo "${json}" | awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/'${key}'\042/){print $(i+1)}}}' | tr -d '"' | sed -n ${num}p)
    
    echo ${value}
    
    return 0;
}

function bugly_upload()
{
    local app_key="bugly_app_key"
    local app_id="bugly_app_id"
    local url=https://api.bugly.qq.com/beta/apiv1/exp?app_key=${app_key}

    local pid="1"
    local title="Bugly Upload Shell Script Example"
    local description="Bugly Upload Shell Script Example"
    local secret="1"
    local password=""
    local users=""
    local download_limit="1000"
    
    local response=$(curl --insecure -F "file=@$1" -F "app_id=${app_id}" -F "pid=${pid}" -F "title=${title}" -F "description=${description}" -F "secret=${secret}" -F "password=${password}" -F "users=${users}" -F "download_limit=${download_limit}" ${url})

    echo ${response}

    return 0;   
}
 
function parse_bugly_response()
{
    local json=$1
    
    local code=$(get_json_value "${json}" "rtcode")
    local msg=$(get_json_value "${json}" "msg")
    
    if [[ "${code}" = "0" ]]; then
        bugly_download_url=$(echo $json | sed -e 's/^.*"url":"\([^"]*\)".*$/\1/')
        echo_blue "Upload Bugly Success"
        echo_blue "Bugly Download URL : ${bugly_download_url}"
    else
        echo_red "Upload Bugly Fail"
    fi

    return 0;
}


if [[ -f "$1" ]]; then

    echo_green "Start Bugly Upload"
    
    bugly_upload_json=$(bugly_upload $1)
    echo ${bugly_upload_json}
    
    echo_green "Bugly Request Success"
    echo_green "==========================================================="
    parse_bugly_response "${bugly_upload_json}"
    echo_green "==========================================================="
fi

将需要发送的安装包路径作为参数传入即可,路径需要是绝对路径,注意根据平台修改 pid 的值。

./bugly.sh /home/user/myapp.ipa

可以根据需要使用 get_ios_project_version 函数获取项目的版本号与 build 号。

<?xml version="1.0" encoding="UTF-8"?>
<project name="Bugly" default="bugly">

  <target name="bugly" depends="-bugly-default-config,-bugly-report" >
    <echo message="Upload File To Bugly" />
  </target>

  <target name="-bugly-default-config">
    <echo message="Bugly Default Config" />
    <property name="bugly.secret" value="1"/>
    <property name="bugly.password" value="" />
    <property name="bugly.download_limit" value="1000" />
  </target>
	
  <target name="-bugly-upload" >
    <echo message="Start Upload" />
    <exec executable="curl" outputproperty="bugly.json" failifexecutionfails="true">
      <arg value="-s" />
      <arg value="-F" />
      <arg value="file=@${bugly.upload.file}" />
      <arg value="-F" />
      <arg value="app_id=${bugly.app_id}" />
      <arg value="-F" />
      <arg value="pid=${bugly.pid}" />
      <arg value="-F" />
      <arg value="title=${bugly.title}" />
      <arg value="-F" />
      <arg value="description=${bugly.description}" />
      <arg value="-F" />
      <arg value="secret=${bugly.secret}" />
      <arg value="-F" />
      <arg value="password=${bugly.password}" />
      <arg value="-F" />
      <arg value="users=${bugly.users}" />
      <arg value="-F" />
      <arg value="download_limit=${bugly.download_limit}" />
      <arg value="https://api.bugly.qq.com/beta/apiv1/exp?app_key=${bugly.app_key}"/>
    </exec>
  </target>

  <target name="-check-bugly-json" depends="-bugly-upload">
    <echo message="Check Return Response" />
    <condition property="isUploadFail">
      <equals arg1="${bugly.json}" arg2="" />
    </condition>
  </target>
  
  <target name="-get-bugly-error-info" unless="isUploadFail" depends="-check-bugly-json">
    <echo message="Get Return Response Info" />

    <script language="javascript">
      var jsonString = project.getProperty("bugly.json");
      var json = eval ("(" + jsonString + ")");
      project.setProperty("bugly.json.rtcode",json.rtcode);
      project.setProperty("bugly.json.msg",json.msg);
    </script>

    <condition property="isUploadError">
      <not>
        <equals arg1="${bugly.json.rtcode}" arg2="0" />
      </not>
    </condition>
    <echo message="${bugly.json.rtcode}" />
    <echo message="${bugly.json.msg}" />
  </target>
  
  <target name="-get-bugly-url" unless="isUploadError" depends="-get-bugly-error-info">
    <echo message="Get Bugly Download Url" />

    <script language="javascript">
      var jsonString = project.getProperty("bugly.json");
      var json = eval ("(" + jsonString + ")");
      project.setProperty("bugly.url",json.data.url);
    </script>
    <property name="bugly.result.message" value="Upload Success" />
    <echo message="${bugly.url}" />
  </target>

  <target name="-bugly-report" depends="-get-bugly-url" >
    <echo message="Upload Report" />
    <exec executable="date" outputproperty="bugly.report.time" failifexecutionfails="false" errorproperty="DateError">
      <arg value="+%Y-%m-%d-%H:%M" />
    </exec>
    <property name="bugly.json.msg" value="Execution Curl Fail" />
    <property name="bugly.result.message" value="Upload Fail" />
    <property name="build.report.bugly" value="${bugly.result.message}${line.separator}Return Msg:${bugly.json.msg}${line.separator}Retrun Code:${bugly.json.rtcode}" />
    
    <echo message="${build.report.bugly}" />
  </target>

</project>
  • bugly_url app_id app_key 根据实际情况填写。
  • 需要回传获取到是否发送成功的状态,所以调用时需要注意方式。
  • 可以通过ant -buildfile bugly.xml -Dbugly.upload.file=file_path的方式调用。
  <target name="-bugly" depends="-bugly-config, bugly" >
    <echo message="Upload To Bugly" />
    <property name="build.file.url" value="https://${bugly.url}" />
  </target>
  
  <target name="-bugly-config" />
    <property name="bugly.app_id" value="bugly_app_id" />
    <property name="bugly.app_key" value="bugly_app_key" />
    <property name="bugly.upload.file" value="upload_file_path" />
    <property name="bugly.pid" value="2" />
    <property name="bugly.title" value="${ant.project.name} - IOS [${build.config.name}] Tag:${cvs.tag} Commit:${cvs.commit}" />
    <property name="bugly.description" value="${build.type}${line.separator}${cvs.log}" />
  </target>