1 Commits

Author SHA1 Message Date
e764393706 Some more pipeline-fixes (#46)
Some checks failed
/ push-to-remote (push) Successful in 13s
Build and deploy the backend to production / Deploy to production (push) Has been cancelled
Build and deploy the backend to production / Build and push image (push) Has been cancelled
Reviewed-on: #46
2024-12-21 15:54:04 +00:00
33 changed files with 65 additions and 120 deletions

View File

@@ -6,14 +6,17 @@ on:
jobs:
build:
runs-on: macos-latest
env:
# $BUNDLE_GEMFILE must be set at the job level, so it is set for all steps
BUNDLE_GEMFILE: ios/Gemfile
steps:
- uses: actions/checkout@v4
- name: Set up ruby env
uses: ruby/setup-ruby@v1
with:
ruby-version: 3.2.1
bundler-cache: true
ruby-version: 3.3
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
- name: Install Flutter
uses: subosito/flutter-action@v2
@@ -31,16 +34,24 @@ jobs:
echo "BUILD_NAME=${REF_NAME//v}" >> $GITHUB_ENV
- name: Setup SSH key for match git repo
run: echo "$MATCH_REPO_SSH_KEY" | base64 --decode > ~/.ssh/id_rsa && chmod 600 ~/.ssh/id_rsa
# and mark the host as known
run: |
echo $MATCH_REPO_SSH_KEY | base64 --decode > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan -p 2222 git.kluster.moll.re > ~/.ssh/known_hosts
env:
MATCH_REPO_SSH_KEY: ${{ secrets.IOS_MATCH_REPO_SSH_KEY_BASE64 }}
- name: Install fastlane
run: bundle install
- name: Install dependencies and clean up
run: |
flutter pub get
bundle exec pod install
flutter clean
bundle exec pod cache clean --all
working-directory: ios
- name: Run fastlane lane
run: bundle exec fastlane deploy_release
run: bundle exec fastlane deploy_release --verbose
working-directory: ios
env:
BUILD_NUMBER: ${{ github.run_number }}
@@ -50,3 +61,4 @@ jobs:
IOS_ASC_ISSUER_ID: ${{ secrets.IOS_ASC_ISSUER_ID }}
IOS_ASC_KEY: ${{ secrets.IOS_ASC_KEY }}
MATCH_PASSWORD: ${{ secrets.IOS_MATCH_PASSWORD }}
IOS_GOOGLE_MAPS_API_KEY: ${{ secrets.IOS_GOOGLE_MAPS_API_KEY }}

View File

@@ -17,17 +17,7 @@ flutter pub get
```
## Development
### TODO
## Deployment and metadata
### Deploying a new version
To truly deploy a new version of the application, i.e. to the official app stores, a special CI step is required. This listens for new tags. To create a new tag position yourself on the main branch and run
```bash
git tag -a v<name> -m "Release <name>"
git push origin v<name>
```
We adhere to the [Semantic Versioning](https://semver.org/) standard, so the tag should be of the form `v0.1.8` for example.
### ...
### Icons and logos
The application uses a custom launcher icon and splash screen. These are managed platform-independently using the `flutter_launcher_icons` package.
@@ -35,10 +25,14 @@ To update the icons, change the `flutter_launcher_icons.yaml` configuration file
```bash
dart run flutter_launcher_icons
```
### Other metadata
Fastlane provides mechanisms to update the metadata of the application. This includes the name, description, screenshots, etc. The metadata is stored in the `fastlane/metadata` directory of both the `android`and the `ios` version of the application. Both versions have different structures but **they should be kept in sync**. For more information see the [fastlane documentation](https://docs.fastlane.tools/):
- https://docs.fastlane.tools/actions/deliver/
- https://docs.fastlane.tools/actions/supply/
### Deploying a new version
To truly deploy a new version of the application, i.e. to the official app stores, a special CI step is required. This listens for new tags. To create a new tag position yourself on the main branch and run
```bash
git tag -a v<name> -m "Release <name>"
git push origin v<name>
```
We adhere to the [Semantic Versioning](https://semver.org/) standard, so the tag should be of the form `v0.1.8` for example.
## Fastlane - in depth
@@ -52,22 +46,16 @@ bundle exec fastlane <lane>
```
This is reused in the CI/CD pipeline to automate the deployment process.
Secrets used by fastlane are stored on the github push mirror used for builds. See below.
Secrets used by fastlane are stored on hashicorp vault and are fetched by the CI/CD pipeline. See below.
## Secrets
These are mostly used by the CI/CD pipeline to deploy the application.
**Global secrets** are used for both versions of the app (android and ios).
- `GOOGLE_MAPS_API_KEY` is used to authenticate with the Google Maps API
These are mostly used by the CI/CD pipeline to deploy the application. The main usage for github actions is documented under [https://github.com/hashicorp/vault-action](https://github.com/hashicorp/vault-action).
**Platform-specific secrets** are used by the CI/CD pipeline to deploy to the respective app stores.
- `ANDROID_KEYSTORE_BASE64` is used to sign the android apk
- `ANDROID_SECRET_PROPERTIES_BASE64` contains the keystore password and key password
- `ANDROID_GOOGLE_PLAY_JSON_BASE64` is used to authenticate with the Google Play Store api
- `IOS_ASC_ISSUER_ID` is used to authenticate with the App Store Connect API
- `IOS_ASC_KEY` as well
- `IOS_ASC_KEY_ID` as well
- `IOS_MATCH_PASSWORD` is used by fastlane match to download the certificates
- `IOS_MATCH_REPO_SSH_KEY_BASE64` is used to authenticate with the git repository where the certificates are stored
- `GOOGLE_MAPS_API_KEY` is used to authenticate with the Google Maps API and is scoped to the android platform
- `ANDROID_KEYSTORE` is used to sign the android apk
- `ANDROID_GOOGLE_KEY` is used to authenticate with the Google Play Store api
- `IOS_GOOGLE_MAPS_API_KEY` is used to authenticate with the Google Maps API and is scoped to the ios platform
- `IOS_GOOGLE_...`
- `IOS_GOOGLE_...`
- `IOS_GOOGLE_...`

View File

@@ -1,7 +1,7 @@
AnyWay is an application that helps you plan truly unique city trips. When planning a new trip, you can specify <our> preferences and constraints and anyway generates a personalized itinerary just for you.
AnyWay - plan city trips your way
Anyway follows these core principles:
- **Personalization**: Trips should be match your interests - not just the most popular destinations.
- **Efficiency**: Don't just walk in circles! Anyway creates the most efficient route for you.
- **Flexibility**: Vacations are the time to be spontaneous. Anyway lets you update your plans on the go.
- **Discoverability**: Tourism means exploration. Anyway encourages you to take detours and make spontaneous decisions.
AnyWay is a mobile application that helps users plan city trips. The app allows users to specify their preferences and constraints, and then generates a personalized itinerary for them. The planning follows some guiding principles:
- **Personalization**:The user's preferences should be reflected in the choice of destinations.
- **Efficiency**:The itinerary should be optimized for the user's constraints.
- **Flexibility**: We aknowledge that tourism is a dynamic activity, and that users may want to change their plans on the go.
- **Discoverability**: Tourism is an inherently exploratory activity. Once a rough itinerary is generated, detours and spontaneous decisions should be encouraged.

View File

@@ -4,17 +4,15 @@ PODS:
- Flutter
- geolocator_apple (1.2.0):
- Flutter
- Google-Maps-iOS-Utils (6.0.0):
- Google-Maps-iOS-Utils (6.1.0):
- GoogleMaps (~> 9.0)
- google_maps_flutter_ios (0.0.1):
- Flutter
- Google-Maps-iOS-Utils (< 7.0, >= 5.0)
- GoogleMaps (< 10.0, >= 8.4)
- GoogleMaps (9.1.1):
- GoogleMaps/Maps (= 9.1.1)
- GoogleMaps/Base (9.1.1)
- GoogleMaps/Maps (9.1.1):
- GoogleMaps/Base
- GoogleMaps (9.2.0):
- GoogleMaps/Maps (= 9.2.0)
- GoogleMaps/Maps (9.2.0)
- map_launcher (0.0.1):
- Flutter
- path_provider_foundation (0.0.1):
@@ -74,9 +72,9 @@ SPEC CHECKSUMS:
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
geocoding_ios: bcbdaa6bddd7d3129c9bcb8acddc5d8778689768
geolocator_apple: d981750b9f47dbdb02427e1476d9a04397beb8d9
Google-Maps-iOS-Utils: cfe6a0239c7ca634b7e001ad059a6707143dc8dc
Google-Maps-iOS-Utils: 0a484b05ed21d88c9f9ebbacb007956edd508a96
google_maps_flutter_ios: 0291eb2aa252298a769b04d075e4a9d747ff7264
GoogleMaps: 80ea184ed6bf44139f383a8b0e248ba3ec1cc8c9
GoogleMaps: 634ec3ca99698b31ca2253d64f017217d70cfb38
map_launcher: fe43bda6720bb73c12fcc1bdd86123ff49a4d4d6
path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d
@@ -84,6 +82,6 @@ SPEC CHECKSUMS:
sqflite: c35dad70033b8862124f8337cc994a809fcd9fa3
url_launcher_ios: 694010445543906933d732453a59da0a173ae33d
PODFILE CHECKSUM: 819463e6a0290f5a72f145ba7cde16e8b6ef0796
PODFILE CHECKSUM: bd1a78910c05ac1e3a220e80f392c61ab2cc8789
COCOAPODS: 1.10.2

View File

@@ -8,9 +8,7 @@ import GoogleMaps
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
// load the key from env
let key = ProcessInfo.processInfo.environment["GOOGLE_MAPS_API_KEY"]!
GMSServices.provideAPIKey(key)
GMSServices.provideAPIKey("IOS_GOOGLE_MAPS_API_KEY")
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}

View File

@@ -10,4 +10,4 @@ IOS_ASC_ISSUER_ID="sample"
SIGNING_KEY_FILE_PATH="sample"
SIGNING_KEY_PASSWORD="sample"
GOOGLE_MAPS_API_KEY="sample"
IOS_GOOGLE_MAPS_API_KEY="sample"

View File

@@ -1,3 +0,0 @@
# The Deliverfile allows you to store various App Store Connect metadata
# For more information, check out the docs
# https://docs.fastlane.tools/actions/deliver/

View File

@@ -33,7 +33,7 @@ platform :ios do
"flutter",
"build",
"ipa",
"--release",
"--debug",
"--build-name=#{build_name}",
"--build-number=#{build_number}",
)
@@ -44,7 +44,9 @@ platform :ios do
archive_path: "../build/ios/archive/Runner.xcarchive"
)
upload_to_testflight
upload_to_testflight(
skip_waiting_for_build_processing: true,
)
end
@@ -62,6 +64,16 @@ platform :ios do
readonly: true,
)
# replace secrets by real values, the stupid way
sh(
"sed",
"-i",
"",
"s/IOS_GOOGLE_MAPS_API_KEY/#{ENV["IOS_GOOGLE_MAPS_API_KEY"]}/g",
"../Runner/AppDelegate.swift"
)
sh(
"flutter",
"build",

View File

@@ -1,7 +0,0 @@
AnyWay is an application that helps you plan truly unique city trips. When planning a new trip, you can specify <our> preferences and constraints and anyway generates a personalized itinerary just for you.
Anyway follows these core principles:
- **Personalization**: Trips should be match your interests - not just the most popular destinations.
- **Efficiency**: Don't just walk in circles! Anyway creates the most efficient route for you.
- **Flexibility**: Vacations are the time to be spontaneous. Anyway lets you update your plans on the go.
- **Discoverability**: Tourism means exploration. Anyway encourages you to take detours and make spontaneous decisions.

View File

@@ -1 +0,0 @@
tourism, cities, travel, guide

View File

@@ -1 +0,0 @@
https://anydev.info

View File

@@ -1 +0,0 @@
AnyWay

View File

@@ -1 +0,0 @@
https://anydev.info/privacy

View File

@@ -1 +0,0 @@
AnyWay - plan city trips your way!

View File

@@ -1 +0,0 @@
Plan city trips your way!

View File

@@ -1,30 +0,0 @@
## Screenshots Naming Rules
Put all screenshots you want to use inside the folder of its language (e.g. `en-US`).
The device type will automatically be recognized using the image resolution.
The screenshots can be named whatever you want, but keep in mind they are sorted
alphabetically, in a human-friendly way. See https://github.com/fastlane/fastlane/pull/18200 for more details.
### Exceptions
#### iPad Pro (3rd Gen) 12.9"
Since iPad Pro (3rd Gen) 12.9" and iPad Pro (2nd Gen) 12.9" have the same image
resolution, screenshots of the iPad Pro (3rd gen) 12.9" must contain either the
string `iPad Pro (12.9-inch) (3rd generation)`, `IPAD_PRO_3GEN_129`, or `ipadPro129`
(App Store Connect's internal naming of the display family for the 3rd generation iPad Pro)
in its filename to be assigned the correct display family and to be uploaded to
the correct screenshot slot in your app's metadata.
### Other Platforms
#### Apple TV
Apple TV screenshots should be stored in a subdirectory named `appleTV` with language
folders inside of it.
#### iMessage
iMessage screenshots, like the Apple TV ones, should also be stored in a subdirectory
named `iMessage`, with language folders inside of it.