From 8d7700331a71b4378004039486958709338ece95 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Wed, 10 Feb 2021 12:34:55 +0100 Subject: [PATCH] Switch from SFTP to s3 in Fastlane for publishing release to server [ci skip] --- Gemfile.lock | 18 ++++- fastlane/.default.env | 8 +- fastlane/Fastfile | 79 ++++++++++--------- fastlane/Pluginfile | 1 + fastlane/README.md | 12 ++- ...es_apkstore_en.html => release-notes.html} | 0 6 files changed, 71 insertions(+), 47 deletions(-) rename fastlane/{release_notes_apkstore_en.html => release-notes.html} (100%) diff --git a/Gemfile.lock b/Gemfile.lock index 97697954..0e25b8aa 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -4,10 +4,12 @@ GEM CFPropertyList (3.0.3) addressable (2.7.0) public_suffix (>= 2.0.2, < 5.0) + apktools (0.7.4) + rubyzip (~> 2.0) artifactory (3.0.15) atomos (0.1.3) aws-eventstream (1.1.0) - aws-partitions (1.424.0) + aws-partitions (1.426.0) aws-sdk-core (3.112.0) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.239.0) @@ -50,7 +52,7 @@ GEM faraday_middleware (1.0.0) faraday (~> 1.0) fastimage (2.2.2) - fastlane (2.173.0) + fastlane (2.174.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.3, < 3.0.0) artifactory (~> 3.0) @@ -87,6 +89,10 @@ GEM xcodeproj (>= 1.13.0, < 2.0.0) xcpretty (~> 0.3.0) xcpretty-travis-formatter (>= 0.0.3) + fastlane-plugin-aws_s3 (1.8.0) + apktools (~> 0.7) + aws-sdk-s3 (~> 1) + mime-types (~> 3.3) fastlane-plugin-get_version_name (0.2.2) gh_inspector (1.1.3) google-api-client (0.38.0) @@ -109,7 +115,7 @@ GEM webrick google-apis-iamcredentials_v1 (0.1.0) google-apis-core (~> 0.1) - google-apis-storage_v1 (0.1.0) + google-apis-storage_v1 (0.2.0) google-apis-core (~> 0.1) google-cloud-core (1.5.0) google-cloud-env (~> 1.0) @@ -125,7 +131,7 @@ GEM google-cloud-core (~> 1.2) googleauth (~> 0.9) mini_mime (~> 1.0) - googleauth (0.15.0) + googleauth (0.15.1) faraday (>= 0.17.3, < 2.0) jwt (>= 1.4, < 3.0) memoist (~> 0.16) @@ -140,6 +146,9 @@ GEM json (2.5.1) jwt (2.2.2) memoist (0.16.2) + mime-types (3.3.1) + mime-types-data (~> 3.2015) + mime-types-data (3.2020.1104) mini_magick (4.11.0) mini_mime (1.0.2) multi_json (1.15.0) @@ -204,6 +213,7 @@ DEPENDENCIES bcrypt_pbkdf ed25519 fastlane + fastlane-plugin-aws_s3 fastlane-plugin-get_version_name net-sftp diff --git a/fastlane/.default.env b/fastlane/.default.env index fe1d804a..228ca9a5 100644 --- a/fastlane/.default.env +++ b/fastlane/.default.env @@ -12,8 +12,10 @@ SIGNING_UPDATE_APK_STORE_KEY_PATH= SIGNING_UPDATE_APK_STORE_PUB_KEY_PATH= APK_STORE_BASIC_URL= -FTP_SERVER_USERNAME= -FTP_SERVER_KEY_FILE= -FTP_SERVER_PORT= +S3_BUCKET= +S3_ENDPOINT= +S3_REGION= +S3_ACCESS_KEY= +S3_SECRET_ACCESS_KEY= SLACK_URL= diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 2c2ec138..348e5fa2 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -20,14 +20,14 @@ platform :android do |options| gradle(task: "test") end - desc "Deploy new version to Google Play and APK Store options: beta:false scheduled:false (default)" + desc "Deploy new version to Google Play and APK Store options: beta:false (default)" lane :deploy do |options| release_note_path_en = "metadata/android/en-US/changelogs/default.txt" # use english-change-log for french language too FileUtils.cp(release_note_path_en, "metadata/android/fr-FR/changelogs/default.txt") - deployToPlaystore(scheduled:options[:scheduled], beta:options[:beta]) + deployToPlaystore(beta:options[:beta]) if options[:beta] puts "Skipping deployment to server cause there isn't currently a beta channel" @@ -40,8 +40,8 @@ platform :android do |options| } ) else - deployToServer(scheduled:options[:scheduled], beta:options[:beta]) - deployToFDroid(scheduled:options[:scheduled], beta:options[:beta]) + deployToServer(beta:options[:beta]) + deployToFDroid(beta:options[:beta]) slack( default_payloads: [], # reduce the notification to the minimum @@ -55,7 +55,7 @@ platform :android do |options| end desc "Deploy new version to Play Store" - private_lane :deployToPlaystore do |options| + lane :deployToPlaystore do |options| deploy_target = "production" if options[:beta] @@ -96,7 +96,7 @@ platform :android do |options| end desc "Deploy new version to server" - private_lane :deployToServer do |options| + lane :deployToServer do |options| gradle(task: "clean") gradle( @@ -112,13 +112,12 @@ platform :android do |options| } ) + FileUtils.cp(lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], "release/Cryptomator-#{version}.apk") + server_host = ENV["APK_STORE_BASIC_URL"] - server_relative_folder = "/mnt/data/android/" base_url = "https://#{server_host}/android/" apk_url = "#{base_url}#{version}/Cryptomator-#{version}.apk" - relative_apk_url = "#{server_relative_folder}#{version}/Cryptomator-#{version}.apk" release_note_url = "#{base_url}#{version}/release-notes.html" - relative_release_note_url = "#{server_relative_folder}#{version}/release-notes.html" claims = { "version": version, @@ -129,44 +128,47 @@ platform :android do |options| private_key = OpenSSL::PKey.read(File.read(ENV["SIGNING_UPDATE_APK_STORE_KEY_PATH"])) token = JWT.encode claims, private_key, "ES256" - latest_version_filename = "latest-version.json" - if options[:scheduled] - latest_version_filename = "latest-version-#{version}.json" - puts "Scheduled upload activated, uploading latest-version.json to #{latest_version_filename} with claims #{claims}" - else - puts "#{latest_version_filename} has claims #{claims}" - end + latest_version_filename = "latest-version-#{version}.json" latest_version_jsn = File.new("latest_versions/#{latest_version_filename}","w") latest_version_jsn.write(token) latest_version_jsn.close - latest_version_jsn = File.open("latest_versions/#{latest_version_filename}","r") - release_note_path = "release_notes_apkstore_en.html" - release_note_file = File.open(release_note_path,"r") + puts "Uploading APK and release note" - puts latest_version_filename + aws_s3( + bucket: ENV['S3_BUCKET'], + endpoint: ENV['S3_ENDPOINT'], + region: ENV['S3_REGION'], + access_key: ENV['S3_ACCESS_KEY'], + secret_access_key: ENV['S3_SECRET_ACCESS_KEY'], + path: "android/#{version}", + files: [ + "fastlane/release/Cryptomator-#{version}.apk", + "fastlane/release-notes.html" + ], + skip_html_upload: true, + apk: '' + ) - Net::SFTP.start( - ENV["FTP_SERVER_URL"], - ENV["FTP_SERVER_USERNAME"], - :keys=>[ENV["FTP_SERVER_KEY_FILE"]], - keys_only: true, - verify_host_key: :never, - :port=>ENV["FTP_SERVER_PORT"] - ) do |sftp| - puts "Uploading files to server..." - sftp.mkdir! "#{server_relative_folder}#{version}" - sftp.upload!(lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], relative_apk_url) - sftp.upload!(release_note_file, relative_release_note_url) - sftp.upload!(latest_version_jsn, "#{server_relative_folder}#{latest_version_filename}") - end + puts "Uploading #{latest_version_filename} with claims #{claims}" + puts "Rename #{latest_version_filename} to latest-version.json for deployment" - latest_version_jsn.close - release_note_file.close - - FileUtils.cp(lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], "release/Cryptomator-#{version}_signed.apk") + aws_s3( + bucket: ENV['S3_BUCKET'], + endpoint: ENV['S3_ENDPOINT'], + region: ENV['S3_REGION'], + access_key: ENV['S3_ACCESS_KEY'], + secret_access_key: ENV['S3_SECRET_ACCESS_KEY'], + path: "android", + files: [ + "fastlane/latest_versions/#{latest_version_filename}" + ], + skip_html_upload: true, + apk: '' + ) + FileUtils.mv("release/Cryptomator-#{version}.apk", "release/Cryptomator-#{version}_signed.apk") end desc "Deploy new version to F-Droid" @@ -187,7 +189,6 @@ platform :android do |options| ) FileUtils.cp(lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], "release/Cryptomator-#{version}_fdroid_signed.apk") - end after_all do |lane| diff --git a/fastlane/Pluginfile b/fastlane/Pluginfile index 45823f1d..9b434483 100644 --- a/fastlane/Pluginfile +++ b/fastlane/Pluginfile @@ -3,3 +3,4 @@ # Ensure this file is checked in to source control! gem 'fastlane-plugin-get_version_name' +gem 'fastlane-plugin-aws_s3' diff --git a/fastlane/README.md b/fastlane/README.md index 3b2609ba..eee28971 100644 --- a/fastlane/README.md +++ b/fastlane/README.md @@ -25,7 +25,17 @@ Run all the tests ``` fastlane android deploy ``` -Deploy new version to Google Play and APK Store options: beta:false scheduled:false (default) +Deploy new version to Google Play and APK Store options: beta:false (default) +### android deployToPlaystore +``` +fastlane android deployToPlaystore +``` +Deploy new version to Play Store +### android deployToServer +``` +fastlane android deployToServer +``` +Deploy new version to server ### android deployToFDroid ``` fastlane android deployToFDroid diff --git a/fastlane/release_notes_apkstore_en.html b/fastlane/release-notes.html similarity index 100% rename from fastlane/release_notes_apkstore_en.html rename to fastlane/release-notes.html