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: jobs:
build: build:
runs-on: macos-latest 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: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Set up ruby env - name: Set up ruby env
uses: ruby/setup-ruby@v1 uses: ruby/setup-ruby@v1
with: with:
ruby-version: 3.2.1 ruby-version: 3.3
bundler-cache: true bundler-cache: true # runs 'bundle install' and caches installed gems automatically
- name: Install Flutter - name: Install Flutter
uses: subosito/flutter-action@v2 uses: subosito/flutter-action@v2
@@ -31,16 +34,24 @@ jobs:
echo "BUILD_NAME=${REF_NAME//v}" >> $GITHUB_ENV echo "BUILD_NAME=${REF_NAME//v}" >> $GITHUB_ENV
- name: Setup SSH key for match git repo - 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: env:
MATCH_REPO_SSH_KEY: ${{ secrets.IOS_MATCH_REPO_SSH_KEY_BASE64 }} MATCH_REPO_SSH_KEY: ${{ secrets.IOS_MATCH_REPO_SSH_KEY_BASE64 }}
- name: Install fastlane - name: Install dependencies and clean up
run: bundle install run: |
flutter pub get
bundle exec pod install
flutter clean
bundle exec pod cache clean --all
working-directory: ios working-directory: ios
- name: Run fastlane lane - name: Run fastlane lane
run: bundle exec fastlane deploy_release run: bundle exec fastlane deploy_release --verbose
working-directory: ios working-directory: ios
env: env:
BUILD_NUMBER: ${{ github.run_number }} BUILD_NUMBER: ${{ github.run_number }}
@@ -50,3 +61,4 @@ jobs:
IOS_ASC_ISSUER_ID: ${{ secrets.IOS_ASC_ISSUER_ID }} IOS_ASC_ISSUER_ID: ${{ secrets.IOS_ASC_ISSUER_ID }}
IOS_ASC_KEY: ${{ secrets.IOS_ASC_KEY }} IOS_ASC_KEY: ${{ secrets.IOS_ASC_KEY }}
MATCH_PASSWORD: ${{ secrets.IOS_MATCH_PASSWORD }} 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 ## 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 ### Icons and logos
The application uses a custom launcher icon and splash screen. These are managed platform-independently using the `flutter_launcher_icons` package. 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 ```bash
dart run flutter_launcher_icons 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/): ### Deploying a new version
- https://docs.fastlane.tools/actions/deliver/ 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
- https://docs.fastlane.tools/actions/supply/ ```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 ## Fastlane - in depth
@@ -52,22 +46,16 @@ bundle exec fastlane <lane>
``` ```
This is reused in the CI/CD pipeline to automate the deployment process. 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 ## Secrets
These are mostly used by the CI/CD pipeline to deploy the application. 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).
**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
**Platform-specific secrets** are used by the CI/CD pipeline to deploy to the respective app stores. **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 - `GOOGLE_MAPS_API_KEY` is used to authenticate with the Google Maps API and is scoped to the android platform
- `ANDROID_SECRET_PROPERTIES_BASE64` contains the keystore password and key password - `ANDROID_KEYSTORE` is used to sign the android apk
- `ANDROID_GOOGLE_PLAY_JSON_BASE64` is used to authenticate with the Google Play Store api - `ANDROID_GOOGLE_KEY` 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_GOOGLE_MAPS_API_KEY` is used to authenticate with the Google Maps API and is scoped to the ios platform
- `IOS_ASC_KEY` as well - `IOS_GOOGLE_...`
- `IOS_ASC_KEY_ID` as well - `IOS_GOOGLE_...`
- `IOS_MATCH_PASSWORD` is used by fastlane match to download the certificates - `IOS_GOOGLE_...`
- `IOS_MATCH_REPO_SSH_KEY_BASE64` is used to authenticate with the git repository where the certificates are stored

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: 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**: Trips should be match your interests - not just the most popular destinations. - **Personalization**:The user's preferences should be reflected in the choice of destinations.
- **Efficiency**: Don't just walk in circles! Anyway creates the most efficient route for you. - **Efficiency**:The itinerary should be optimized for the user's constraints.
- **Flexibility**: Vacations are the time to be spontaneous. Anyway lets you update your plans on the go. - **Flexibility**: We aknowledge that tourism is a dynamic activity, and that users may want to change their plans on the go.
- **Discoverability**: Tourism means exploration. Anyway encourages you to take detours and make spontaneous decisions. - **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 - Flutter
- geolocator_apple (1.2.0): - geolocator_apple (1.2.0):
- Flutter - Flutter
- Google-Maps-iOS-Utils (6.0.0): - Google-Maps-iOS-Utils (6.1.0):
- GoogleMaps (~> 9.0) - GoogleMaps (~> 9.0)
- google_maps_flutter_ios (0.0.1): - google_maps_flutter_ios (0.0.1):
- Flutter - Flutter
- Google-Maps-iOS-Utils (< 7.0, >= 5.0) - Google-Maps-iOS-Utils (< 7.0, >= 5.0)
- GoogleMaps (< 10.0, >= 8.4) - GoogleMaps (< 10.0, >= 8.4)
- GoogleMaps (9.1.1): - GoogleMaps (9.2.0):
- GoogleMaps/Maps (= 9.1.1) - GoogleMaps/Maps (= 9.2.0)
- GoogleMaps/Base (9.1.1) - GoogleMaps/Maps (9.2.0)
- GoogleMaps/Maps (9.1.1):
- GoogleMaps/Base
- map_launcher (0.0.1): - map_launcher (0.0.1):
- Flutter - Flutter
- path_provider_foundation (0.0.1): - path_provider_foundation (0.0.1):
@@ -74,9 +72,9 @@ SPEC CHECKSUMS:
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
geocoding_ios: bcbdaa6bddd7d3129c9bcb8acddc5d8778689768 geocoding_ios: bcbdaa6bddd7d3129c9bcb8acddc5d8778689768
geolocator_apple: d981750b9f47dbdb02427e1476d9a04397beb8d9 geolocator_apple: d981750b9f47dbdb02427e1476d9a04397beb8d9
Google-Maps-iOS-Utils: cfe6a0239c7ca634b7e001ad059a6707143dc8dc Google-Maps-iOS-Utils: 0a484b05ed21d88c9f9ebbacb007956edd508a96
google_maps_flutter_ios: 0291eb2aa252298a769b04d075e4a9d747ff7264 google_maps_flutter_ios: 0291eb2aa252298a769b04d075e4a9d747ff7264
GoogleMaps: 80ea184ed6bf44139f383a8b0e248ba3ec1cc8c9 GoogleMaps: 634ec3ca99698b31ca2253d64f017217d70cfb38
map_launcher: fe43bda6720bb73c12fcc1bdd86123ff49a4d4d6 map_launcher: fe43bda6720bb73c12fcc1bdd86123ff49a4d4d6
path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d
@@ -84,6 +82,6 @@ SPEC CHECKSUMS:
sqflite: c35dad70033b8862124f8337cc994a809fcd9fa3 sqflite: c35dad70033b8862124f8337cc994a809fcd9fa3
url_launcher_ios: 694010445543906933d732453a59da0a173ae33d url_launcher_ios: 694010445543906933d732453a59da0a173ae33d
PODFILE CHECKSUM: 819463e6a0290f5a72f145ba7cde16e8b6ef0796 PODFILE CHECKSUM: bd1a78910c05ac1e3a220e80f392c61ab2cc8789
COCOAPODS: 1.10.2 COCOAPODS: 1.10.2

View File

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

View File

@@ -10,4 +10,4 @@ IOS_ASC_ISSUER_ID="sample"
SIGNING_KEY_FILE_PATH="sample" SIGNING_KEY_FILE_PATH="sample"
SIGNING_KEY_PASSWORD="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", "flutter",
"build", "build",
"ipa", "ipa",
"--release", "--debug",
"--build-name=#{build_name}", "--build-name=#{build_name}",
"--build-number=#{build_number}", "--build-number=#{build_number}",
) )
@@ -44,7 +44,9 @@ platform :ios do
archive_path: "../build/ios/archive/Runner.xcarchive" archive_path: "../build/ios/archive/Runner.xcarchive"
) )
upload_to_testflight upload_to_testflight(
skip_waiting_for_build_processing: true,
)
end end
@@ -62,6 +64,16 @@ platform :ios do
readonly: true, 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( sh(
"flutter", "flutter",
"build", "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.