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..2a3272a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ 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] + +- 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