From 2fbffb200a6671bacf8c6ad7a7b3c187382c0894 Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Wed, 26 Feb 2025 11:39:25 +0700 Subject: [PATCH 01/10] Move releasePrepare task to separate script for beter reusibility --- app/build.gradle | 64 +--------------------------------- gradle/prepare_release.gradle | 65 +++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 63 deletions(-) create mode 100644 gradle/prepare_release.gradle diff --git a/app/build.gradle b/app/build.gradle index 8c55bc38..2cde6b9b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,69 +115,7 @@ task releaseClean(dependsOn: ensureCleanRepo) { // bumpType[major|minor|patch] -> will specify how the version bumping occurs. task releasePrepare(dependsOn: ensureCleanRepo) { doLast { - def applicationId = android.defaultConfig.applicationId - def versionName = android.defaultConfig.versionName - - if (versionName.indexOf("-") > -1) { - versionName = versionName.split("-")[0] - } - - // Prepare the release commit with the specific tag. - String buildText = buildFile.getText() - buildText = buildText.replaceFirst(/versionName(\s+.*)/, "versionName '$versionName'") - buildFile.setText(buildText) //replace the build file's text - grgit.add(patterns: ['app/build.gradle']) - try { - grgit.commit(message: "[gradle-release-task] prepare release $applicationId-$versionName") - } catch (Exception e) { - throw new GradleException("Failed to commit, error:\n $e") - } - try { - grgit.tag.add { - name = versionName - message = "Release of $versionName" - } - } catch (Exception e) { - throw new GradleException("Failed to tag the repo, error:\n $e") - } - - // Set new version name from input parameters. - def newVersionName - if (project.properties.containsKey("bumpVersion")) { - newVersionName = project.properties["bumpVersion"] - println "Bumping the version directly (bumpVersion=$newVersionName)" - } else if (project.properties.containsKey("bumpType")) { - def (major, minor, patch) = versionName.tokenize('.') - switch (bumpType) { - case "major": - major = major.toInteger() + 1 - minor = 0 - patch = 0 - break - case "minor": - minor = minor.toInteger() + 1 - break - case "patch": - patch = patch.toInteger() + 1 - break - } - newVersionName = "$major.$minor.$patch" - } else { - throw new GradleException('Either bumpType or bumpVersion parameters should be provided') - } - - // Prepare for next development iteration. - def versionCode = android.defaultConfig.versionCode - def newVersionCode = versionCode + 1 - println "Bumping versionName from $versionName to $newVersionName" - println "Bumping versionCode from $versionCode to $newVersionCode" - buildText = buildFile.getText() - buildText = buildText.replaceFirst(/versionName(\s+.*)/, "versionName '$newVersionName-SNAPSHOT'") - buildText = buildText.replaceFirst(/versionCode(\s+.*)/, "versionCode $newVersionCode") - buildFile.setText(buildText) //replace the build file's text - grgit.add(patterns: ['app/build.gradle']) - grgit.commit(message: "[gradle-release-task] prepare for next development iteration") - println "Done!" + prepareRelease() } } diff --git a/gradle/prepare_release.gradle b/gradle/prepare_release.gradle new file mode 100644 index 00000000..963ed951 --- /dev/null +++ b/gradle/prepare_release.gradle @@ -0,0 +1,65 @@ +ext.prepareRelease = { + def applicationId = android.defaultConfig.applicationId + def versionName = android.defaultConfig.versionName + + if (versionName.indexOf("-") > -1) { + versionName = versionName.split("-")[0] + } + + // Prepare the release commit with the specific tag. + String buildText = buildFile.getText() + buildText = buildText.replaceFirst(/versionName(\s+.*)/, "versionName '$versionName'") + buildFile.setText(buildText) //replace the build file's text + grgit.add(patterns: ['app/build.gradle']) + try { + grgit.commit(message: "[gradle-release-task] prepare release $applicationId-$versionName") + } catch (Exception e) { + throw new GradleException("Failed to commit, error:\n $e") + } + try { + grgit.tag.add { + name = versionName + message = "Release of $versionName" + } + } catch (Exception e) { + throw new GradleException("Failed to tag the repo, error:\n $e") + } + + // Set new version name from input parameters. + def newVersionName + if (project.properties.containsKey("bumpVersion")) { + newVersionName = project.properties["bumpVersion"] + println "Bumping the version directly (bumpVersion=$newVersionName)" + } else if (project.properties.containsKey("bumpType")) { + def (major, minor, patch) = versionName.tokenize('.') + switch (bumpType) { + case "major": + major = major.toInteger() + 1 + minor = 0 + patch = 0 + break + case "minor": + minor = minor.toInteger() + 1 + break + case "patch": + patch = patch.toInteger() + 1 + break + } + newVersionName = "$major.$minor.$patch" + } else { + throw new GradleException('Either bumpType or bumpVersion parameters should be provided') + } + + // Prepare for next development iteration. + def versionCode = android.defaultConfig.versionCode + def newVersionCode = versionCode + 1 + println "Bumping versionName from $versionName to $newVersionName" + println "Bumping versionCode from $versionCode to $newVersionCode" + buildText = buildFile.getText() + buildText = buildText.replaceFirst(/versionName(\s+.*)/, "versionName '$newVersionName-SNAPSHOT'") + buildText = buildText.replaceFirst(/versionCode(\s+.*)/, "versionCode $newVersionCode") + buildFile.setText(buildText) //replace the build file's text + grgit.add(patterns: ['app/build.gradle']) + grgit.commit(message: "[gradle-release-task] prepare for next development iteration") + println "Done!" +} \ No newline at end of file From 53c6f5141742f0a3237303f9f5cf4e5e38e33bce Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Wed, 26 Feb 2025 11:42:26 +0700 Subject: [PATCH 02/10] Import prepare_release.gradle script --- app/build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 2cde6b9b..454e53e2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -113,6 +113,8 @@ task releaseClean(dependsOn: ensureCleanRepo) { // Task parameters: // bumpVersion -> if available will specify new versionName directly and ignores the `bumpType` parameter. // bumpType[major|minor|patch] -> will specify how the version bumping occurs. + +apply from: "${rootProject.projectDir}/gradle/prepare_release.gradle" task releasePrepare(dependsOn: ensureCleanRepo) { doLast { prepareRelease() From dbb3ab0c592b1fa183cbf2cc725b1644535e5ca7 Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Wed, 26 Feb 2025 13:21:12 +0700 Subject: [PATCH 03/10] Use dynamic module name in prepare_release gradle script --- gradle/prepare_release.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle/prepare_release.gradle b/gradle/prepare_release.gradle index 963ed951..9633b860 100644 --- a/gradle/prepare_release.gradle +++ b/gradle/prepare_release.gradle @@ -10,7 +10,7 @@ ext.prepareRelease = { String buildText = buildFile.getText() buildText = buildText.replaceFirst(/versionName(\s+.*)/, "versionName '$versionName'") buildFile.setText(buildText) //replace the build file's text - grgit.add(patterns: ['app/build.gradle']) + grgit.add(patterns: [project.name + '/build.gradle']) try { grgit.commit(message: "[gradle-release-task] prepare release $applicationId-$versionName") } catch (Exception e) { @@ -59,7 +59,7 @@ ext.prepareRelease = { buildText = buildText.replaceFirst(/versionName(\s+.*)/, "versionName '$newVersionName-SNAPSHOT'") buildText = buildText.replaceFirst(/versionCode(\s+.*)/, "versionCode $newVersionCode") buildFile.setText(buildText) //replace the build file's text - grgit.add(patterns: ['app/build.gradle']) + grgit.add(patterns: [project.name + '/build.gradle']) grgit.commit(message: "[gradle-release-task] prepare for next development iteration") println "Done!" -} \ No newline at end of file +} From cbd643f7c63aafa3995319ab7712a177680d9299 Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Wed, 26 Feb 2025 13:36:06 +0700 Subject: [PATCH 04/10] Move releaseClean and releasePerform tasks to separate scripts for better reusability --- app/build.gradle | 45 ++++------------------------------- gradle/clean_release.gradle | 29 ++++++++++++++++++++++ gradle/perform_release.gradle | 14 +++++++++++ 3 files changed, 48 insertions(+), 40 deletions(-) create mode 100644 gradle/clean_release.gradle create mode 100644 gradle/perform_release.gradle diff --git a/app/build.gradle b/app/build.gradle index 454e53e2..1ba2e1fa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,5 +1,8 @@ apply plugin: 'com.android.application' apply plugin: 'org.ajoberstar.grgit' +apply from: "${rootProject.projectDir}/gradle/prepare_release.gradle" +apply from: "${rootProject.projectDir}/gradle/clean_release.gradle" +apply from: "${rootProject.projectDir}/gradle/perform_release.gradle" android { compileSdk 34 @@ -80,33 +83,7 @@ task ensureCleanRepo { task releaseClean(dependsOn: ensureCleanRepo) { doLast { - def clean = true - def applicationId = android.defaultConfig.applicationId - - String headCommitMessage = grgit.head().shortMessage - while (headCommitMessage.contains("[gradle-release-task]")) { - clean = false - println "Found git commit: $headCommitMessage" - if (headCommitMessage.indexOf("$applicationId-") > -1) { - def tagName = headCommitMessage.split("$applicationId-")[1] - println "Removing the git tag: $tagName" - try { - grgit.tag.remove { - names = [tagName] - } - } catch (Exception e) { - println "Error while removing git tag:\n $e" - } - } - println "Resetting the git commit permanently!" - grgit.reset(commit: "HEAD~1", mode: "hard") - headCommitMessage = grgit.head().shortMessage - - } - if (clean){ - println "Repository is already clean" - } - println "Done!" + cleanRelease() } } @@ -114,7 +91,6 @@ task releaseClean(dependsOn: ensureCleanRepo) { // bumpVersion -> if available will specify new versionName directly and ignores the `bumpType` parameter. // bumpType[major|minor|patch] -> will specify how the version bumping occurs. -apply from: "${rootProject.projectDir}/gradle/prepare_release.gradle" task releasePrepare(dependsOn: ensureCleanRepo) { doLast { prepareRelease() @@ -123,17 +99,6 @@ task releasePrepare(dependsOn: ensureCleanRepo) { task releasePerform(dependsOn: ensureCleanRepo) { doLast { - boolean force = false - if (project.properties.containsKey("force")) { - force = project.properties["force"] - } - println "Pushing the newest commits to the remote repository (force: $force)" - try { - grgit.push(force: force, tags: true) - } catch (Exception e) { - throw new GradleException("Failed to push to the repo,\n" + - " you can try using -Pforce=true parameter to force the push, error: \n$e") - } - println "Done!" + performRelease() } } diff --git a/gradle/clean_release.gradle b/gradle/clean_release.gradle new file mode 100644 index 00000000..4ae689d7 --- /dev/null +++ b/gradle/clean_release.gradle @@ -0,0 +1,29 @@ +ext.cleanRelease = { + def clean = true + def applicationId = android.defaultConfig.applicationId + + String headCommitMessage = grgit.head().shortMessage + while (headCommitMessage.contains("[gradle-release-task]")) { + clean = false + println "Found git commit: $headCommitMessage" + if (headCommitMessage.indexOf("$applicationId-") > -1) { + def tagName = headCommitMessage.split("$applicationId-")[1] + println "Removing the git tag: $tagName" + try { + grgit.tag.remove { + names = [tagName] + } + } catch (Exception e) { + println "Error while removing git tag:\n $e" + } + } + println "Resetting the git commit permanently!" + grgit.reset(commit: "HEAD~1", mode: "hard") + headCommitMessage = grgit.head().shortMessage + + } + if (clean){ + println "Repository is already clean" + } + println "Done!" +} \ No newline at end of file diff --git a/gradle/perform_release.gradle b/gradle/perform_release.gradle new file mode 100644 index 00000000..115eb4e2 --- /dev/null +++ b/gradle/perform_release.gradle @@ -0,0 +1,14 @@ +ext.performRelease = { + boolean force = false + if (project.properties.containsKey("force")) { + force = project.properties["force"] + } + println "Pushing the newest commits to the remote repository (force: $force)" + try { + grgit.push(force: force, tags: true) + } catch (Exception e) { + throw new GradleException("Failed to push to the repo,\n" + + " you can try using -Pforce=true parameter to force the push, error: \n$e") + } + println "Done!" +} \ No newline at end of file From 3608b8a2c53ab761225624a5469c2a805e73b4e7 Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Wed, 26 Feb 2025 13:43:48 +0700 Subject: [PATCH 05/10] Move ensureCleanRepo task to separate script. Add release related tasks to utils module. --- app/build.gradle | 5 ++--- gradle/ensure_clean.gradle | 5 +++++ utils/build.gradle | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 gradle/ensure_clean.gradle diff --git a/app/build.gradle b/app/build.gradle index 1ba2e1fa..4e0624e3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'org.ajoberstar.grgit' apply from: "${rootProject.projectDir}/gradle/prepare_release.gradle" apply from: "${rootProject.projectDir}/gradle/clean_release.gradle" apply from: "${rootProject.projectDir}/gradle/perform_release.gradle" +apply from: "${rootProject.projectDir}/gradle/ensure_clean.gradle" android { compileSdk 34 @@ -75,9 +76,7 @@ dependencies { task ensureCleanRepo { doLast { - if (!grgit.repository.jgit.status().call().clean) { - throw new GradleException('Git status is not clean, please stash your changes!') - } + ensureClean() } } diff --git a/gradle/ensure_clean.gradle b/gradle/ensure_clean.gradle new file mode 100644 index 00000000..b66d1bff --- /dev/null +++ b/gradle/ensure_clean.gradle @@ -0,0 +1,5 @@ +ext.ensureClean = { + if (!grgit.repository.jgit.status().call().clean) { + throw new GradleException('Git status is not clean, please stash your changes!') + } +} \ No newline at end of file diff --git a/utils/build.gradle b/utils/build.gradle index 383c3f6b..8a3e30f1 100644 --- a/utils/build.gradle +++ b/utils/build.gradle @@ -3,6 +3,11 @@ plugins { id 'maven-publish' } +apply from: "${rootProject.projectDir}/gradle/prepare_release.gradle" +apply from: "${rootProject.projectDir}/gradle/clean_release.gradle" +apply from: "${rootProject.projectDir}/gradle/perform_release.gradle" +apply from: "${rootProject.projectDir}/gradle/ensure_clean.gradle" + android { compileSdk 34 namespace 'ai.elimu.content_provider.utils' @@ -53,3 +58,34 @@ publishing { tasks.named("publishReleasePublicationToMavenLocal") { mustRunAfter(":utils:bundleReleaseAar") } + +tasks.register('ensureCleanRepo') { + doLast { + ensureClean() + } +} + +tasks.register('releaseClean') { + dependsOn ensureCleanRepo + doLast { + cleanRelease() + } +} + +// Task parameters: +// bumpVersion -> if available will specify new versionName directly and ignores the `bumpType` parameter. +// bumpType[major|minor|patch] -> will specify how the version bumping occurs. + +tasks.register('releasePrepare') { + dependsOn ensureCleanRepo + doLast { + prepareRelease() + } +} + +tasks.register('releasePerform') { + dependsOn ensureCleanRepo + doLast { + performRelease() + } +} From 10c44528fd463da77696c315d9b56c4f4d82a4ed Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Thu, 27 Feb 2025 10:23:49 +0700 Subject: [PATCH 06/10] Release app and utils module together --- .github/workflows/gradle-release.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/gradle-release.yml b/.github/workflows/gradle-release.yml index e3c90150..a6635fcf 100644 --- a/.github/workflows/gradle-release.yml +++ b/.github/workflows/gradle-release.yml @@ -20,8 +20,12 @@ jobs: - run: git config user.name 'Nya Ξlimu' - run: git config user.email 'info@elimu.ai' - - run: ./gradlew releaseClean - - run: ./gradlew releasePrepare -PbumpType=patch - - run: ./gradlew releasePerform + - run: | + ./gradlew releaseClean + ./gradlew app:releasePrepare -PbumpType=patch + ./gradlew app:releasePerform + + ./gradlew utils:releasePrepare -PbumpType=patch + ./gradlew utils:releasePerform env: GITHUB_TOKEN: ${{ github.token }} From 18adfb4b21e0cf585cc8efaa3196d8962e8cd8a6 Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Thu, 27 Feb 2025 10:31:17 +0700 Subject: [PATCH 07/10] Add org.ajoberstar.grgit plugin for utils modulee for auto version bumping --- utils/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/utils/build.gradle b/utils/build.gradle index 8a3e30f1..3fb55a62 100644 --- a/utils/build.gradle +++ b/utils/build.gradle @@ -1,6 +1,7 @@ plugins { id 'com.android.library' id 'maven-publish' + id 'org.ajoberstar.grgit' } apply from: "${rootProject.projectDir}/gradle/prepare_release.gradle" From 45707336c2955147c12855113499f997bb861795 Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Thu, 27 Feb 2025 10:54:48 +0700 Subject: [PATCH 08/10] [FOR TESTING] Release utils to mavenLocal for testing --- .github/workflows/gradle-build.yml | 8 ++++++++ .github/workflows/gradle-release.yml | 5 +++++ utils/build.gradle | 9 +++++---- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/.github/workflows/gradle-build.yml b/.github/workflows/gradle-build.yml index 1d69479c..b1078d9e 100644 --- a/.github/workflows/gradle-build.yml +++ b/.github/workflows/gradle-build.yml @@ -21,3 +21,11 @@ jobs: java-version: ${{ matrix.java }} - uses: gradle/gradle-build-action@v2 - run: ./gradlew clean build + + release: + runs-on: ubuntu-latest + steps: + - run: | + ./gradlew utils:releasePrepare -PbumpType=patch + echo "Release utils done!" + diff --git a/.github/workflows/gradle-release.yml b/.github/workflows/gradle-release.yml index a6635fcf..a3c96199 100644 --- a/.github/workflows/gradle-release.yml +++ b/.github/workflows/gradle-release.yml @@ -29,3 +29,8 @@ jobs: ./gradlew utils:releasePerform env: GITHUB_TOKEN: ${{ github.token }} + + - run: | + echo "Printing out the release output!" + cd ~/.m2/repository/ai/elimu/content_provider/utils/1.2.29 + ls -lah diff --git a/utils/build.gradle b/utils/build.gradle index 3fb55a62..11bdf320 100644 --- a/utils/build.gradle +++ b/utils/build.gradle @@ -49,10 +49,11 @@ publishing { } } repositories { - maven { - credentials(PasswordCredentials) - url "https://maven.pkg.github.com/elimu-ai/content-provider" - } +// maven { +// credentials(PasswordCredentials) +// url "https://maven.pkg.github.com/elimu-ai/content-provider" +// } + mavenLocal() } } From 146e87f84a78f755d5dfc02d8c265d0b845ee9dd Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Thu, 27 Feb 2025 10:58:12 +0700 Subject: [PATCH 09/10] [FOR TESTING] Update gradle-build to run a test release of utils on mavenLocal --- .github/workflows/gradle-build.yml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/.github/workflows/gradle-build.yml b/.github/workflows/gradle-build.yml index b1078d9e..5a08758c 100644 --- a/.github/workflows/gradle-build.yml +++ b/.github/workflows/gradle-build.yml @@ -25,7 +25,14 @@ jobs: release: runs-on: ubuntu-latest steps: - - run: | - ./gradlew utils:releasePrepare -PbumpType=patch - echo "Release utils done!" + - uses: actions/checkout@v4 + - name: set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + cache: gradle + - run: | + ./gradlew utils:releasePrepare -PbumpType=patch + echo "Release utils done!" From 832d91de129a296bcc4816c1735929705f93dc5a Mon Sep 17 00:00:00 2001 From: Tuan Nguyen Date: Thu, 27 Feb 2025 13:13:23 +0700 Subject: [PATCH 10/10] [FOR TESTING] Perform utils release and print out all release artifacts --- .github/workflows/gradle-build.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/gradle-build.yml b/.github/workflows/gradle-build.yml index 5a08758c..0fc70f14 100644 --- a/.github/workflows/gradle-build.yml +++ b/.github/workflows/gradle-build.yml @@ -33,6 +33,10 @@ jobs: distribution: 'temurin' cache: gradle - run: | + ./gradlew utils:releaseClean ./gradlew utils:releasePrepare -PbumpType=patch + ./gradlew utils:releasePerform echo "Release utils done!" + echo "Printing out the release output!" + ls -lah ~/.m2/repository/ai/elimu/content_provider/utils/1.2.29