Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions .github/workflows/add_identifiers.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: Add Identifiers
on:
workflow_dispatch:

jobs:
identifiers:
runs-on: macos-12
steps:
# Uncomment to manually select latest Xcode if needed
#- name: Select Latest Xcode
# run: "sudo xcode-select --switch /Applications/Xcode_13.0.app/Contents/Developer"

# Checks-out the repo
- name: Checkout Repo
uses: actions/checkout@v2

# Patch Fastlane Match to not print tables
- name: Patch Match Tables
run: find /usr/local/lib/ruby/gems -name table_printer.rb | xargs sed -i "" "/puts(Terminal::Table.new(params))/d"

# Create or update identifiers for app
- name: Fastlane Provision
run: fastlane identifiers
env:
TEAMID: ${{ secrets.TEAMID }}
GH_PAT: ${{ secrets.GH_PAT }}
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
FASTLANE_KEY_ID: ${{ secrets.FASTLANE_KEY_ID }}
FASTLANE_ISSUER_ID: ${{ secrets.FASTLANE_ISSUER_ID }}
FASTLANE_KEY: ${{ secrets.FASTLANE_KEY }}
6 changes: 3 additions & 3 deletions .github/workflows/create_certs.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
name: Generate Certificates
name: Create Certificates
on:
workflow_dispatch:

jobs:
build:
certificates:
runs-on: macos-12
steps:
# Uncomment to manually select latest Xcode if needed
Expand All @@ -19,7 +19,7 @@ jobs:
run: find /usr/local/lib/ruby/gems -name table_printer.rb | xargs sed -i "" "/puts(Terminal::Table.new(params))/d"

# Create or update certificates for app
- name: Fastlane Create/Update Certificates
- name: Create Certificates
run: fastlane certs
env:
TEAMID: ${{ secrets.TEAMID }}
Expand Down
66 changes: 62 additions & 4 deletions fastlane/Fastfile
Original file line number Diff line number Diff line change
Expand Up @@ -63,11 +63,23 @@ platform :ios do
"com.#{TEAMID}.loopkit.Loop.SmallStatusWidget"
]
)

previous_build_number = latest_testflight_build_number(
app_identifier: "com.#{TEAMID}.loopkit.Loop",
api_key: api_key,
)

current_build_number = previous_build_number + 1

increment_build_number(
xcodeproj: "#{GITHUB_WORKSPACE}/Loop/Loop.xcodeproj",
build_number: current_build_number
)

mapping = Actions.lane_context[
SharedValues::MATCH_PROVISIONING_PROFILE_MAPPING
]

update_code_signing_settings(
path: "#{GITHUB_WORKSPACE}/Loop/Loop.xcodeproj",
profile_name: mapping["com.#{TEAMID}.loopkit.Loop"],
Expand All @@ -80,7 +92,7 @@ platform :ios do
code_sign_identity: "iPhone Distribution",
targets: ["LoopCore", "LoopCore-watchOS", "LoopUI"]
)

update_code_signing_settings(
path: "#{GITHUB_WORKSPACE}/Loop/Loop.xcodeproj",
profile_name: mapping["com.#{TEAMID}.loopkit.Loop.statuswidget"],
Expand Down Expand Up @@ -140,8 +152,54 @@ platform :ios do
skip_waiting_for_build_processing: true,
)
end

desc "Create/Update Certs"

desc "Provision Identifiers and Certificates"
lane :identifiers do
setup_ci if ENV['CI']
ENV["MATCH_READONLY"] = false.to_s

app_store_connect_api_key(
key_id: "#{FASTLANE_KEY_ID}",
issuer_id: "#{FASTLANE_ISSUER_ID}",
key_content: "#{FASTLANE_KEY}"
)

def configure_bundle_id(name, identifier, capabilities)
bundle_id = Spaceship::ConnectAPI::BundleId.find(identifier) || Spaceship::ConnectAPI::BundleId.create(name: name, identifier: identifier)
capabilities.each { |capability|
bundle_id.create_capability(capability)
}
end

configure_bundle_id("Loop", "com.#{TEAMID}.loopkit.Loop", [
Spaceship::ConnectAPI::BundleIdCapability::Type::APP_GROUPS,
Spaceship::ConnectAPI::BundleIdCapability::Type::HEALTHKIT,
Spaceship::ConnectAPI::BundleIdCapability::Type::PUSH_NOTIFICATIONS,
Spaceship::ConnectAPI::BundleIdCapability::Type::SIRIKIT
])

