Skip to content

Commit 8216537

Browse files
authored
Refactor shared versioning (#21)
1 parent 6e6bce0 commit 8216537

File tree

11 files changed

+147
-153
lines changed

11 files changed

+147
-153
lines changed

.github/workflows/checkStyle.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
name: Check Style
2-
2+
concurrency: # Cancel currently running style checks when a new one is started
3+
group: style-${{ github.ref }}
4+
cancel-in-progress: true
35
on:
46
pull_request:
57

.github/workflows/publish.yml

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
name: Publish Shared Swift Package
2+
concurrency: # Cancel currently running releases when a new one is started
3+
group: publish-${{ github.ref_name }}
4+
cancel-in-progress: true
5+
6+
on:
7+
workflow_dispatch: # TODO remove
8+
branches:
9+
- refactor/shared-versioning
10+
push:
11+
branches:
12+
- develop
13+
- main
14+
paths:
15+
- 'androidApp/**'
16+
- 'shared/**'
17+
- 'buildSrc/**'
18+
- 'build.gradle.kts'
19+
- 'gradle.properties'
20+
- 'settings.gradle.kts'
21+
22+
jobs:
23+
changes:
24+
runs-on: ubuntu-latest
25+
outputs:
26+
android: ${{ steps.changes.outputs.android }}
27+
shared: ${{ steps.changes.outputs.shared }}
28+
steps:
29+
- uses: actions/checkout@v3
30+
- uses: dorny/paths-filter@v2
31+
id: changes
32+
with:
33+
base: ${{ github.ref }}
34+
filters: |
35+
android:
36+
- 'androidApp/**'
37+
shared:
38+
- 'shared/**'
39+
- 'buildSrc/**'
40+
- 'build.gradle.kts'
41+
- 'gradle.properties'
42+
- 'settings.gradle.kts'
43+
44+
release-shared:
45+
permissions:
46+
contents: write
47+
packages: write
48+
needs: changes
49+
if: ${{ needs.changes.outputs.shared == 'true' }}
50+
uses: touchlab/KMMBridgeGithubWorkflow/.github/workflows/[email protected]
51+
with:
52+
jvmVersion: 17
53+
versionBaseProperty: SHARED_BASE_VERSION
54+
# kmmBridgePublish = xcFramework, publishAndroidReleasePublicationToGitHubPackagesRepository = Android lib
55+
publishTask: kmmBridgePublish publishAndroidReleasePublicationToGitHubPackagesRepository
56+
secrets:
57+
gradle_params: "-PGITHUB_BRANCH=${{ github.ref_name }}"
58+
59+
60+
android-after-shared:
61+
needs: release-shared
62+
uses: ./.github/workflows/publishAndroid.yml
63+
64+
android-only:
65+
needs: changes
66+
if: ${{ needs.changes.outputs.android == 'true' && needs.changes.outputs.shared == 'false' }}
67+
uses: ./.github/workflows/publishAndroid.yml

.github/workflows/publishAndroid.yml

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,13 @@
11
name: Publish Android
2-
concurrency: # Cancel currently running releases when a new one is started
3-
group: publish-android-${{ github.ref_name }}
4-
cancel-in-progress: true
2+
53
on:
6-
push:
7-
branches:
8-
- main
9-
- develop
10-
paths:
11-
- 'androidApp/**'
12-
- 'shared/**'
13-
- 'buildSrc/**'
14-
- 'build.gradle.kts'
15-
- 'gradle.properties'
16-
- 'settings.gradle.kts'
4+
workflow_call:
175

186
jobs:
19-
publish:
7+
publish-android:
8+
concurrency:
9+
group: publish-android-${{ github.ref_name }}
10+
cancel-in-progress: true
2011
runs-on: ubuntu-latest
2112
steps:
2213
- name: Checkout repo
@@ -47,13 +38,13 @@ jobs:
4738
4839
- name: Release Android
4940
if: ${{ github.ref_name == 'main' }}
50-
run: ./gradlew publishProdReleaseApps --no-daemon -PkeyPassword=${{ secrets.KEY_PASSWORD }} -PstorePassword=${{ secrets.STORE_PASSWORD }}
41+
run: ./gradlew publishProdReleaseApps --no-daemon -PkeyPassword=${{ secrets.KEY_PASSWORD }} -PstorePassword=${{ secrets.STORE_PASSWORD }} -PremoteBuild=true -PGITHUB_PACKAGES_USERNAME=cirunner -PGITHUB_PACKAGES_PASSWORD=${{ secrets.GITHUB_TOKEN }}
5142
env:
5243
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx3g"
5344

5445
- name: Release Android Lava
55-
if: ${{ github.ref_name == 'develop' }}
56-
run: ./gradlew publishLavaReleaseApps --no-daemon -PkeyPassword=${{ secrets.KEY_PASSWORD }} -PstorePassword=${{ secrets.STORE_PASSWORD }}
46+
if: ${{ github.ref_name != 'main' }}
47+
run: ./gradlew publishLavaReleaseApps --no-daemon -PkeyPassword=${{ secrets.KEY_PASSWORD }} -PstorePassword=${{ secrets.STORE_PASSWORD }} -PremoteBuild=true -PGITHUB_PACKAGES_USERNAME=cirunner -PGITHUB_PACKAGES_PASSWORD=${{ secrets.GITHUB_TOKEN }}
5748
env:
5849
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx3g"
5950

.github/workflows/publishShared.yml

Lines changed: 0 additions & 27 deletions
This file was deleted.

.github/workflows/test.yml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
name: Test
2+
concurrency: # Cancel currently running tests when a new one is started
3+
group: test-${{ github.ref }}
4+
cancel-in-progress: true
25
on:
36
push:
4-
# Push to develop and main branches trigger a release -> tests are run anyway
57
branches-ignore:
6-
- 'develop'
7-
- 'main'
88
- 'build-**' # temporary build branch for kmmbridge
99

10-
1110
jobs:
1211
test:
1312
runs-on: macos-latest # use mac so that shared iOS targets can also be built

androidApp/build.gradle.kts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,28 @@ play {
154154
releaseStatus.set(ReleaseStatus.COMPLETED)
155155
}
156156

157+
val remoteBuild = project.findProperty("remoteBuild") == "true" // Default false
158+
if (remoteBuild) {
159+
repositories {
160+
maven {
161+
name = "GitHubPackages"
162+
url = uri("https://maven.pkg.github.com/DatepollSystems/WaiterRobot-Shared-Android")
163+
credentials {
164+
username = project.property("GITHUB_PACKAGES_USERNAME") as String
165+
password = project.property("GITHUB_PACKAGES_PASSWORD") as String
166+
}
167+
}
168+
}
169+
}
170+
val SHARED_GROUP: String by project
171+
val SHARED_BASE_VERSION: String by project
172+
157173
dependencies {
158-
implementation(project(":shared"))
174+
if (remoteBuild) {
175+
implementation("${SHARED_GROUP}:shared-android:${SHARED_BASE_VERSION}.+")
176+
} else {
177+
implementation(project(":shared"))
178+
}
159179

160180
implementation("androidx.lifecycle:lifecycle-process:${Versions.androidxLifecycle}")
161181
implementation("androidx.lifecycle:lifecycle-runtime-ktx:${Versions.androidxLifecycle}")

androidApp/src/main/AndroidManifest.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
33

4+
<uses-feature
5+
android:name="android.hardware.camera"
6+
android:required="false" />
7+
48
<uses-permission android:name="android.permission.INTERNET" />
59
<uses-permission android:name="android.permission.CAMERA" />
610

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ buildscript {
1212
classpath("com.android.tools.build:gradle:8.1.1")
1313
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}")
1414
classpath("org.jetbrains.kotlin:kotlin-serialization:${kotlinVersion}")
15+
classpath("com.codingfeline.buildkonfig:buildkonfig-gradle-plugin:0.14.0")
1516
}
1617
}
1718

