Republish setup: fastlane + Forgejo CI, signing/version fixes, Play-policy link
Some checks failed
ci / analyze (push) Failing after 2m3s
ci / test (push) Failing after 1m26s
release / android (push) Failing after 5m51s

- support_page: repoint comunes.org link to project page (Play re-approval)
- build.gradle: conditional release signing (debug fallback), versionCode/Name
  from pubspec, drop duplicate google-services plugin
- pubspec: version 1.10.0+10 (versionCode must exceed last uploaded)
- track AndroidManifest.xml (no secrets in it)
- fastlane: Appfile/Fastfile (deploy_play/deploy_metadata/promote_production) +
  Gemfile + es/en/gl store metadata
- .forgejo: ci.yml (analyze+test) + release.yml (tag v* -> signed AAB -> Play internal)
- README + RELEASE.md
This commit is contained in:
vjrj 2026-07-16 20:49:28 +02:00
parent cea395007d
commit 4461481668
24 changed files with 446 additions and 15 deletions

View file

@ -12,9 +12,14 @@ if (localPropertiesFile.exists()) {
}
}
// Release signing is opt-in: only load key.properties if it exists. Without it
// (CI analyze/test jobs, contributors) builds fall back to debug signing.
def keystorePropertiesFile = rootProject.file("key.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
def hasReleaseKeystore = keystorePropertiesFile.exists()
if (hasReleaseKeystore) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
android {
compileSdkVersion 36
@ -29,23 +34,28 @@ android {
applicationId "org.comunes.fires"
minSdkVersion flutter.minSdkVersion
targetSdkVersion 36
versionCode 9
versionName "1.9"
// versionCode/versionName come from pubspec.yaml (version: X.Y.Z+CODE)
// so a `v*` git tag maps the release version, matching the tane flow.
versionCode flutter.versionCode
versionName flutter.versionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
if (hasReleaseKeystore) {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
}
}
buildTypes {
release {
signingConfig signingConfigs.release
// Sign with the release key when available, else debug (contributors/CI).
signingConfig hasReleaseKeystore ? signingConfigs.release : signingConfigs.debug
minifyEnabled true
shrinkResources true
@ -83,5 +93,3 @@ dependencies {
}
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.gms.google-services'

View file

@ -0,0 +1,47 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.comunes.fires">
<!-- The INTERNET permission is required for development. Specifically,
flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
calls FlutterMain.startInitialization(this); in its onCreate method.
In most cases you can leave this as-is, but you if you want to provide
additional functionality it is fine to subclass or reimplement
FlutterApplication and put your custom class here. -->
<application
android:label="@string/app_name"
android:icon="@mipmap/launch_image"
android:enableOnBackInvokedCallback="true">
<meta-data
android:name="flutterEmbedding"
android:value="2" />
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- This keeps the window background of the activity showing
until Flutter renders its first frame. It can be removed if
there is no splash screen (such as the default splash screen
defined in @style/LaunchTheme). -->
<!-- <meta-data
android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
android:value="true" /> -->
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="FLUTTER_NOTIFICATION_CLICK" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>