Add workflow for building and TestFlight

This commit is contained in:
Arkadiusz Fal
2023-02-19 14:43:17 +01:00
parent ddcc134d75
commit de153ab9ac
11 changed files with 483 additions and 140 deletions

20
fastlane/.env.sample Normal file
View File

@@ -0,0 +1,20 @@
CERTIFICATES_GIT_URL="git@github.com:developer/yattee-certificates.git"
GIT_AUTHORIZATION = "" # For certificates repo, https://github.com/settings/tokens/new (repo scope)
FASTLANE_USER="developer@mail.com" # Apple ID
FASTLANE_PASSWORD="" # Apple ID Password
ITC_TEAM_ID="" # https://sarunw.com/posts/fastlane-find-team-id/
TEAM_ID="" # Developer ID
DEVELOPER_NAME="" # Developer Name (Developer ID)
# Developer Key
DEVELOPER_KEY_ID=""
DEVELOPER_KEY_ISSUER_ID=""
DEVELOPER_KEY_CONTENT=""
FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD="" # Not needed for most users
TEMP_KEYCHAIN_USER = "keychain-user"
TEMP_KEYCHAIN_PASSWORD = "keychain-password"
DEVELOPER_APP_IDENTIFIER = "stream.yattee.app"
# TestFlight
TESTFLIGHT_EXTERNAL_GROUPS=Testers,"Other Testers" # Comma separated list of external groups

View File

@@ -1,5 +1,5 @@
app_identifier("stream.yattee.app") # The bundle identifier of your app
apple_id(ENV['APPLE_ID']) # Your Apple email address
app_identifier(ENV['DEVELOPER_APP_IDENTIFIER']) # The bundle identifier of your app
apple_id(ENV['FASTLANE_USER']) # Your Apple email address
itc_team_id(ENV['ITC_TEAM_ID']) # App Store Connect Team ID
team_id(ENV['TEAM_ID']) # Developer Portal Team ID

View File

