From e6211b8799a16e466cb6cff13b01feca85856c0c Mon Sep 17 00:00:00 2001 From: Daniel Agar Date: Sat, 31 Oct 2015 22:17:27 -0400 Subject: [PATCH] android auto version and deploy to google play --- .travis.yml | 5 + android/AndroidManifest.xml | 2 +- ...lay_Android_Developer-bb93ae7d61ca.p12.enc | Bin 0 -> 2576 bytes tools/google_play_upload.py | 96 ++++++++++++++++++ tools/update_android_version.sh | 11 ++ 5 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 android/Google_Play_Android_Developer-bb93ae7d61ca.p12.enc create mode 100755 tools/google_play_upload.py create mode 100755 tools/update_android_version.sh diff --git a/.travis.yml b/.travis.yml index 33e715444..0075bdb16 100644 --- a/.travis.yml +++ b/.travis.yml @@ -65,6 +65,7 @@ cache: before_install: + - openssl aes-256-cbc -K $encrypted_25db6eb7c3fd_key -iv $encrypted_25db6eb7c3fd_iv -in android/Google_Play_Android_Developer-bb93ae7d61ca.p12.enc -out android/Google_Play_Android_Developer-bb93ae7d61ca.p12 -d - cd ${TRAVIS_BUILD_DIR} && git fetch --unshallow && git fetch --tags - if [ "${TRAVIS_OS_NAME}" = "linux" ]; then mkdir -p ~/.config/QtProject/ && cp ${TRAVIS_BUILD_DIR}/test/qtlogging.ini ~/.config/QtProject/; fi - if [ "${TRAVIS_OS_NAME}" = "osx" ]; then mkdir -p ~/Library/Preferences/QtProject/ && cp ${TRAVIS_BUILD_DIR}/test/qtlogging.ini ~/Library/Preferences/QtProject/; fi @@ -111,6 +112,7 @@ before_script: - if [ "${CONFIG}" != "doxygen" ]; then qmake -r qgroundcontrol.pro CONFIG+=${CONFIG} CONFIG+=WarningsAsErrorsOn -spec ${SPEC}; fi script: + - ./tools/update_android_version.sh - echo 'Building QGroundControl' && echo -en 'travis_fold:start:script.1\\r' - if [ "${CONFIG}" != "doxygen" ]; then make -j4; fi - if [ "${CONFIG}" = "doxygen" ]; then cd src && doxygen documentation.dox; fi @@ -118,6 +120,9 @@ script: - if [[ "${TRAVIS_OS_NAME}" = "linux" && "${CONFIG}" = "debug" ]]; then ./debug/qgroundcontrol --unittest; fi - if [[ "${TRAVIS_OS_NAME}" = "osx" && "${CONFIG}" = "debug" ]]; then ./debug/qgroundcontrol.app/Contents/MacOS/qgroundcontrol --unittest; fi +after_success: + - if [[ "${TRAVIS_OS_NAME}" = "android" && "${TRAVIS_PULL_REQUEST}" = "false" && "${TRAVIS_BRANCH}" = "master" ]]; then ./tools/google_play_upload.py org.mavlink.qgroundcontrol release/package/qgroundcontrol.apk; fi + deploy: - provider: s3 access_key_id: AKIAIVORNALE7NHD3T6Q diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index f12cfaa27..954d43bc1 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -1,5 +1,5 @@ - + diff --git a/android/Google_Play_Android_Developer-bb93ae7d61ca.p12.enc b/android/Google_Play_Android_Developer-bb93ae7d61ca.p12.enc new file mode 100644 index 0000000000000000000000000000000000000000..22c154d6fb4ad72b63667f87fba1aaf88b4e674a GIT binary patch literal 2576 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 literal 0 HcmV?d00001 diff --git a/tools/google_play_upload.py b/tools/google_play_upload.py new file mode 100755 index 000000000..9d0ce4156 --- /dev/null +++ b/tools/google_play_upload.py @@ -0,0 +1,96 @@ +#!/usr/bin/python +# +# Copyright 2014 Marta Rodriguez. +# +# Licensed under the Apache License, Version 2.0 (the 'License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Uploads an apk to the beta track.""" + +import argparse + +from apiclient.discovery import build +import httplib2 +from oauth2client import client + +TRACK = 'beta' # Can be 'alpha', beta', 'production' or 'rollout' +SERVICE_ACCOUNT_EMAIL = ( + '868554619222-u4gvu4asjemc8n22o595j0fr2dg4012j@developer.gserviceaccount.com') + +# Declare command-line flags. +argparser = argparse.ArgumentParser(add_help=False) +argparser.add_argument('package_name', + help='The package name. Example: com.android.sample') +argparser.add_argument('apk_file', + nargs='?', + default='qgroundcontrol.apk', + help='The path to the APK file to upload.') + + +def main(): + # Load the key in PKCS 12 format that you downloaded from the Google APIs + # Console when you created your Service account. + f = file('android/Google_Play_Android_Developer-bb93ae7d61ca.p12', 'rb') + key = f.read() + f.close() + + # Create an httplib2.Http object to handle our HTTP requests and authorize it + # with the Credentials. Note that the first parameter, service_account_name, + # is the Email address created for the Service account. It must be the email + # address associated with the key that was created. + credentials = client.SignedJwtAssertionCredentials( + SERVICE_ACCOUNT_EMAIL, + key, + scope='https://www.googleapis.com/auth/androidpublisher') + http = httplib2.Http() + http = credentials.authorize(http) + + service = build('androidpublisher', 'v2', http=http) + + # Process flags and read their values. + flags = argparser.parse_args() + + package_name = flags.package_name + apk_file = flags.apk_file + + try: + edit_request = service.edits().insert(body={}, packageName=package_name) + result = edit_request.execute() + edit_id = result['id'] + + apk_response = service.edits().apks().upload( + editId=edit_id, + packageName=package_name, + media_body=apk_file).execute() + + print 'Version code %d has been uploaded' % apk_response['versionCode'] + + track_response = service.edits().tracks().update( + editId=edit_id, + track=TRACK, + packageName=package_name, + body={u'versionCodes': [apk_response['versionCode']]}).execute() + + print 'Track %s is set for version code(s) %s' % ( + track_response['track'], str(track_response['versionCodes'])) + + commit_request = service.edits().commit( + editId=edit_id, packageName=package_name).execute() + + print 'Edit "%s" has been committed' % (commit_request['id']) + + except client.AccessTokenRefreshError: + print ('The credentials have been revoked or expired, please re-run the ' + 'application to re-authorize') + +if __name__ == '__main__': + main() diff --git a/tools/update_android_version.sh b/tools/update_android_version.sh new file mode 100755 index 000000000..e1792e1d3 --- /dev/null +++ b/tools/update_android_version.sh @@ -0,0 +1,11 @@ +#! /bin/bash + +VERSIONCODE=`git rev-list master --first-parent --count` +VERSIONNAME=`git describe --always --tags | sed -e 's/^v//'` + +echo "VersionCode: ${VERSIONCODE}" +echo "VersionName: ${VERSIONNAME}" + +sed -i -e "s/android:versionCode=\"[0-9][0-9]*\"/android:versionCode=\"${VERSIONCODE}\"/" android/AndroidManifest.xml +set -i -e "s/android:versionName=\".*\"/android:versionName=\"${VERSIONNAME}\"/" android/AndroidManifest.xml + -- 2.22.0