gradle.properties

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,7 @@ android.useAndroidX=true
77
android.nonTransitiveRClass=true
88
#MPP
99
kotlin.mpp.enableCInteropCommonization=true
10-
kotlin.mpp.stability.nowarn=true
10+
kotlin.mpp.stability.nowarn=true
11+
12+
SHARED_BASE_VERSION=1.1
13+
SHARED_GROUP=org.datepollsystems.waiterrobot.shared

shared/build.gradle.kts

Lines changed: 35 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,44 @@
1-
import co.touchlab.faktory.internal.GithubCalls
2-
import co.touchlab.faktory.versionmanager.GitTagBasedVersionManager
3-
import co.touchlab.faktory.versionmanager.GitTagVersionManager
4-
import co.touchlab.faktory.versionmanager.GithubReleaseVersionWriter
5-
import co.touchlab.faktory.versionmanager.VersionManager
6-
import co.touchlab.faktory.versionmanager.VersionWriter
1+
import com.codingfeline.buildkonfig.compiler.FieldSpec.Type
72
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
8-
import java.util.Date
93

104
plugins {
115
kotlin("multiplatform")
12-
kotlin("native.cocoapods")
136
kotlin("plugin.serialization")
147
id("com.android.library")
15-
id("co.touchlab.faktory.kmmbridge") version "0.3.7"
8+
id("co.touchlab.kmmbridge") version "0.5.0"
169
`maven-publish`
1710
id("dev.jamiecraane.plugins.kmmresources") version "1.0.0-alpha11" // Shared localization
1811
id("io.realm.kotlin") version "1.10.2"
12+
id("com.codingfeline.buildkonfig")
1913
}
2014

21-
version = "1.0" // Shared package has only 2 digit version, patch is managed by kmmbridge.
22-
23-
val sharedNamespace = "org.datepollsystems.waiterrobot.shared"
2415
val generatedLocalizationRoot: String =
2516
File(project.buildDir, "generated/localizations").absolutePath
2617
val iosFrameworkName = "shared"
2718