@@ -16,6 +16,32 @@
DEVELOPER_KEY_ID = ENV['DEVELOPER_KEY_ID']
DEVELOPER_KEY_ISSUER_ID = ENV['DEVELOPER_KEY_ISSUER_ID']
DEVELOPER_KEY_CONTENT = ENV['DEVELOPER_KEY_CONTENT']
TEAM_ID = ENV['TEAM_ID']
TEMP_KEYCHAIN_USER = ENV['TEMP_KEYCHAIN_USER']
TEMP_KEYCHAIN_PASSWORD = ENV['TEMP_KEYCHAIN_PASSWORD']
DEVELOPER_APP_IDENTIFIER = ENV['DEVELOPER_APP_IDENTIFIER']
GIT_AUTHORIZATION = ENV['GIT_AUTHORIZATION']
TESTFLIGHT_EXTERNAL_GROUPS = ENV['TESTFLIGHT_EXTERNAL_GROUPS']
def delete_temp_keychain(name)
delete_keychain(
name: name
) if File.exist? File.expand_path("~/Library/Keychains/#{name}-db")
end
def create_temp_keychain(name, password)
create_keychain(
name: name,
password: password,
unlock: false,
timeout: 0
)
end
def ensure_temp_keychain(name, password)
delete_temp_keychain(name)
create_temp_keychain(name, password)
end
add_extra_platforms(platforms: [:tvos])
@@ -23,10 +49,28 @@ before_all do
update_fastlane
end
desc "Bump build number and commit"
lane :bump_build do
increment_build_number
commit_version_bump(
message: "Bump build number to #{get_build_number}"
)
end
desc "Bump version number and commit"
lane :bump_version do
increment_version_number
commit_version_bump(
message: "Bump version number to #{get_version_number}"
)
end
platform :ios do
desc "Push a new beta build to TestFlight"
lane :beta do
app_store_connect_api_key(
ensure_temp_keychain(TEMP_KEYCHAIN_USER, TEMP_KEYCHAIN_PASSWORD)
api_key = app_store_connect_api_key(
key_id: DEVELOPER_KEY_ID,
issuer_id: DEVELOPER_KEY_ISSUER_ID,
key_content: DEVELOPER_KEY_CONTENT
@@ -38,16 +82,37 @@ platform :ios do
target: "Yattee (iOS)"
)
match(
type: 'appstore',
platform: 'ios',
app_identifier: ["#{DEVELOPER_APP_IDENTIFIER}", "#{DEVELOPER_APP_IDENTIFIER}.Open-in-Yattee"],
git_basic_authorization: Base64.strict_encode64(GIT_AUTHORIZATION),
readonly: true,
keychain_name: TEMP_KEYCHAIN_USER,
keychain_password: TEMP_KEYCHAIN_PASSWORD,
api_key: api_key
)
build_app(
scheme: "Yattee (iOS)",
output_directory: "fastlane/builds/#{version}-#{build}/iOS",
output_name: "Yattee-#{version}-iOS.ipa",
xcargs: "-allowProvisioningUpdates"
export_options: {
provisioningProfiles: {
"#{DEVELOPER_APP_IDENTIFIER}" => "match AppStore #{DEVELOPER_APP_IDENTIFIER}",
"#{DEVELOPER_APP_IDENTIFIER}.Open-in-Yattee" => "match AppStore #{DEVELOPER_APP_IDENTIFIER}.Open-in-Yattee"
}
}
)
altool(
altool_app_type: "ios",
altool_ipa_path: lane_context[SharedValues::IPA_OUTPUT_PATH]
changelog = File.read('../CHANGELOG.md')
upload_to_testflight(
api_key: api_key,
ipa: lane_context[SharedValues::IPA_OUTPUT_PATH],
distribute_external: true,
groups: TESTFLIGHT_EXTERNAL_GROUPS,
changelog: changelog
)
end
end
@@ -55,7 +120,9 @@ end
platform :tvos do
desc "Push a new beta build to TestFlight"
lane :beta do
app_store_connect_api_key(
ensure_temp_keychain(TEMP_KEYCHAIN_USER, TEMP_KEYCHAIN_PASSWORD)
api_key = app_store_connect_api_key(
key_id: DEVELOPER_KEY_ID,
issuer_id: DEVELOPER_KEY_ISSUER_ID,
key_content: DEVELOPER_KEY_CONTENT
@@ -67,16 +134,37 @@ platform :tvos do
target: "Yattee (tvOS)"
)
match(
type: 'appstore',
platform: 'tvos',
app_identifier: "#{DEVELOPER_APP_IDENTIFIER}",
git_basic_authorization: Base64.strict_encode64(GIT_AUTHORIZATION),
readonly: true,
keychain_name: TEMP_KEYCHAIN_USER,
keychain_password: TEMP_KEYCHAIN_PASSWORD,
api_key: api_key
)
build_app(
scheme: "Yattee (tvOS)",
output_directory: "fastlane/builds/#{version}-#{build}/tvOS",
output_name: "Yattee-#{version}-tvOS.ipa",
xcargs: "-allowProvisioningUpdates"
export_method: "app-store",
export_options: {
provisioningProfiles: {
"#{DEVELOPER_APP_IDENTIFIER}" => "match AppStore #{DEVELOPER_APP_IDENTIFIER} tvos"
}
}
)
altool(
altool_app_type: "tvos",
altool_ipa_path: lane_context[SharedValues::IPA_OUTPUT_PATH]
changelog = File.read('../CHANGELOG.md')
upload_to_testflight(
api_key: api_key,
ipa: lane_context[SharedValues::IPA_OUTPUT_PATH],
distribute_external: true,
groups: TESTFLIGHT_EXTERNAL_GROUPS,
changelog: changelog
)
end
end
@@ -84,7 +172,9 @@ end
platform :mac do
desc "Push a new beta build to TestFlight"
lane :beta do
app_store_connect_api_key(
ensure_temp_keychain(TEMP_KEYCHAIN_USER, TEMP_KEYCHAIN_PASSWORD)
api_key = app_store_connect_api_key(
key_id: DEVELOPER_KEY_ID,
issuer_id: DEVELOPER_KEY_ISSUER_ID,
key_content: DEVELOPER_KEY_CONTENT
@@ -96,16 +186,84 @@ platform :mac do
target: "Yattee (macOS)"
)
match(
type: 'appstore',
platform: 'macos',
additional_cert_types: ['mac_installer_distribution'],
app_identifier: "#{DEVELOPER_APP_IDENTIFIER}",
git_basic_authorization: Base64.strict_encode64(GIT_AUTHORIZATION),
readonly: true,
keychain_name: TEMP_KEYCHAIN_USER,
keychain_password: TEMP_KEYCHAIN_PASSWORD,
api_key: api_key
)
build_app(
scheme: "Yattee (macOS)",
output_directory: "fastlane/builds/#{version}-#{build}/macOS",
output_name: "Yattee-#{version}-macOS.app",
xcargs: "-allowProvisioningUpdates"
export_method: "app-store",
export_options: {
provisioningProfiles: {
"#{DEVELOPER_APP_IDENTIFIER}" => "match AppStore #{DEVELOPER_APP_IDENTIFIER} macos"
}
}
)
altool(
altool_app_type: "macos",
altool_ipa_path: lane_context[SharedValues::PKG_OUTPUT_PATH]
changelog = File.read('../CHANGELOG.md')
upload_to_testflight(
api_key: api_key,
pkg: lane_context[SharedValues::PKG_OUTPUT_PATH],
distribute_external: true,
groups: TESTFLIGHT_EXTERNAL_GROUPS,
changelog: changelog
)
end
desc "Build for Developer ID distribution and notarize"
lane :build_and_notarize do
ensure_temp_keychain(TEMP_KEYCHAIN_USER, TEMP_KEYCHAIN_PASSWORD)
api_key = app_store_connect_api_key(
key_id: DEVELOPER_KEY_ID,
issuer_id: DEVELOPER_KEY_ISSUER_ID,
key_content: DEVELOPER_KEY_CONTENT
)
build = get_build_number(xcodeproj: "Yattee.xcodeproj")
version = get_version_number(
xcodeproj: "Yattee.xcodeproj",
target: "Yattee (macOS)"
)
match(
type: 'developer_id',
platform: 'macos',
app_identifier: "#{DEVELOPER_APP_IDENTIFIER}",
git_basic_authorization: Base64.strict_encode64(GIT_AUTHORIZATION),
readonly: true,
keychain_name: TEMP_KEYCHAIN_USER,
keychain_password: TEMP_KEYCHAIN_PASSWORD,
api_key: api_key
)
build_mac_app(
scheme: "Yattee (macOS)",
output_directory: "fastlane/builds/#{version}-#{build}/macOS",
output_name: "Yattee",
export_method: "developer-id",
export_options: {
provisioningProfiles: {
"#{DEVELOPER_APP_IDENTIFIER}" => "match Direct #{DEVELOPER_APP_IDENTIFIER} macos"
}
}
)
notarize(
package: "fastlane/builds/#{version}-#{build}/macOS/Yattee.app",
bundle_id: "#{DEVELOPER_APP_IDENTIFIER}",
api_key: api_key,
)
end
end

13
fastlane/Matchfile Normal file
View File

@@ -0,0 +1,13 @@
git_url(ENV['CERTIFICATES_GIT_URL'])
storage_mode("git")
type("appstore") # The default type, can be: appstore, adhoc, enterprise or development
# app_identifier(["tools.fastlane.app", "tools.fastlane.app2"])
# username("user@fastlane.tools") # Your Apple Developer Portal username
# For all available options run `fastlane match --help`
# Remove the # in the beginning of the line to enable the other options
# The docs are available on https://docs.fastlane.tools/actions/match

View File

@@ -1,5 +1,3 @@
# Autogenerated by fastlane
#
# Ensure this file is checked in to source control!
gem 'fastlane-plugin-altool', git: "git@github.com:yattee/fastlane-plugin-altool.git"

View File

@@ -13,6 +13,25 @@ For _fastlane_ installation instructions, see [Installing _fastlane_](https://do
# Available Actions
### bump_build
```sh
[bundle exec] fastlane bump_build
```
Bump build number and commit
### bump_version
```sh
[bundle exec] fastlane bump_version
```
Bump version number and commit
----
## iOS
### ios beta
@@ -49,6 +68,14 @@ Push a new beta build to TestFlight
Push a new beta build to TestFlight
### mac build_and_notarize
```sh
[bundle exec] fastlane mac build_and_notarize
```
Build for Developer ID distribution and notarize
----
This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run.