configure_bundle_id("Loop Intent Extension", "com.#{TEAMID}.loopkit.Loop.Loop-Intent-Extension", [
Spaceship::ConnectAPI::BundleIdCapability::Type::APP_GROUPS
])

configure_bundle_id("Loop Status Extension", "com.#{TEAMID}.loopkit.Loop.statuswidget", [
Spaceship::ConnectAPI::BundleIdCapability::Type::APP_GROUPS
])

configure_bundle_id("WatchApp", "com.#{TEAMID}.loopkit.Loop.LoopWatch", [])

configure_bundle_id("WatchApp Extension", "com.#{TEAMID}.loopkit.Loop.LoopWatch.watchkitextension", [
Spaceship::ConnectAPI::BundleIdCapability::Type::HEALTHKIT,
Spaceship::ConnectAPI::BundleIdCapability::Type::SIRIKIT
])

configure_bundle_id("Small Status Widget", "com.#{TEAMID}.loopkit.Loop.SmallStatusWidget", [
Spaceship::ConnectAPI::BundleIdCapability::Type::APP_GROUPS
])

end

desc "Provision Certificates"
lane :certs do
setup_ci if ENV['CI']
ENV["MATCH_READONLY"] = false.to_s
Expand Down
1 change: 1 addition & 0 deletions fastlane/Matchfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

GITHUB_REPOSITORY_OWNER ||= ENV["GITHUB_REPOSITORY_OWNER"]

git_url("https://github.com/#{GITHUB_REPOSITORY_OWNER}/Match-Secrets.git")
Expand Down
115 changes: 82 additions & 33 deletions fastlane/testflight.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,60 +2,109 @@

These instructions allow you to build Loop without having access to a Mac. They also allow you to easily install Loop on phones that are not connected to your computer. So you can send builds and updates to those you care for easily, or have an easy to access backup if you run Loop for yourself. You do not need to worry about correct Xcode/Mac versions either. An app built using this method can easily be deployed to newer versions of iOS, as soon as they are available.

The setup steps are somewhat involved, but nearly all are one time steps. Subsequent builds are trivial.

## Prerequisites.

You don't need much!

