Switch from SFTP to s3 in Fastlane for publishing release to server

[ci skip]
This commit is contained in:
Julian Raufelder 2021-02-10 12:34:55 +01:00
parent d72b39c1b0
commit 8d7700331a
No known key found for this signature in database
GPG Key ID: 17EE71F6634E381D
6 changed files with 71 additions and 47 deletions

View File

@ -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

View File

@ -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=

View File

@ -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|

View File

@ -3,3 +3,4 @@
# Ensure this file is checked in to source control!
gem 'fastlane-plugin-get_version_name'
gem 'fastlane-plugin-aws_s3'

View File

@ -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