Update Fastlane scripts (#2231)

* Upload builds to store after a successful build

* Update script to build PRs
This commit is contained in:
Elias Nahum 2018-10-09 12:05:24 -03:00 committed by GitHub
parent 1c40604a70
commit 4e94f81c00
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 175 additions and 122 deletions

View file

@ -2,8 +2,8 @@
.PHONY: check-style
.PHONY: start stop
.PHONY: run run-ios run-android
.PHONY: build-ios build-android unsigned-ios unsigned-android
.PHONY: build
.PHONY: build build-ios build-android unsigned-ios unsigned-android
.PHONY: build-pr can-build-pr prepare-pr
.PHONY: test help
POD := $(shell which pod 2> /dev/null)
@ -168,7 +168,7 @@ run-android: | check-device-android pre-run prepare-android-build ## Runs the ap
fi; \
fi
build: | pre-run check-style
build: | stop pre-run check-style ## Builds the app for Android & iOS
@if [ $(shell ps -ef | grep -i "cli.js start" | grep -civ grep) -eq 0 ]; then \
echo Starting React Native packager server; \
npm start & echo; \
@ -177,7 +177,8 @@ build: | pre-run check-style
@cd fastlane && BABEL_ENV=production NODE_ENV=production bundle exec fastlane build
@ps -ef | grep -i "cli.js start" | grep -iv grep | awk '{print $$2}' | xargs kill -9
build-ios: | pre-run check-style ## Creates an iOS build
build-ios: | stop pre-run check-style ## Builds the iOS app
@if [ $(shell ps -ef | grep -i "cli.js start" | grep -civ grep) -eq 0 ]; then \
echo Starting React Native packager server; \
npm start & echo; \
@ -186,7 +187,7 @@ build-ios: | pre-run check-style ## Creates an iOS build
@cd fastlane && BABEL_ENV=production NODE_ENV=production bundle exec fastlane ios build
@ps -ef | grep -i "cli.js start" | grep -iv grep | awk '{print $$2}' | xargs kill -9
build-android: | pre-run check-style prepare-android-build ## Creates an Android build
build-android: | stop pre-run check-style prepare-android-build ## Build the Android app
@if [ $(shell ps -ef | grep -i "cli.js start" | grep -civ grep) -eq 0 ]; then \
echo Starting React Native packager server; \
npm start & echo; \
@ -195,7 +196,7 @@ build-android: | pre-run check-style prepare-android-build ## Creates an Android
@cd fastlane && BABEL_ENV=production NODE_ENV=production bundle exec fastlane android build
@ps -ef | grep -i "cli.js start" | grep -iv grep | awk '{print $$2}' | xargs kill -9
unsigned-ios: pre-run check-style
unsigned-ios: stop pre-run check-style ## Build an unsigned version of the iOS app
@if [ $(shell ps -ef | grep -i "cli.js start" | grep -civ grep) -eq 0 ]; then \
echo Starting React Native packager server; \
npm start & echo; \
@ -209,7 +210,7 @@ unsigned-ios: pre-run check-style
@rm -rf build-ios/
@ps -ef | grep -i "cli.js start" | grep -iv grep | awk '{print $$2}' | xargs kill -9
unsigned-android: pre-run check-style prepare-android-build
unsigned-android: stop pre-run check-style prepare-android-build ## Build an unsigned version of the Android app
@if [ $(shell ps -ef | grep -i "cli.js start" | grep -civ grep) -eq 0 ]; then \
echo Starting React Native packager server; \
npm start & echo; \
@ -222,6 +223,25 @@ unsigned-android: pre-run check-style prepare-android-build
test: | pre-run check-style ## Runs tests
@npm test
build-pr: | can-build-pr prepare-pr stop pre-run check-style ## Build a PR from the mattermost-mobile repo
@if [ $(shell ps -ef | grep -i "cli.js start" | grep -civ grep) -eq 0 ]; then \
echo Starting React Native packager server; \
npm start & echo; \
fi
@echo "Building App from PR ${PR_ID}"
@cd fastlane && BABEL_ENV=production NODE_ENV=production bundle exec fastlane build_pr pr:PR-${PR_ID}
@ps -ef | grep -i "cli.js start" | grep -iv grep | awk '{print $$2}' | xargs kill -9
can-build-pr:
@if [ -z ${PR_ID} ]; then \
echo a PR number needs to be specified; \
exit 1; \
fi
prepare-pr:
@git fetch origin pull/${PR_ID}/head:PR-${PR_ID}
@git checkout PR-${PR_ID}
## Help documentation https://marmelab.com/blog/2016/02/29/auto-documented-makefile.html
help:
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'

View file

@ -1,15 +1,21 @@
require 'json'
fastlane_version '2.71.0'
fastlane_require 'aws-sdk-s3'
fastlane_require 'erb'
fastlane_require 'json'
skip_docs
configured = false
# Executes before anything else use to setup the script
before_all do
before_all do |lane, options|
if lane.to_s == 'build_pr'
pr = options[:pr]
UI.success("Building #{pr}")
ENV['BRANCH_TO_BUILD'] = pr
end
# Raises an error is git is not clean
if ENV['COMMIT_CHANGES_TO_GIT'] == 'true'
ensure_git_status_clean
@ -35,7 +41,13 @@ before_all do
end
end
after_all do
after_all do |lane|
if lane.to_s == 'build'
submit_to_store
elsif lane.to_s == 'build_pr'
upload_to_s3
end
if ENV['RESET_GIT_BRANCH'] == 'true'
branch = ENV['BRANCH_TO_BUILD'] || 'master'
package_id = ENV['MAIN_APP_IDENTIFIER'] || 'com.mattermost.rnbeta'
@ -56,6 +68,12 @@ after_all do
local_branch = ENV['GIT_LOCAL_BRANCH'] || 'build'
sh "git branch -D #{local_branch}"
UI.success("Deleted working branch \"#{local_branch}\"")
if lane.to_s == 'build_pr'
sh 'git checkout master'
## Remove the branch for the PR
sh "git branch -D #{branch}"
UI.success("Deleted PR branch \"#{branch}\"")
end
end
end
end
@ -174,16 +192,16 @@ lane :unsigned do
end
desc 'Build the app using a PR so QA can test'
lane :build_qa do
lane :build_pr do
configure
# Build the android app
self.runner.current_platform = :android
build_qa
build
# Build the ios app
self.runner.current_platform = :ios
build_qa
build
end
platform :ios do
@ -195,33 +213,6 @@ platform :ios do
update_identifiers
replace_assets
build_ios
# Submit to TestFlight if required
if ENV['SUBMIT_IOS_TO_TESTFLIGHT'] == 'true'
pilot
# Send a build message to Mattermost
pretext = '#### New iOS released ready to be published'
msg = 'release has been cut and is on TestFlight ready to be published.'
if ENV['BETA_BUILD'] == 'true'
pretext = '#### New iOS beta published to TestFlight'
msg = 'Sign up as a beta tester [here](https://mattermost-fastlane.herokuapp.com/)'
end
version = get_version_number(xcodeproj: './ios/Mattermost.xcodeproj', target: 'Mattermost')
build_number = get_build_number(xcodeproj: './ios/Mattermost.xcodeproj')
send_message_to_mattermost(
version,
build_number,
pretext,
'',
msg,
[],
true
)
end
end
desc 'Build an unsigned ipa'
@ -233,30 +224,6 @@ platform :ios do
replace_assets
end
lane :build_qa do
match(type: 'adhoc')
build_ios
plist_template = File.read('plist.erb')
abbreviated_commit_hash = `git rev-parse --short head`
abbreviated_commit_hash.strip!
plist_body = ERB.new(plist_template).result(binding)
s3 = Aws::S3::Resource.new(region: ENV['AWS_REGION'])
plist_obj = s3.bucket(ENV['AWS_BUCKET_NAME']).object("ios/#{abbreviated_commit_hash}.plist")
plist_obj.put(body: plist_body)
ipa_obj = s3.bucket(ENV['AWS_BUCKET_NAME']).object("ios/#{abbreviated_commit_hash}.ipa")
ipa_obj.upload_file('../Mattermost.ipa')
ios_install_url = "itms-services://?action=download-manifest&url=https://s3.#{ENV['AWS_REGION']}.amazonaws.com/#{ENV['AWS_BUCKET_NAME']}/ios/#{abbreviated_commit_hash}.plist"
unless ENV['MATTERMOST_WEBHOOK_URL'].nil? || ENV['MATTERMOST_WEBHOOK_URL'].empty?
msg = "QA build [#{abbreviated_commit_hash}](https://github.com/mattermost/mattermost-mobile/commit/#{abbreviated_commit_hash}) — iOS: #{ios_install_url}"
mattermost(message: msg, username: 'Fastlane', icon_url: 'https://support.apple.com/library/content/dam/edam/applecare/images/en_US/iOS/move-to-ios-icon.png')
end
end
lane :update_identifiers do
# Set the name for the app
app_name = ENV['APP_NAME'] || 'Mattermost Beta'
@ -385,44 +352,6 @@ platform :android do
replace_assets
link_sentry_android
build_android
app_name = ENV['APP_NAME'] || 'Mattermost Beta'
apk_path = "#{lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH]}"
if ENV['SUBMIT_ANDROID_TO_GOOGLE_PLAY'] == 'true'
supply(
track: ENV['SUPPLY_TRACK'] || 'alpha',
apk: apk_path
)
build_number = android_get_version_code(
gradle_file: './android/app/build.gradle'
)
version_number = android_get_version_name(
gradle_file: './android/app/build.gradle'
)
# Send a build message to Mattermost
pretext = '#### New Android released ready to be published'
msg = 'release has been cut and is on the Beta track ready to be published.'
if ENV['BETA_BUILD'] == 'true'
pretext = '#### New Android beta published to Google Play'
msg = 'Sign up as a beta tester [here](https://play.google.com/apps/testing/com.mattermost.rnbeta)'
end
send_message_to_mattermost(
version_number,
build_number,
pretext,
'',
msg,
[],
true
)
end
sh "mv #{apk_path} \"./#{app_name}.apk\""
end
desc 'Build an unsigned apk'
@ -440,24 +369,6 @@ platform :android do
)
end
lane :build_qa do
build_android
abbreviated_commit_hash = last_git_commit[:abbreviated_commit_hash]
s3 = Aws::S3::Resource.new(region: ENV['AWS_REGION'])
apk_obj = s3.bucket(ENV['AWS_BUCKET_NAME']).object("android/#{abbreviated_commit_hash}.apk")
apk_obj.upload_file("#{lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH]}")
android_install_path = "https://s3.#{ENV['AWS_REGION']}.amazonaws.com/#{ENV['AWS_BUCKET_NAME']}/android/#{abbreviated_commit_hash}.apk"
if ENV['MATTERMOST_WEBHOOK_URL'] && !ENV['MATTERMOST_WEBHOOK_URL'].nil? && !ENV['MATTERMOST_WEBHOOK_URL'].empty?
msg = "QA build [#{abbreviated_commit_hash}](https://github.com/mattermost/mattermost-mobile/commit/#{abbreviated_commit_hash}) — Android: #{android_install_path}"
mattermost(message: msg, username: 'Fastlane', icon_url: 'https://lh3.ggpht.com/XL0CrI8skkxnboGct-duyg-bZ_MxJDTrjczyjdU8OP2PM1dmj7SP4jL1K8JQeMIB3AM=w300')
end
end
lane :update_identifiers do
# Set the name for the app
app_name = ENV['APP_NAME'] || 'Mattermost Beta'
@ -603,3 +514,125 @@ def send_message_to_mattermost(version_number, build_number, pretext, title, msg
)
end
end
def submit_to_store
app_name = ENV['APP_NAME'] || 'Mattermost Beta'
apk_path = lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH]
ipa_path = lane_context[SharedValues::IPA_OUTPUT_PATH]
# Submit to Google Play if required
if !apk_path.nil? && ENV['SUBMIT_ANDROID_TO_GOOGLE_PLAY'] == 'true'
UI.success("apk file #{apk_path}")
supply(
track: ENV['SUPPLY_TRACK'] || 'alpha',
apk: apk_path
)
build_number = android_get_version_code(
gradle_file: './android/app/build.gradle'
)
version_number = android_get_version_name(
gradle_file: './android/app/build.gradle'
)
# Send a build message to Mattermost
pretext = '#### New Android released ready to be published'
msg = 'release has been cut and is on the Beta track ready to be published.'
if ENV['BETA_BUILD'] == 'true'
pretext = '#### New Android beta published to Google Play'
msg = 'Sign up as a beta tester [here](https://play.google.com/apps/testing/com.mattermost.rnbeta)'
end
send_message_to_mattermost(
version_number,
build_number,
pretext,
'',
msg,
[],
true
)
end
# Submit to TestFlight if required
if !ipa_path.nil? && ENV['SUBMIT_IOS_TO_TESTFLIGHT'] == 'true'
UI.success("ipa file #{ipa_path}")
pilot
# Send a build message to Mattermost
pretext = '#### New iOS released ready to be published'
msg = 'release has been cut and is on TestFlight ready to be published.'
if ENV['BETA_BUILD'] == 'true'
pretext = '#### New iOS beta published to TestFlight'
msg = 'Sign up as a beta tester [here](https://mattermost-fastlane.herokuapp.com/)'
end
version = get_version_number(xcodeproj: './ios/Mattermost.xcodeproj', target: 'Mattermost')
build_number = get_build_number(xcodeproj: './ios/Mattermost.xcodeproj')
send_message_to_mattermost(
version,
build_number,
pretext,
'',
msg,
[],
true
)
end
unless apk_path.nil?
sh "mv #{apk_path} \"../#{app_name}.apk\""
end
end
def upload_to_s3
unless ENV['AWS_BUCKET_NAME'].nil? || ENV['AWS_BUCKET_NAME'].empty? || ENV['AWS_REGION'].nil? || ENV['AWS_REGION'].empty?
apk_path = lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH]
ipa_path = lane_context[SharedValues::IPA_OUTPUT_PATH]
s3_region = ENV['AWS_REGION']
s3_folder = "#{ENV['AWS_FOLDER_NAME']}/#{ENV['BRANCH_TO_BUILD']}"
s3_bucket = ENV['AWS_BUCKET_NAME']
s3 = Aws::S3::Resource.new(region: s3_region)
abbreviated_commit_hash = last_git_commit[:abbreviated_commit_hash]
unless apk_path.nil?
apk_obj = s3.bucket(s3_bucket).object("#{s3_folder}/#{abbreviated_commit_hash}.apk")
apk_obj.upload_file("#{apk_path}")
android_install_path = "https://#{s3_bucket}/#{s3_folder}/#{abbreviated_commit_hash}.apk"
if ENV['MATTERMOST_WEBHOOK_URL'] && !ENV['MATTERMOST_WEBHOOK_URL'].nil? && !ENV['MATTERMOST_WEBHOOK_URL'].empty?
msg = "QA build [#{abbreviated_commit_hash}](https://github.com/mattermost/mattermost-mobile/commit/#{abbreviated_commit_hash}) — Android: #{android_install_path}"
mattermost(message: msg, username: 'Fastlane', icon_url: 'https://lh3.ggpht.com/XL0CrI8skkxnboGct-duyg-bZ_MxJDTrjczyjdU8OP2PM1dmj7SP4jL1K8JQeMIB3AM=w300')
else
UI.success("PR Built for Android: #{android_install_path}")
end
end
unless ipa_path.nil?
current_build_number = get_build_number(xcodeproj: './ios/Mattermost.xcodeproj')
plist_template = File.read('plist.erb')
plist_body = ERB.new(plist_template).result(binding)
plist_obj = s3.bucket(s3_bucket).object("#{s3_folder}/#{abbreviated_commit_hash}.plist")
plist_obj.put(body: plist_body)
ipa_obj = s3.bucket(s3_bucket).object("#{s3_folder}/#{abbreviated_commit_hash}.ipa")
ipa_obj.upload_file("#{ipa_path}")
ios_install_url = "itms-services://?action=download-manifest&url=https://#{s3_bucket}/#{s3_folder}/#{abbreviated_commit_hash}.plist"
unless ENV['MATTERMOST_WEBHOOK_URL'].nil? || ENV['MATTERMOST_WEBHOOK_URL'].empty?
msg = "QA build [#{abbreviated_commit_hash}](https://github.com/mattermost/mattermost-mobile/commit/#{abbreviated_commit_hash}) — iOS: #{ios_install_url}"
mattermost(message: msg, username: 'Fastlane', icon_url: 'https://support.apple.com/library/content/dam/edam/applecare/images/en_US/iOS/move-to-ios-icon.png')
else
UI.success("PR Built for iOS: #{ios_install_url}")
end
end
end
end

View file

@ -11,7 +11,7 @@
<key>kind</key>
<string>software-package</string>
<key>url</key>
<string>https://s3.<%= ENV['AWS_REGION'] %>.amazonaws.com/<%= ENV['AWS_BUCKET_NAME'] %>/ios/<%= abbreviated_commit_hash %>.ipa</string>
<string>https://<%= s3_bucket %>/<%= s3_folder %>/<%= abbreviated_commit_hash %>.ipa</string>
</dict>
<dict>
<key>kind</key>
@ -19,7 +19,7 @@
<key>needs-shine</key>
<true/>
<key>url</key>
<string>https://s3.<%= ENV['AWS_REGION'] %>.amazonaws.com/<%= ENV['AWS_BUCKET_NAME'] %>/beta-logo.png</string>
<string>https://<%= s3_bucket %>/<%= ENV['AWS_FOLDER_NAME'] %>/beta-logo.png</string>
</dict>
</array>
<key>metadata</key>