* A github account. The free level comes with plenty of storage and free compute time to build loop, multiple times a week, if you wanted to.
* A paid Apple Developer account. You may be able to use the free version, but that has not been tested.
* A [github account](https://github.com/signup). The free level comes with plenty of storage and free compute time to build loop, multiple times a week, if you wanted to.
* A paid [Apple Developer account](https://developer.apple.com). You may be able to use the free version, but that has not been tested.
* Some time. Set aside a couple of hours to perform the setup.


## Apple Developer Steps
## Generate App Store Connect API Key

1. Sign in to the [Apple developer portal page](https://developer.apple.com/account/resources/certificates/list)
1. Copy the team id from the upper right of the screen. Record this as your `TEAMID`
1. Go to the [App Store Connect](https://appstoreconnect.apple.com/access/api) interface, click the "Keys" tab, and create a new key with "Admin" access. Give it a name like "FastLane API Key"
1. Record the key id; this will be used for `FASTLANE_KEY_ID`
1. Record the issuer id; this will be used for `FASTLANE_ISSUER_ID`
1. Download the API key itself, and open it in a text editor. The contents of this file will be used for `FASTLANE_KEY`
1. At the [Certificates, Identifiers & Profiles](https://developer.apple.com/account/resources/identifiers/bundleId/add/bundle) page, add a new app identifier.
* Description: Loop
* The Bundle ID will be explicit and in the form `com.TEAMID.loopkit.Loop`, where `TEAMID` is your the value you recorded above.
* For capabilities, check "App Groups, "HealthKit", "SiriKit", and "Time Sensitive Notifications"
* Then click "Continue", and "Register".
1. Go to the [apps list](https://appstoreconnect.apple.com/apps) on App Store Connect and create a New App.
* Select "iOS"
* Select a name: this will have to be unique, so you may have to try a few different names here, but it will not be the name you see on your phone, so it's not that important.
* Select your primary language
* Select the Bundle Id you created above.
* SKU can be anything; e.g. "123"
* Select "Full Access"
* Click Create
* You do not need to fill out the next form. That is for submitting to the app store.

## GitHub Configuration Steps

## Setup Github
1. Create a new empty repository titled `Match-Secrets`
1. Fork https://github.com/LoopKit/LoopWorkspace into your account.
1. Create a [new personal access token](https://github.com/settings/tokens/new)
* Enter a name for your token. Something like "FastLane Access Token".
* 30 days is fine, or you can select longer if you'd like.
* Select the `repo` permission scope.
* Click "Generate token"
* Copy the token and record it. It will be used below as `GH_PAT`
1. Create a [new personal access token](https://github.com/settings/tokens/new):
* Enter a name for your token. Something like "FastLane Access Token".
* 30 days is fine, or you can select longer if you'd like.
* Select the `repo` permission scope.
* Click "Generate token"
* Copy the token and record it. It will be used below as `GH_PAT`
1. In the forked LoopWorkspace repo, go to Settings -> Secrets -> Actions
1. For each of the following secrets, tap on "New repository secret", then add the name of the secret, along with the value you recorded for it:
* `TEAMID`
* `FASTLANE_KEY_ID`
* `FASTLANE_ISSUER_ID`
* `FASTLANE_KEY`
* `GH_PAT`
* `MATCH_PASSWORD` - just make up a password for this
* `TEAMID`
* `FASTLANE_KEY_ID`
* `FASTLANE_ISSUER_ID`
* `FASTLANE_KEY`
* `GH_PAT`
* `MATCH_PASSWORD` - just make up a password for this

## Add Identifiers for Loop App

1. Click on the "Actions" tab of your LoopWorkspace repository.
1. Select "Add Identifiers"
1. Click "Run Workflow", and tap the green button.
1. Wait, and within a minute or two you should see a green checkmark indicating the workflow succeeded.

## Create App Group

1. Go to [Register an App Group](https://developer.apple.com/account/resources/identifiers/applicationGroup/add/) on the apple developer site.
1. For Description, use "Loop App Group"
1. For Identifier, enter "group.com.TEAMID.loopkit.LoopGroup", subsituting your team id for `TEAMID`
1. Click "Continue" and then "Register"

## Add App Group to Bundle Identifiers

1. Go to [Certificates, Identifiers & Profiles](https://developer.apple.com/account/resources/identifiers/list) on the apple developer site.
1. For each of the following identifiers:
* Loop
* Loop Intent Extension
* Loop Status Extension
* Small Status Widget
1. Click on the identifier's name.
1. On the "App Groups" capabilies, click on the "Configure" button.
1. Select the "Loop App Group"
1. Click "Continue".
1. Click "Save".
1. Click "Confirm".
1. Remember to do this for each of the identifiers above.

## Add Time Sensitive Notifications to Loop App ID
1. Go to [Certificates, Identifiers & Profiles](https://developer.apple.com/account/resources/identifiers/list) on the apple developer site.
1. Click on the "Loop" identifier
1. Scroll down to "Time Sensitive Notifications"
1. Tap the check box to enable Time Sensitive Notifications.
1. Click "Save".
1. Click "Confirm".
1. Remember to do this for each of the identifiers above.

## Create Loop App in App Store Connect

1. Go to the [apps list](https://appstoreconnect.apple.com/apps) on App Store Connect and click the blue "plus" icon to create a New App.
* Select "iOS"
* Select a name: this will have to be unique, so you may have to try a few different names here, but it will not be the name you see on your phone, so it's not that important.
* Select your primary language
* Choose the bundle ID that matches `com.TEAMID.loopkit.Loop`, with TEAMID matching your team id.
* SKU can be anything; e.g. "123"
* Select "Full Access"
* Click Create
* You do not need to fill out the next form. That is for submitting to the app store.

## Create Building Certficates

1. Go back to the "Actions" tab of your LoopWorkspace repository in github.
1. Select "Create Certificates"
1. Click "Run Workflow", and tap the green button.
1. Wait, and within a minute or two you should see a green checkmark indicating the workflow succeeded.

## Build Loop!

1. Click on the "Actions" tab of your LoopWorkspace repository.
1. Select "Build Loop"
1. Click "Run Workflow", select your branch, and tap the green button.
1. Wait, and your app should eventually appear on [App Store Connect](https://appstoreconnect.apple.com/apps)
1. For each phone/person you would like to support Loop on, send an invite to using the TestFlight
1. You have some time now. Go enjoy a coffee. The build should take about 20-30 minutes.
1. Your app should eventually appear on [App Store Connect](https://appstoreconnect.apple.com/apps)
1. For each phone/person you would like to support Loop on
* Add them in [Users and Access](https://appstoreconnect.apple.com/access/users) on App Store Connect
* Add them to your TestFlight Internal Testing group.