diff --git a/.github/workflows/release-aar.yaml b/.github/workflows/release-aar.yaml
new file mode 100644
index 00000000000000..2e8eb12f94cb10
--- /dev/null
+++ b/.github/workflows/release-aar.yaml
@@ -0,0 +1,27 @@
+name: Release React Native AAR
+# This workflow is manually triggered to release a new React Native AAR version
+on:
+  workflow_dispatch:
+
+jobs:
+  release-aar:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v2
+      - name: Build
+        run: |
+          cat <(echo -e "${{ secrets.OSSRH_GPG_SECRET_KEY }}") | gpg --batch --import
+          gpg --list-secret-keys --keyid-format LONG
+          yarn install
+          echo "signing.gnupg.keyName=5A0C5406E56C2DC4749A8E481AF5F9E36EC70A60" >> gradle.properties
+          echo "signing.gnupg.passphrase=${OSSRH_GPG_SECRET_KEY_PASSWORD}" >> gradle.properties
+          echo "repositoryUsername=${OSSRH_SONATYPE_USERNAME}" >> gradle.properties
+          echo "repositoryPassword=${OSSRH_SONATYPE_PASSWORD}" >> gradle.properties
+          sed -i.bu 's/com.facebook.react/com.walmartlabs.ern/g' ReactAndroid/gradle.properties
+          ./gradlew ReactAndroid:assembleRelease
+          ./gradlew ReactAndroid:uploadArchives
+        env:
+          OSSRH_GPG_SECRET_KEY: ${{ secrets.OSSRH_GPG_SECRET_KEY }}
+          OSSRH_GPG_SECRET_KEY_PASSWORD: ${{ secrets.OSSRH_GPG_SECRET_KEY_PASSWORD }}
+          OSSRH_SONATYPE_USERNAME: ${{ secrets.OSSRH_SONATYPE_USERNAME }}
+          OSSRH_SONATYPE_PASSWORD: ${{ secrets.OSSRH_SONATYPE_PASSWORD }}
diff --git a/ReactAndroid/release.gradle b/ReactAndroid/release.gradle
index 9ddc7cfc78be21..3d877ad8344dee 100644
--- a/ReactAndroid/release.gradle
+++ b/ReactAndroid/release.gradle
@@ -20,6 +20,18 @@ def isReleaseBuild() {
     return VERSION_NAME.contains("SNAPSHOT") == false
 }
 
+def getRepositoryUrl() {
+    return project.findProperty("repositoryUrl") ?: "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
+}
+
+def getRepositoryUsername() {
+    return project.findProperty("repositoryUsername") ?: ""
+}
+
+def getRepositoryPassword() {
+    return project.findProperty("repositoryPassword") ?: ""
+}
+
 def configureReactNativePom(def pom) {
     pom.project {
         name(POM_NAME)
@@ -72,9 +84,28 @@ afterEvaluate { project ->
 
     signing {
         required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
+        useGpgCmd()
         sign(configurations.archives)
     }
 
+     uploadArchives {
+        configuration = configurations.archives
+        repositories.mavenDeployer {
+            beforeDeployment {
+                MavenDeployment deployment -> signing.signPom(deployment)
+            }
+
+            repository(url: getRepositoryUrl()) {
+                authentication(
+                        userName: getRepositoryUsername(),
+                        password: getRepositoryPassword())
+
+            }
+
+            configureReactNativePom(pom)
+        }
+    }
+
     task installArchives(type: Upload) {
         configuration = configurations.archives
         repositories.mavenDeployer {