diff --git a/.github/workflows/publish-android.yml b/.github/workflows/publish-android.yml
new file mode 100644
index 0000000..c5dd721
--- /dev/null
+++ b/.github/workflows/publish-android.yml
@@ -0,0 +1,35 @@
+name: Publish Native Android Library
+
+on: workflow_dispatch
+
+jobs:
+ publish-android:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ packages: write
+ steps:
+ - uses: actions/checkout@v4
+ - name: set up JDK 17
+ uses: actions/setup-java@v4
+ with:
+ java-version: '17'
+ distribution: 'adopt'
+ - name: Grant execute permission for gradlew
+ run: chmod +x ./gradlew
+ - name: Grant execute permission for publishing script
+ run: chmod +x ./scripts/publish-android.sh
+ - name: Make local props
+ run: |
+ cat << EOF > "local.properties"
+ ossrhUsername=${{ secrets.ANDROID_OSSRH_USERNAME }}
+ ossrhPassword=${{ secrets.ANDROID_OSSRH_PASSWORD }}
+ sonatypeStagingProfileId=${{ secrets.ANDROID_SONATYPE_STAGING_PROFILE_ID }}
+ signing.keyId=${{ secrets.ANDROID_SIGNING_KEY_ID }}
+ signing.password=${{ secrets.ANDROID_SIGNING_PASSWORD }}
+ signing.key=${{ secrets.ANDROID_SIGNING_KEY }}
+ EOF
+ echo "local.properties file has been created successfully."
+ - name: Run publish script
+ working-directory: ./scripts
+ run: ./publish-android.sh
\ No newline at end of file
diff --git a/.github/workflows/github_actions.yml b/.github/workflows/run-unit-tests.yml
similarity index 100%
rename from .github/workflows/github_actions.yml
rename to .github/workflows/run-unit-tests.yml
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 19dd6f9..d279835 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
The changes documented here do not include those from the original repository.
+## [Unreleased]
+
+### 28-01-2025
+- Add `publish-android` workflow to publish library under `io.ionic.libs` in Maven (https://outsystemsrd.atlassian.net/browse/RMET-3983)
+
## [1.2.0]
### 02-12-2024
diff --git a/build.gradle b/build.gradle
index 5cf518d..d633706 100644
--- a/build.gradle
+++ b/build.gradle
@@ -6,6 +6,9 @@ buildscript {
mavenCentral()
}
dependencies {
+ if (System.getenv("SHOULD_PUBLISH") == "true") {
+ classpath("io.github.gradle-nexus:publish-plugin:1.1.0")
+ }
classpath 'com.android.tools.build:gradle:8.7.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jacoco:org.jacoco.core:$jacocoVersion"
@@ -24,6 +27,11 @@ sonarqube {
}
}
+if (System.getenv("SHOULD_PUBLISH") == "true") {
+ apply plugin: "io.github.gradle-nexus.publish-plugin"
+ apply from: file("./scripts/publish-root.gradle")
+}
+
apply plugin: "com.android.library"
apply plugin: "kotlin-android"
apply plugin: "jacoco"
@@ -90,6 +98,10 @@ android {
testOptions {
unitTests.returnDefaultValues = true
}
+
+ publishing {
+ singleVariant("release")
+ }
}
repositories {
@@ -129,4 +141,8 @@ dependencies {
testImplementation 'org.mockito.kotlin:mockito-kotlin:4.0.0'
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.2"
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.2"
+}
+
+if (System.getenv("SHOULD_PUBLISH") == "true") {
+ apply from: file("./scripts/publish-module.gradle")
}
\ No newline at end of file
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
deleted file mode 100644
index d689004..0000000
--- a/docs/CHANGELOG.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Changelog
-All notable changes to this project will be documented in this file.
-
-The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
-and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-
-### 2022-04-12
-
-Create repository.
diff --git a/pom.xml b/pom.xml
index 1f81c4f..596ea77 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
- com.github.outsystems
- osbarcode-android
+ io.ionic.libs
+ ionbarcode-android
1.2.0
diff --git a/scripts/publish-android.sh b/scripts/publish-android.sh
new file mode 100755
index 0000000..7e5dedf
--- /dev/null
+++ b/scripts/publish-android.sh
@@ -0,0 +1,38 @@
+#!/usr/bin/env bash
+
+ANDROID_PATH=../
+LOG_OUTPUT=./tmp/publish-android.txt
+THE_VERSION=`sed -n 's/.*\(.*\)<\/version>.*/\1/p' ../pom.xml`
+
+# Get latest io.ionic:portals XML version info
+PUBLISHED_URL="https://repo1.maven.org/maven2/io/ionic/libs/ionbarcode-android/maven-metadata.xml"
+PUBLISHED_DATA=$(curl -s $PUBLISHED_URL)
+PUBLISHED_VERSION="$(perl -ne 'print and last if s/.*(.*)<\/latest>.*/\1/;' <<< $PUBLISHED_DATA)"
+
+if [[ "$THE_VERSION" == "$PUBLISHED_VERSION" ]]; then
+ printf %"s\n\n" "Duplicate: a published version exists for $THE_VERSION, skipping..."
+else
+ # Make log dir if doesnt exist
+ mkdir -p ./tmp
+
+ # Export ENV variable used by Gradle for Versioning
+ export THE_VERSION
+ export SHOULD_PUBLISH=true
+
+ printf %"s\n" "Attempting to build and publish version $THE_VERSION"
+ # Publish a release to the Maven repo
+ "$ANDROID_PATH"/gradlew clean build publishReleasePublicationToSonatypeRepository closeAndReleaseSonatypeStagingRepository --no-daemon --max-workers 1 -b "$ANDROID_PATH"/build.gradle -Pandroid.useAndroidX=true > $LOG_OUTPUT 2>&1
+ # Stage a version
+ # "$ANDROID_PATH"/gradlew clean build publishReleasePublicationToSonatypeRepository --no-daemon --max-workers 1 -b "$ANDROID_PATH"/build.gradle -Pandroid.useAndroidX=true > $LOG_OUTPUT 2>&1
+
+ echo $RESULT
+
+ if grep --quiet "BUILD SUCCESSFUL" $LOG_OUTPUT; then
+ printf %"s\n" "Success: Published to MavenCentral."
+ else
+ printf %"s\n" "Error publishing, check $LOG_OUTPUT for more info! Manually review and release from the Sonatype Repository Manager may be necessary https://s01.oss.sonatype.org/"
+ cat $LOG_OUTPUT
+ exit 1
+ fi
+
+fi
\ No newline at end of file
diff --git a/scripts/publish-module.gradle b/scripts/publish-module.gradle
new file mode 100644
index 0000000..350e5ba
--- /dev/null
+++ b/scripts/publish-module.gradle
@@ -0,0 +1,74 @@
+apply plugin: 'maven-publish'
+apply plugin: 'signing'
+
+def LIB_VERSION = System.getenv('THE_VERSION')
+
+task androidSourcesJar(type: Jar) {
+ archiveClassifier.set('sources')
+ from android.sourceSets.main.java.srcDirs
+ from android.sourceSets.main.kotlin.srcDirs
+}
+
+artifacts {
+ archives androidSourcesJar
+}
+
+group = 'io.ionic.libs'
+version = LIB_VERSION
+
+afterEvaluate {
+ publishing {
+ publications {
+ release(MavenPublication) {
+ // Coordinates
+ groupId 'io.ionic.libs'
+ artifactId 'ionbarcode-android'
+ version LIB_VERSION
+
+ // Two artifacts, the `aar` (or `jar`) and the sources
+ if (project.plugins.findPlugin("com.android.library")) {
+ from components.release
+ } else {
+ artifact("$buildDir/libs/${project.getName()}-${version}.jar")
+ }
+
+ artifact androidSourcesJar
+
+ // POM Data
+ pom {
+ name = 'ionbarcode-android'
+ description = 'Barcode Android Lib'
+ url = 'https://github.com/OutSystems/OSBarcodeLib-Android'
+ licenses {
+ license {
+ name = 'License'
+ url = 'https://github.com/OutSystems/OSBarcodeLib-Android/blob/main/LICENSE'
+ }
+ }
+ developers {
+ developer {
+ name = 'Ionic'
+ email = 'hi@ionic.io'
+ }
+ }
+
+ // Version Control Info
+ scm {
+ connection = 'scm:git:github.com:OutSystems/OSBarcodeLib-Android.git'
+ developerConnection = 'scm:git:ssh://github.com:OutSystems/OSBarcodeLib-Android.git'
+ url = 'https://github.com/OutSystems/OSBarcodeLib-Android/tree/main'
+ }
+ }
+ }
+ }
+ }
+}
+
+signing {
+ useInMemoryPgpKeys(
+ rootProject.ext["signing.keyId"],
+ rootProject.ext["signing.key"],
+ rootProject.ext["signing.password"],
+ )
+ sign publishing.publications
+}
\ No newline at end of file
diff --git a/scripts/publish-root.gradle b/scripts/publish-root.gradle
new file mode 100644
index 0000000..ea5c6ab
--- /dev/null
+++ b/scripts/publish-root.gradle
@@ -0,0 +1,37 @@
+// Create variables with empty default values
+ext["signing.keyId"] = ''
+ext["signing.key"] = ''
+ext["signing.password"] = ''
+ext["ossrhUsername"] = ''
+ext["ossrhPassword"] = ''
+ext["sonatypeStagingProfileId"] = ''
+
+File secretPropsFile = file('./local.properties')
+if (secretPropsFile.exists()) {
+ // Read local.properties file first if it exists
+ Properties p = new Properties()
+ new FileInputStream(secretPropsFile).withCloseable { is -> p.load(is) }
+ p.each { name, value -> ext[name] = value }
+} else {
+ // Use system environment variables
+ ext["ossrhUsername"] = System.getenv('ANDROID_OSSRH_USERNAME')
+ ext["ossrhPassword"] = System.getenv('ANDROID_OSSRH_PASSWORD')
+ ext["sonatypeStagingProfileId"] = System.getenv('ANDROID_SONATYPE_STAGING_PROFILE_ID')
+ ext["signing.keyId"] = System.getenv('ANDROID_SIGNING_KEY_ID')
+ ext["signing.key"] = System.getenv('ANDROID_SIGNING_KEY')
+ ext["signing.password"] = System.getenv('ANDROID_SIGNING_PASSWORD')
+}
+
+// Set up Sonatype repository
+nexusPublishing {
+ repositories {
+ sonatype {
+ stagingProfileId = sonatypeStagingProfileId
+ username = ossrhUsername
+ password = ossrhPassword
+ nexusUrl.set(uri("https://s01.oss.sonatype.org/service/local/"))
+ snapshotRepositoryUrl.set(uri("https://s01.oss.sonatype.org/content/repositories/snapshots/"))
+ }
+ }
+ repositoryDescription = 'OSBarcode Android Lib v' + System.getenv('THE_VERSION')
+}
\ No newline at end of file