4 Commits

Author SHA1 Message Date
d1cbf972fe since branch names may contain slashes and other special chars they are not suitable for tag names. only use the hash
Some checks failed
Build and deploy the backend to staging / Build and push image (pull_request) Successful in 1m54s
Run linting on the backend code / Build (pull_request) Successful in 3m19s
Run testing on the backend code / Build (pull_request) Failing after 24m59s
2025-10-13 18:05:27 +02:00
fe2a0cf1d5 add missing dollar sign
Some checks failed
Build and deploy the backend to staging / Build and push image (pull_request) Failing after 36s
Run linting on the backend code / Build (pull_request) Successful in 2m46s
Run testing on the backend code / Build (pull_request) Has been cancelled
2025-10-13 18:03:39 +02:00
c11faee824 towards a better gitops deploy strategy
Some checks failed
Build and deploy the backend to staging / Build and push image (pull_request) Failing after 38s
Run linting on the backend code / Build (pull_request) Successful in 3m20s
Run testing on the backend code / Build (pull_request) Failing after 27m28s
2025-10-13 17:17:02 +02:00
97dacb1189 Fastlane fixes working up to a full release (#68)
Reviewed-on: #68
2025-04-30 11:01:48 +00:00
45 changed files with 92 additions and 241 deletions

1
.envrc Normal file
View File

@@ -0,0 +1 @@
use nix

View File

@@ -10,15 +10,7 @@ jobs:
name: Build and push image
uses: ./.gitea/workflows/workflow_build-image.yaml
with:
tag: stable
# sets the tag to the git tag that triggered the workflow - the deployment (configured in a separate repository) will use this tag and be deployed to production by argocd
tag: ${{ github.ref_name }}
secrets:
PACKAGE_REGISTRY_ACCESS: ${{ secrets.PACKAGE_REGISTRY_ACCESS }}
deploy-prod:
name: Deploy to production
uses: ./.gitea/workflows/workflow_deploy-container.yaml
with:
overlay: prod
secrets:
KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }}
needs: build-and-push

View File

@@ -12,15 +12,7 @@ jobs:
name: Build and push image
uses: ./.gitea/workflows/workflow_build-image.yaml
with:
tag: unstable
# sets a unique tag for each commit in the PR - this gets deployed to a separate application instance using argocd
tag: sha${{ github.sha }}
secrets:
PACKAGE_REGISTRY_ACCESS: ${{ secrets.PACKAGE_REGISTRY_ACCESS }}
deploy-prod:
name: Deploy to staging
uses: ./.gitea/workflows/workflow_deploy-container.yaml
with:
overlay: stg
secrets:
KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }}
needs: build-and-push

View File

