From 5b46e0a4bef24e1c1302ba3ca40a99bd20a192da Mon Sep 17 00:00:00 2001 From: xster Date: Mon, 5 Feb 2018 12:00:24 -0800 Subject: [PATCH] Let Travis build the gallery and push to TestFlight / Play Store (#14408) * iOS works * Works on Android * Take in commit number in iOS also. Get rid of image upload for Android. It's just a waste of bandwidth * Tweak to fix on Travis --- .travis.yml | 9 ++++- dev/bots/travis_install.sh | 1 + dev/bots/travis_script.sh | 38 ++++++++++++++++++ dev/bots/travis_setup.sh | 28 +++++++++++++ dev/bots/travis_upload.sh | 11 ----- .../flutter_gallery/android/app/build.gradle | 13 +++++- .../flutter_gallery/android/fastlane/Fastfile | 9 +++-- .../metadata/android/en-US/images/icon.png | Bin 3381 -> 0 bytes .../flutter_gallery/ios/fastlane/Fastfile | 27 ++++++++----- 9 files changed, 107 insertions(+), 29 deletions(-) create mode 100755 dev/bots/travis_script.sh delete mode 100755 dev/bots/travis_upload.sh delete mode 100644 examples/flutter_gallery/android/fastlane/metadata/android/en-US/images/icon.png diff --git a/.travis.yml b/.travis.yml index 51dccfd78c5..f3f4c815c1e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,16 +2,21 @@ os: - linux - osx +osx_image: xcode9.2 env: - SHARD=analyze - SHARD=tests - SHARD=docs + - SHARD=build_and_deploy_gallery matrix: exclude: - os: osx env: SHARD=analyze - os: osx env: SHARD=docs + # TODO(xster): remove this when we know it works on Travis. + allow_failures: + - env: SHARD=build_and_deploy_gallery sudo: false filter_secrets: false @@ -22,6 +27,7 @@ addons: sources: - ubuntu-toolchain-r-test # if we don't specify this, the libstdc++6 we get is the wrong version packages: + - lib32stdc++6 - libstdc++6 - fonts-droid language: node_js @@ -31,6 +37,7 @@ git: # We rely on git tags for determining the version. depth: false cache: + bundler: true directories: - $HOME/.pub-cache install: @@ -41,4 +48,4 @@ before_script: - ./dev/bots/travis_setup.sh script: - ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976 - - (./bin/cache/dart-sdk/bin/dart ./dev/bots/test.dart && ./dev/bots/travis_upload.sh) + - ./dev/bots/travis_script.sh diff --git a/dev/bots/travis_install.sh b/dev/bots/travis_install.sh index 041ce1745e8..bee490c0fec 100755 --- a/dev/bots/travis_install.sh +++ b/dev/bots/travis_install.sh @@ -3,5 +3,6 @@ set -ex if [ -n "$TRAVIS" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then gem install coveralls-lcov + gem install bundler npm install -g firebase-tools@">=3.6.1 <3.7.0" fi diff --git a/dev/bots/travis_script.sh b/dev/bots/travis_script.sh new file mode 100755 index 00000000000..982d3b17cb5 --- /dev/null +++ b/dev/bots/travis_script.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +set -ex + +export PATH="$PWD/bin:$PWD/bin/cache/dart-sdk/bin:$PATH" + +if [ "$SHARD" = "build_and_deploy_gallery" ]; then + echo "Building and deploying Flutter Gallery" + if [ "$TRAVIS_OS_NAME" = "linux" ]; then + echo "Building Flutter Gallery for Android..." + export ANDROID_HOME=`pwd`/android-sdk + (cd examples/flutter_gallery; flutter build apk --release) + echo "Android Flutter Gallery built" + if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then # TODO(xster): add back && [ "$TRAVIS_BRANCH" = "dev" ] after testing + echo "Deploying to Play Store..." + (cd examples/flutter_gallery/android; bundle exec fastlane deploy_play_store) + else + echo "Flutter Gallery is only deployed to the Play Store on merged dev branch commits" + fi + elif [ "$TRAVIS_OS_NAME" = "osx" ]; then + echo "Building Flutter Gallery for iOS..." + (cd examples/flutter_gallery; flutter build ios --release --no-codesign) + echo "iOS Flutter Gallery built" + if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then # TODO(xster): add back && [ "$TRAVIS_BRANCH" = "dev" ] after testing + echo "Re-building with distribution profile and deploying to TestFlight..." + (cd examples/flutter_gallery/ios; bundle exec fastlane build_and_deploy_testflight) + else + echo "Flutter Gallery is only deployed to the TestFlight on merged dev branch commits" + fi + fi +elif [ "$SHARD" = "docs" ]; then + if [ "$TRAVIS_OS_NAME" = "linux" ]; then + # Generate the API docs, upload them + ./dev/bots/docs.sh + fi +else + dart ./dev/bots/test.dart +fi diff --git a/dev/bots/travis_setup.sh b/dev/bots/travis_setup.sh index 040cdee1f2b..22a70e04f13 100755 --- a/dev/bots/travis_setup.sh +++ b/dev/bots/travis_setup.sh @@ -10,6 +10,34 @@ if [ -n "$TRAVIS" ]; then echo "Installing Google Cloud SDK..." curl https://sdk.cloud.google.com | bash > /dev/null echo "Google Cloud SDK installation completed." + + if [ "$TRAVIS_OS_NAME" = "linux" ] && [ "$SHARD" = "build_and_deploy_gallery" ]; then + # Background for not using Travis's built-in Android tags + # https://github.com/flutter/plugins/pull/145 + # Copied from https://github.com/flutter/plugins/blame/master/.travis.yml + wget https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip + mkdir android-sdk + unzip -qq sdk-tools-linux-3859397.zip -d android-sdk + export ANDROID_HOME=`pwd`/android-sdk + export PATH=`pwd`/android-sdk/tools/bin:$PATH + mkdir -p /home/travis/.android # silence sdkmanager warning + echo 'count=0' > /home/travis/.android/repositories.cfg # silence sdkmanager warning + # suppressing output of sdkmanager to keep log under 4MB (travis limit) + echo y | sdkmanager "tools" >/dev/null + echo y | sdkmanager "platform-tools" >/dev/null + echo y | sdkmanager "build-tools;26.0.3" >/dev/null + echo y | sdkmanager "platforms;android-26" >/dev/null + echo y | sdkmanager "extras;android;m2repository" >/dev/null + echo y | sdkmanager "extras;google;m2repository" >/dev/null + echo y | sdkmanager "patcher;v4" >/dev/null + sdkmanager --list + wget http://services.gradle.org/distributions/gradle-4.1-bin.zip + unzip -qq gradle-4.1-bin.zip + export GRADLE_HOME=$PWD/gradle-4.1 + export PATH=$GRADLE_HOME/bin:$PATH + gradle -v + ./bin/flutter doctor + fi fi # disable analytics on the bots and download Flutter dependencies diff --git a/dev/bots/travis_upload.sh b/dev/bots/travis_upload.sh deleted file mode 100755 index f48a245ce49..00000000000 --- a/dev/bots/travis_upload.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -set -ex - -export PATH="$PWD/bin:$PWD/bin/cache/dart-sdk/bin:$PATH" - -if [ "$TRAVIS_OS_NAME" = "linux" ] && \ - [ "$SHARD" = "docs" ]; then - # generate the API docs, upload them - ./dev/bots/docs.sh -fi diff --git a/examples/flutter_gallery/android/app/build.gradle b/examples/flutter_gallery/android/app/build.gradle index 66aa0419e1b..a0633f4d302 100644 --- a/examples/flutter_gallery/android/app/build.gradle +++ b/examples/flutter_gallery/android/app/build.gradle @@ -11,6 +11,14 @@ if (flutterRoot == null) { throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") } +def flutterVersion = file("$flutterRoot/version").text +def flutterVersionComponents = flutterVersion.split(/[^0-9]+/) +// Let the integer version code of xx.yy.zz-pre.nnn be xxyyzznnn. +int flutterVersionCode = Math.min(flutterVersionComponents[0].toInteger(), 20) * 100000000 +flutterVersionCode += Math.min(flutterVersionComponents[1].toInteger(), 99) * 1000000 +flutterVersionCode += Math.min(flutterVersionComponents[2].toInteger(), 999) * 1000 +flutterVersionCode += Math.min(flutterVersionComponents[3]?.toInteger() ?: 0, 999) + apply plugin: 'com.android.application' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" @@ -25,8 +33,9 @@ android { applicationId "io.flutter.demo.gallery" minSdkVersion 16 targetSdkVersion 27 - versionCode 1 - versionName "0.0.1" + // The Gallery app's version is defined by the Flutter framework's version. + versionCode flutterVersionCode + versionName "$flutterVersion" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } diff --git a/examples/flutter_gallery/android/fastlane/Fastfile b/examples/flutter_gallery/android/fastlane/Fastfile index eb4ced64389..cc7a5964357 100644 --- a/examples/flutter_gallery/android/fastlane/Fastfile +++ b/examples/flutter_gallery/android/fastlane/Fastfile @@ -7,13 +7,14 @@ default_platform(:android) # flutter build apk --release # to build the app using the Flutter toolchain. platform :android do - desc 'Push the built release APK to alpha' - lane :deploy_play_store_alpha do + desc 'Push the built release APK to alpha or beta depending on current branch' + lane :deploy_play_store do upload_to_play_store( - track: 'alpha', + track: ENV['TRAVIS_BRANCH'] == 'beta' ? 'beta' : 'alpha', apk: '../build/app/outputs/apk/release/app-release.apk', json_key_data: ENV['GOOGLE_DEVELOPER_SERVICE_ACCOUNT_ACTOR_FASTLANE'], - skip_upload_screenshots: true + skip_upload_screenshots: true, + skip_upload_images: true ) end end diff --git a/examples/flutter_gallery/android/fastlane/metadata/android/en-US/images/icon.png b/examples/flutter_gallery/android/fastlane/metadata/android/en-US/images/icon.png deleted file mode 100644 index a3c444cc4aa0e94b4634c9e72d2bcef024321b04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3381 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 rFh{I-Tj7iU^^moN-S$#5pTqwEkaaSl diff --git a/examples/flutter_gallery/ios/fastlane/Fastfile b/examples/flutter_gallery/ios/fastlane/Fastfile index 258866ffff0..68d38c8b752 100644 --- a/examples/flutter_gallery/ios/fastlane/Fastfile +++ b/examples/flutter_gallery/ios/fastlane/Fastfile @@ -10,15 +10,20 @@ default_platform(:ios) # 1- Signing using the publishing credentials; and # 2- xcodebuild with archive option platform :ios do - desc "Push a new release to TestFlight" + desc 'Push a new release to TestFlight' lane :build_and_deploy_testflight do # Doesn't do anything when not on Travis. setup_travis + increment_version_number( + # Relative to this file. Accept only digits and dots. + version_number: File.read('../../../../version').gsub(/[^0-9\.]/, '') + ) + # Retrieves all the necessary certs and provisioning profiles. sync_code_signing( - git_url: ENV["PUBLISHING_MATCH_CERTIFICATE_REPO"], - type: "appstore", + git_url: ENV['PUBLISHING_MATCH_CERTIFICATE_REPO'], + type: 'appstore', readonly: true ) @@ -27,19 +32,19 @@ platform :ios do # then run session. disable_automatic_code_signing update_project_provisioning( - xcodeproj: "Runner.xcodeproj", - target_filter: "Runner", - build_configuration: "Release", - profile: ENV["sigh_io.flutter.demo.gallery_appstore_profile-path"], + xcodeproj: 'Runner.xcodeproj', + target_filter: 'Runner', + build_configuration: 'Release', + profile: ENV['sigh_io.flutter.demo.gallery_appstore_profile-path'], ) # Build and archive the app again. build_ios_app( - workspace: "Runner.xcworkspace", - scheme: "Runner", - export_method: "app-store", + workspace: 'Runner.xcworkspace', + scheme: 'Runner', + export_method: 'app-store', # Verify that the right signing identity is used for publishing. - codesigning_identity: "iPhone Distribution: Store Ladd (S8QB4VV633)", + codesigning_identity: 'iPhone Distribution: Store Ladd (S8QB4VV633)', ) upload_to_testflight