19+
group = project.property("SHARED_GROUP") as String
20+
version = project.property(
21+
if (project.hasProperty("AUTO_VERSION")) "AUTO_VERSION" else "SHARED_BASE_VERSION"
22+
) as String
23+
2824
kotlin {
29-
android()
25+
// For some reason androidTarget is recognized by IntelliJ,
26+
// but when building it throws "Unresolved reference: androidTarget"
27+
// -> Just keep it till it is removed
28+
android {
29+
publishAllLibraryVariants()
30+
}
3031

31-
iosX64()
32-
iosArm64()
33-
iosSimulatorArm64()
32+
listOf(
33+
iosX64(),
34+
iosArm64(),
35+
iosSimulatorArm64()
36+
).forEach {
37+
it.binaries.framework {
38+
// Must be set to false for shared localization (otherwise resources are not available)
39+
isStatic = false
40+
}
41+
}
3442

3543
// needed to export kotlin documentation in objective-c headers
3644
targets.withType<KotlinNativeTarget> {
@@ -120,27 +128,13 @@ kotlin {
120128
}
121129
}
122130

123-
// Needed for kmmbrigde to create swift package
124-
cocoapods {
125-
name = iosFrameworkName
126-
summary = "Shared KMM iOS-module of the WaiterRobot app"
127-
homepage = "https://github.com/DatepollSystems/waiterrobot-mobile_android-shared"
128-
authors = "DatepollSystems"
129-
ios.deploymentTarget = "15"
130-
131-
framework {
132-
// Must be set to false for shared localization (otherwise resources are not available)
133-
isStatic = false
134-
}
135-
}
136-
137131
sourceSets.all {
138132
languageSettings.optIn("kotlin.RequiresOptIn")
139133
}
140134
}
141135

142136
android {
143-
namespace = sharedNamespace
137+
namespace = group as String
144138
compileSdk = Versions.androidCompileSdk
145139
defaultConfig {
146140
minSdk = Versions.androidMinSdk
@@ -151,25 +145,28 @@ android {
151145
sourceSets["main"].res.srcDir("$generatedLocalizationRoot/androidMain/res")
152146
}
153147

148+
addGithubPackagesRepository()
154149
kmmbridge {
155150
mavenPublishArtifacts()
156-
/** [co.touchlab.faktory.KmmBridgeExtension.githubReleaseVersions] */
157-
versionManager.set(CustomGitVersionManager(GitTagVersionManager))
158-
versionWriter.set(GithubReleaseVersionWriter(GithubCalls)) // TODO modify to support draft releases, custom title and generation of release notes (for api see https://docs.github.com/en/rest/releases/releases?apiVersion=2022-11-28#create-a-release)?
159151
spm()
160-
versionPrefix.set(version as String)
161152
}
162-
addGithubPackagesRepository()
163153

164154
kmmResourcesConfig {
165-
androidApplicationId.set(sharedNamespace) // appId of the shared module
166-
packageName.set("${sharedNamespace}.generated.localization")
155+
androidApplicationId.set(group as String) // appId of the shared module
156+
packageName.set("$group.generated.localization")
167157
defaultLanguage.set("en")
168158
input.set(File(project.projectDir, "localization.yml"))
169159
output.set(project.projectDir)
170160
srcFolder.set(generatedLocalizationRoot) // place the generated files in the build folder
171161
}
172162

163+
buildkonfig {
164+
packageName = "$group.buildkonfig"
165+
defaultConfigs {
166+
buildConfigField(Type.STRING, "sharedVersion", version as String, const = true)
167+
}
168+
}
169+
173170
tasks {
174171
// Plutil generates the localizations for ios
175172
val plutil = named("executePlutil") {
@@ -210,30 +207,6 @@ tasks {
210207
}
211208
}
212209

213-
/**
214-
* Adds a suffix to the version when a lava/pre release is made
215-
* see [co.touchlab.faktory.versionmanager.GitTagVersionManager]
216-
*/
217-
class CustomGitVersionManager(
218-
private val manager: GitTagBasedVersionManager
219-
) : VersionManager by manager {
220-
override fun getVersion(
221-
project: Project,
222-
versionPrefix: String,
223-
versionWriter: VersionWriter
224-
): String {
225-
val baseVersion = manager.getVersion(project, versionPrefix, versionWriter)
226-
227-
// Add version suffix for dev releases
228-
// e.g. main -> 1.0.1, develop -> 1.0.1-lava-1676142940
229-
return when (val branch = project.property("GITHUB_BRANCH")) {
230-
"main" -> baseVersion
231-
"develop" -> "$baseVersion-lava-${Date().toInstant().epochSecond}"
232-
else -> throw IllegalStateException("Unexpected value for property GITHUB_BRANCH: $branch")
233-
}
234-
}
235-
}
236-
237210
detekt {
238211
source.from(
239212
"src/androidMain/kotlin",

0 commit comments

Comments
 (0)