@@ -5,7 +5,7 @@ on:
paths:
- frontend/**
name: Build and release release apps to production track
name: Build and release apps to beta track
jobs:
get-version:
@@ -13,6 +13,7 @@ jobs:
runs-on: macos
steps:
- uses: https://gitea.com/actions/checkout@v4
- name: Fetch tags from main branch
# since this workflow is triggered by a pull request, we want to match the latest tag of the main branch
id: version
@@ -20,14 +21,21 @@ jobs:
git fetch origin main --tags
LATEST_TAG=$(git describe --tags $(git rev-list --tags --max-count=1))
# remove the 'v' prefix from the tag name
echo "BUILD_NAME=${LATEST_TAG//v}" >> $GITHUB_ENV
echo "BUILD_NAME=${LATEST_TAG//v}" >> $GITHUB_OUTPUT
- name: Output the version that is being used
run: |
echo "Building for version ${{ steps.version.outputs.BUILD_NAME }}"
outputs:
build_name: ${{ steps.version.outputs.BUILD_NAME }}
build-android:
name: Build and upload android app
uses: ./.gitea/workflows/workflow_build-app-android.yaml
with:
build_type: beta
build_name: ${{ env.BUILD_NAME }}
build_name: ${{ needs.get-version.outputs.build_name }}
secrets:
ANDROID_SECRET_PROPERTIES_BASE64: ${{ secrets.ANDROID_SECRET_PROPERTIES_BASE64 }}
ANDROID_GOOGLE_PLAY_JSON_BASE64: ${{ secrets.ANDROID_GOOGLE_PLAY_JSON_BASE64 }}
@@ -40,7 +48,7 @@ jobs:
uses: ./.gitea/workflows/workflow_build-app-ios.yaml
with:
build_type: beta
build_name: ${{ env.BUILD_NAME }}
build_name: ${{ needs.get-version.outputs.build_name }}
secrets:
IOS_ASC_KEY_ID: ${{ secrets.IOS_ASC_KEY_ID }}
IOS_ASC_ISSUER_ID: ${{ secrets.IOS_ASC_ISSUER_ID }}
@@ -48,4 +56,4 @@ jobs:
IOS_MATCH_REPO_SSH_KEY_BASE64: ${{ secrets.IOS_MATCH_REPO_SSH_KEY_BASE64 }}
IOS_MATCH_PASSWORD: ${{ secrets.IOS_MATCH_PASSWORD }}
IOS_GOOGLE_MAPS_API_KEY: ${{ secrets.IOS_GOOGLE_MAPS_API_KEY }}
needs: get-version
needs: build-android # technically not needed, but this prevents the builds from running in parallel

View File

@@ -3,7 +3,7 @@ on:
tags:
- v*
name: Build and release release apps to production track
name: Build and release apps to production track
jobs:
get-version:
@@ -11,21 +11,28 @@ jobs:
runs-on: macos
steps:
- uses: https://gitea.com/actions/checkout@v4
- name: Get version from git tag
id: version
env:
REF_NAME: ${{ gitea.ref_name }}
# remove the 'v' prefix from the tag name
run: |
echo "BUILD_NAME=${REF_NAME//v}" >> $GITHUB_ENV
echo "BUILD_NAME=${REF_NAME//v}" >> $GITHUB_OUTPUT
- name: Output the version that is being used
run: |
echo "Building for version ${{ steps.version.outputs.BUILD_NAME }}"
outputs:
build_name: ${{ steps.version.outputs.BUILD_NAME }}
build-android:
name: Build and upload android app
uses: ./.gitea/workflows/workflow_build-app-android.yaml
with:
build_type: release
build_name: ${{ env.BUILD_NAME }}
build_name: ${{ needs.get-version.outputs.build_name }}
secrets:
ANDROID_SECRET_PROPERTIES_BASE64: ${{ secrets.ANDROID_SECRET_PROPERTIES_BASE64 }}
ANDROID_GOOGLE_PLAY_JSON_BASE64: ${{ secrets.ANDROID_GOOGLE_PLAY_JSON_BASE64 }}
@@ -38,12 +45,12 @@ jobs:
uses: ./.gitea/workflows/workflow_build-app-ios.yaml
with:
build_type: release
build_name: ${{ env.BUILD_NAME }}
build_name: ${{ needs.get-version.outputs.build_name }}
secrets:
IOS_ASC_KEY_ID: ${{ secrets.IOS_ASC_KEY_ID }}
IOS_ASC_ISSUER_ID: ${{ secrets.IOS_ASC_ISSUER_ID }}
IOS_ASC_KEY: ${{ secrets.IOS_ASC_KEY }}
IOS_MATCH_PASSWORD: ${{ secrets.IOS_MATCH_PASSWORD }}
IOS_MATCH_REPO_SSH_KEY_BASE64: ${{ secrets.IOS_MATCH_REPO_SSH_KEY_BASE64 }}
IOS_MATCH_PASSWORD: ${{ secrets.IOS_MATCH_PASSWORD }}
IOS_GOOGLE_MAPS_API_KEY: ${{ secrets.IOS_GOOGLE_MAPS_API_KEY }}
needs: get-version
needs: build-android # technically not needed, but this prevents the builds from running in parallel

View File

@@ -27,7 +27,7 @@ defaults:
jobs:
build:
runs-on: macos
runs-on: macos-14
env:
# $BUNDLE_GEMFILE must be set at the job level, so it is set for all steps
BUNDLE_GEMFILE: ${{ gitea.workspace }}/frontend/android/Gemfile

View File

@@ -31,7 +31,7 @@ defaults:
jobs:
build:
runs-on: macos
runs-on: macos-14
env:
# $BUNDLE_GEMFILE must be set at the job level, so it is set for all steps
BUNDLE_GEMFILE: ${{ gitea.workspace }}/frontend/ios/Gemfile
@@ -53,9 +53,13 @@ jobs:
ruby-version: 3.3
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
- uses: GuillaumeFalourd/setup-rsync@v1.2
# rsync is required by the google maps ios tools
- name: Install dependencies and clean up
run: |
flutter pub get
flutter precache --ios
bundle exec pod install --allow-root
flutter clean
bundle exec pod cache clean --all --allow-root
@@ -69,6 +73,11 @@ jobs:
env:
MATCH_REPO_SSH_KEY: ${{ secrets.IOS_MATCH_REPO_SSH_KEY_BASE64 }}
- name: Replace API Key from secret
# on a macOS runner, sed requires a replacement suffix after the -i flag
run: |
sed -i '' -e "s/IOS_GOOGLE_MAPS_API_KEY/${{ secrets.IOS_GOOGLE_MAPS_API_KEY }}/g" Runner/AppDelegate.swift
- name: Run fastlane lane
run: bundle exec fastlane deploy_${{ inputs.build_type }}
env:

View File

@@ -1,35 +0,0 @@
on:
workflow_call:
inputs:
overlay:
required: true
type: string
secrets:
KUBE_CONFIG:
required: true
name: Deploy the newly built container
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
steps:
- uses: https://gitea.com/actions/checkout@v4
with:
submodules: true
- name: setup kubectl
uses: https://github.com/azure/setup-kubectl@v4
- name: Set kubeconfig
run: |
echo "${{ secrets.KUBE_CONFIG }}" > kubeconfig
- name: Deploy to k8s
run: |
kubectl apply -k backend/deployment/overlays/${{ inputs.overlay }} --kubeconfig=kubeconfig
kubectl -n anyway-backend rollout restart deployment/anyway-backend-${{ inputs.overlay }} --kubeconfig=kubeconfig

1
.gitignore vendored
View File

@@ -1 +1,2 @@
cache/
.direnv/

8
.vscode/launch.json vendored
View File

@@ -9,9 +9,7 @@
"name": "Backend - debug",
"type": "debugpy",
"request": "launch",
"env": {
"DEBUG": "true"
},
"envFile": "${workspaceFolder}/backend/debug.env",
"jinja": true,
"cwd": "${workspaceFolder}/backend",
"module": "fastapi",
@@ -25,9 +23,7 @@
"type": "debugpy",
"request": "launch",
"program": "src/tester.py",
"env": {
"DEBUG": "true"
},
"envFile": "${workspaceFolder}/backend/debug.env",
"cwd": "${workspaceFolder}/backend"
},
// frontend - flutter app

3
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,3 @@
{
"nixEnvSelector.nixFile": "${workspaceFolder}/default.nix"
}

5
backend/.gitignore vendored
View File

@@ -1,3 +1,6 @@
# all .env files
*.env
# osm-cache
cache_XML/
@@ -165,4 +168,4 @@ cython_debug/
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
#.idea/

17
default.nix Normal file
View File

@@ -0,0 +1,17 @@
{ pkgs ? import <nixpkgs> { config.android_sdk.accept_license = true; config.allowUnfree = true; } }:
pkgs.mkShell {
buildInputs = [
pkgs.flutter
#pkgs.android-tools # for adb
#pkgs.openjdk # required for Android builds
];
# Set up Android SDK paths if needed
shellHook = ''
export ANDROID_SDK_ROOT=${pkgs.androidsdk}/libexec/android-sdk
export PATH=$PATH:${pkgs.androidsdk}/libexec/android-sdk/platform-tools
echo "Flutter dev environment ready. 'adb' and 'flutter' are available."
'';
}

View File

@@ -1,59 +0,0 @@
on:
push:
tags:
- 'v*'
jobs:
build:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: Set up ruby env
uses: ruby/setup-ruby@v1
with:
ruby-version: 3.2.1
bundler-cache: true
- name: Setup java for android build
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'zulu'
- name: Setup android SDK
uses: android-actions/setup-android@v3
- name: Install Flutter
uses: subosito/flutter-action@v2
with:
channel: stable
flutter-version: 3.22.0
cache: true
- name: Infer version number from git tag
id: version
env:
REF_NAME: ${{ github.ref_name }}
run:
# remove the 'v' prefix from the tag name
echo "BUILD_NAME=${REF_NAME//v}" >> $GITHUB_ENV
- name: Put selected secrets into files
run: |
echo "${{ secrets.ANDROID_SECRET_PROPERTIES_BASE64 }}" | base64 -d > secrets.properties
echo "${{ secrets.ANDROID_GOOGLE_PLAY_JSON_BASE64 }}" | base64 -d > google-key.json
echo "${{ secrets.ANDROID_KEYSTORE_BASE64 }}" | base64 -d > release.keystore
working-directory: android
- name: Install fastlane
run: bundle install
working-directory: android
- name: Run fastlane lane
run: bundle exec fastlane deploy_release
working-directory: android
env:
BUILD_NUMBER: ${{ github.run_number }}
# BUILD_NAME is implicitly available
GOOGLE_MAPS_API_KEY: ${{ secrets.GOOGLE_MAPS_API_KEY }}

View File

@@ -1,64 +0,0 @@
on:
push:
tags:
- 'v*'
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: ${{ github.workspace }}/ios/Gemfile
steps:
- uses: actions/checkout@v4
- name: Set up ruby env
uses: ruby/setup-ruby@v1
with:
ruby-version: 3.3
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
- name: Install Flutter
uses: subosito/flutter-action@v2
with:
channel: stable
flutter-version: 3.22.0
cache: true
- name: Infer version number from git tag
id: version
env:
REF_NAME: ${{ github.ref_name }}
run:
# remove the 'v' prefix from the tag name
echo "BUILD_NAME=${REF_NAME//v}" >> $GITHUB_ENV
- name: Setup SSH key for match git repo
# 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 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 --verbose
working-directory: ios
env:
BUILD_NUMBER: ${{ github.run_number }}
# BUILD_NAME is implicitly available
GOOGLE_MAPS_API_KEY: ${{ secrets.GOOGLE_MAPS_API_KEY }}
IOS_ASC_KEY_ID: ${{ secrets.IOS_ASC_KEY_ID }}
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,7 +17,7 @@ platform :android do
)
upload_to_play_store(
track: 'alpha',
track: 'beta',
# upload aab files intstead
skip_upload_apk: true,
skip_upload_changelogs: true,

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 <your> 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

@@ -0,0 +1,7 @@
AnyWay is an application that helps you plan truly unique city trips. When planning a new trip, you can specify your 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,4 +1,4 @@
app_identifier("info.anydev.testing") # The bundle identifier of your app
app_identifier("info.anydev.anyway") # The bundle identifier of your app
apple_id("me@moll.re") # Your Apple Developer Portal username
itc_team_id("127439860") # App Store Connect Team ID

View File

@@ -28,17 +28,6 @@ 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",
@@ -74,15 +63,6 @@ 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",
@@ -101,9 +81,9 @@ platform :ios do
upload_to_app_store(
overwrite_screenshots: true,
metadata_path: "fastlane/metadata",
screenshot_path: "fastlane/screenshots",
screenshots_path: "fastlane/screenshots",
precheck_include_in_app_purchases: false,
force: true, # Skip HTMl report verification
submit_for_review: true,
automatic_release: true,
# automatically release the app after review

View File

@@ -1 +1 @@
2025 anydev

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 is an application that helps you plan truly unique city trips. When planning a new trip, you can specify your 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.
- 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.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 MiB

View File

@@ -1 +1 @@
AnyWay
Any.Way

View File

@@ -1 +1 @@
TRAVEL

View File

@@ -1 +1 @@
anydev.anyway@gmail.com

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

View File

Before

Width:  |  Height:  |  Size: 2.1 MiB

After

Width:  |  Height:  |  Size: 2.1 MiB

View File

Before

Width:  |  Height:  |  Size: 626 KiB

After

Width:  |  Height:  |  Size: 626 KiB

View File

Before

Width:  |  Height:  |  Size: 758 KiB

After

Width:  |  Height:  |  Size: 758 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

View File

Before

Width:  |  Height:  |  Size: 2.5 MiB

After

Width:  |  Height:  |  Size: 2.5 MiB

View File

Before

Width:  |  Height:  |  Size: 574 KiB

After

Width:  |  Height:  |  Size: 574 KiB

View File

Before

Width:  |  Height:  |  Size: 800 KiB

After

Width:  |  Height:  |  Size: 800 KiB