Giter Club home page Giter Club logo

huawei-appgallery-publish-gradle-plugin's Introduction

Huawei AppGallery Publishing Gradle Plugin

Maven Central License

The plugin allows to publish the android release build files (*.apk and *.aab) to the Huawei AppGallery by use official Huawei Publish API (v2)

๐Ÿšง That's unofficial plugin. We did it for himself and share it for you.

Table of contents

Features

The following features are available:

  • โœ… Publish APK or AAB build file in Huawei AppGallery
  • โœ… Submit the build on all users after getting store approve
  • โœ… Publish the build on a part of users (Release Phases)
  • โœ… Update Release Notes for publishing build (Release Notes)
  • โœ… Update App Basic Info for publishing build
  • โœ… Separated settings for different configurations build types and flavors
  • โœ… Support of Gradle Portal and Gradle DSL
  • โœ… Support of Gradle 8.+
  • โœ… Support of Configuration Cache

The following features are missing:

  • ๐Ÿšธ Change App Store Information: description, app icon, screenshots and etc.

The following features doesn't support Huawei Publishing API:

  • โ›” Update appname, title and description.
  • โ›” Rollout Holding

Compatibility

The Android Gradle Plugin often changes the Variant API, so a different version of AGP corresponds to a specific version of the current plugin

Android Gradle Plugin Huawei Publishing Plugin
4.0.+ 1.2.3
4.1.+ 1.2.4
4.2.+ 1.2.6
7.+ 1.3.8
8.+ latest

Adding the plugin to your project

in application module ./app/build.gradle

Using the Gradle plugin DSL

plugins {
    id("com.android.application")
    id("ru.cian.huawei-publish-gradle-plugin")
}
Snapshot builds are also available ___

You'll need to add the Sonatype snapshots repository. Look for the actual version of the snapshot in the name of the opened snapshot-<VERSION> repository branch.

in ./settings.gradle

pluginManagement {

    resolutionStrategy {
        eachPlugin {
            if(requested.id.namespace == "ru.cian") {
                useModule("ru.cian:huawei-publish-gradle-plugin:<SNAPSHOT-VERSION>")
            }
        }
    }

    plugins {
        id("ru.cian.huawei-publish-gradle-plugin") version huaweiPublish apply false
    }

    repositories {
        maven { url 'https://oss.sonatype.org/content/repositories/snapshots' }
    }
}

Using the apply method

buildscript {
    repositories {
        mavenCentral() // or gradlePluginPortal()
    }

    dependencies {
        classpath "ru.cian:huawei-publish-gradle-plugin:<VERSION>"
    }
}

apply plugin: 'com.android.application'
apply plugin: 'ru.cian.huawei-publish-gradle-plugin'
Snapshot builds are also available ___

You'll need to add the Sonatype snapshots repository. Look for the actual version of the snapshot in the name of the opened snapshot-<VERSION> repository branch.

buildscript {
    repositories {
        maven { url 'https://oss.sonatype.org/content/repositories/snapshots' }
    }

    dependencies {
        classpath "ru.cian:huawei-publish-gradle-plugin:<VERSION>-SNAPSHOT"
    }
}

apply plugin: 'com.android.application'
apply plugin: 'ru.cian.huawei-publish-gradle-plugin'

Configuring Plugin

Kotlin
huaweiPublish {
  instances {
      create("release") {
        /**
         * Path to json file with AppGallery credentials params (`client_id` and `client_secret`).
         * How to get credentials see [AppGallery Connect API Getting Started](https://developer.huawei.com/consumer/en/doc/development/AppGallery-connect-Guides/agcapi-getstarted).
         * Plugin credential json example:
         * {
         *    "client_id": "<CLIENT_ID>",
         *    "client_secret": "<CLIENT_SECRET>"
         * }
         *
         * Type: String (Optional)
         * Default value: `null` (but plugin wait that you provide credentials by CLI params)
         * CLI: `--credentialsPath`
         */          
          credentialsPath = "$rootDir/huawei-credentials-release.json"

        /**
         * Deploy type. Available values:
         *    '`publish`' to deploy and submit build on users;
         *    '`draft`' to deploy and save as draft without submit on users;
         *    '`upload-only`' to deploy without draft saving and submit on users;
         * Type String (Optional)
         * Default value: `publish`
         * CLI `--deployType`
         */
          deployType = ru.cian.huawei.publish.DeployType.PUBLISH

        /**
         * 'apk' or 'aab' for corresponding build format.
         * Type: String (Optional)
         * Default value: `apk`
         * CLI: `--buildFormat`
         */
          buildFormat = ru.cian.huawei.publish.BuildFormat.APK

        /**
         * API use chunks to upload the build file. So after last file part server needs some time to join and check whole file. 
         * This param provide time in millis during which the plugin periodically tries to publish the build.
         * Type: Long (Optional)
         * Default value: `600000` // (10min)
         * CLI: `--publishTimeoutMs`
         */
          publishTimeoutMs = 600_000

        /**
         * API use chunks to upload the build file. So after last file part server needs some time to join and check whole file.
         * This param provide time period in millis between tries to publish the build.
         * Type: Long (Optional)
         * Default value: `15000` // (15sec)
         * CLI: `--publishPeriodMs`
         */
          publishPeriodMs = 15_000

        /**
         * Release time after review in UTC format. The format is 'yyyy-MM-dd'T'HH:mm:ssZZ'.
         * Type: String (Optional)
         * Default value: `null` // (means immediately will be published after store review)
         * CLI: `--releaseTime
         */
          releaseTime = "2025-10-21T06:00:00+0300"

        /**
         * Release Phase settings. For mote info see documentation below.
         * Type: ReleasePhase (Optional)
         * Default value: `null` // (means the build will be published immediately on 100% users)
         * CLI: (see ReleasePhase param desc.)
         */
          releasePhase = ru.cian.huawei.publish.ReleasePhaseExtension(
              /**
               * Start release time after review in UTC format. The format is 'yyyy-MM-dd'T'HH:mm:ssZZ'.
               * Type: String (Required)
               * CLI: `--releasePhaseStartTime`
               */
                startTime = "2025-01-18T21:00:00+0300",
  
              /**
               * End release time after review in UTC format. The format is 'yyyy-MM-dd'T'HH:mm:ssZZ'.
               * Type: String (Required)
               * CLI: `--releasePhaseEndTime`
               */
                endTime = "2025-01-21T06:00:00+0300",
  
              /**
               * Percentage of target users of release by phase. The integer or decimal value from 0 to 100.
               * Type: String (Required)
               * CLI: `--releasePhasePercent`
               */
                percent = 5.0 // (equals to 5%)
          )

        /**
         * Description: Release Notes settings. For mote info see documentation below.
         * Type: ReleaseNotes (Optional)
         * Default value: `null`
         * CLI: (see ReleaseNotes param desc.)
         */
          releaseNotes = ru.cian.huawei.publish.ReleaseNotesExtension(

              /**
               * Release Notes by languages. For mote info see documentation below.
               * Type: List<ReleaseNote> (Required)
               * Default value: `null`
               * CLI: (See `--releaseNotes` desc.)
               */
                descriptions = listOf(
  
                      /**
                       * Release Note list item.
                       */
                      ru.cian.huawei.publish.ReleaseNote(
      
                          /**
                           * [Langtype value from Huawei Publish API](https://developer.huawei.com/consumer/en/doc/development/AppGallery-connect-References/agcapi-reference-langtype-0000001158245079)
                           * Type: String (Required)
                           * CLI: (See `--releaseNotes` desc.)
                           */
                          lang = "en-US",
        
                          /**
                           * Absolutely path to file with Release Notes for current `lang`. Release notes text must be less or equals to 500 sign.
                           * Type: String (Required)
                           * CLI: (See `--releaseNotes` desc.)
                           */
                          filePath = "$projectDir/release-notes-en.txt"
                      ),
                  
                      ru.cian.huawei.publish.ReleaseNote(
                                lang = "ru-RU",
                                filePath = "$projectDir/release-notes-ru.txt"
                      ),
                ),
  
              /**
               * :warning: !!!EXPERIMENTAL!!!
               * True - if needs to remove html tags from provided release notes. For example to support Google Play release notes.
               * Type: Boolean (Optional)
               * Default value: `false`
               * CLI: (See `--removeHtmlTags` desc.)
               */
                removeHtmlTags = false
          )

        /**
         * Description: Path to json file with params to update app basic info [Huawei Publish API](https://developer.huawei.com/consumer/en/doc/development/AppGallery-connect-References/agcapi-app-info-update-0000001111685198))
         * Type: String (Optional)
         * Default value: `null`
         * CLI: `--appBasicInfo`
         */
          appBasicInfo = "$projectDir/app-basic-info.json"
      }
      create("debug") {
          ...
      }
  }
}
Groovy
huaweiPublish {
  instances {
      release {
          credentialsPath = "$rootDir/huawei-credentials-release.json"
          deployType = "publish"
          buildFormat = "apk"
          publishTimeoutMs = 600_000
          publishPeriodMs = 15_000
          releaseTime = "2025-10-21T06:00:00+0300"
          releasePhase = new ru.cian.huawei.publish.ReleasePhaseExtension(
              "2021-10-18T21:00:00+0300",
              "2025-10-21T06:00:00+0300",
              5.0
          )
          releaseNotes = new ru.cian.huawei.publish.ReleaseNotesExtension(
              [
                new ru.cian.huawei.publish.ReleaseNote(
                        "en-EN",
                        "$projectDir/release-notes-en.txt"
                ),
                new ru.cian.huawei.publish.ReleaseNote(
                    "ru-RU",
                    "$projectDir/release-notes-ru.txt"
                ),
              ],
              false
          )
          appBasicInfo = "$projectDir/app-basic-info.json"
      }
      debug {
          ...
      }
  }
}

the same by CLI

./gradlew assembleRelease publishHuaweiAppGalleryRelease \
    --credentialsPath="/sample-kotlin/huawei-credentials.json" \
    --deployType=publish \
    --buildFormat=apk \
    --publishTimeoutMs=600000 \
    --publishPeriodMs=15000 \
    --releaseTime="2025-10-21T06:00:00+0300" \ 
    --releasePhaseStartTime=2020-11-13T08:01:02+0300 \
    --releasePhaseEndTime=2020-11-20T15:30:00+0300 \
    --releasePhasePercent=5.0 \
    --releaseNotes="en_EN:/home/<USERNAME>/str/project/release_notes_en.txt;ru_RU:/home/<USERNAME>/str/project/release_notes_ru.txt" \
    --appBasicInfo="/sample-kotlin/app-basic-info.json"

CLI params are more priority than Plugin configuration params.

Also the plugin support different buildType and flavors. So for demo and full flavors and release buildType just change instances like that:

huaweiPublish {
    instances {
        create("release") {
            ...
        }
        create("demoRelease")
            ...
        }
        create("fullRelease")
            ...
        }
    }
}

Plugin usage

Gradle generate publishHuaweiAppGallery<*> task for all BuildType and Flavor configurations.

โš ๏ธ Note! The plugin will publish already existed build file. Before uploading you should build it yourself. Be careful. Don't publish old build file.

./gradlew assembleRelease publishHuaweiAppGalleryRelease

or

./gradlew bundleRelease publishHuaweiAppGalleryRelease
Example uploading build file without publishing

You can upload the build file as draft without submit on users.

From gradle build script:

huaweiPublish {
    instances {
        release {
            credentialsPath = "$rootDir/sample1/huawei-credentials.json"
            deployType = "draft"
        }
    }
}

or execute from command line:

./gradlew assembleRelease publishHuaweiAppGalleryRelease \
    --credentialsPath="$rootDir/sample1/huawei-credentials.json" \
    --deployType=draft
Example publishing AppBundle

If you choose AppBundle see Application Signature before using the plugin.

From gradle build script:

huaweiPublish {
    instances {
        release {
            credentialsPath = "$rootDir/sample1/huawei-credentials.json"
            buildFormat = "aab"
        }
    }
}

or execute from command line:

./gradlew assembleRelease publishHuaweiAppGalleryRelease \
    --credentialsPath="$rootDir/sample1/huawei-credentials.json" \
    --buildFormat=aab

After uploading build file the Huawei Service will start processed. It may take 2-5 minutes, depending on the size of the software package. While publishing the AppBundle build file you can get the error:

What went wrong: Execution failed for task ':app:publishHuaweiAppGalleryRelease'. Ret(msg=[cds]submit failed, additional msg is [The file is being processed. It may take 2-5 minutes, depending on the size of the software package.])

When publishing an AppBundle the service takes some time to parse the file. In this case, the plugin uses a special mechanism for the full cycle. By default, the plugin tries to publish the assembly every 15 seconds for 10 minutes. To change values see using parameters: publishTimeoutMs and publishPeriodMs.

For more information see the Issue#7 and Issue#38.

Example publishing with release phase

You can upload the build file and submit it on the part of users.

From gradle build script:

huaweiPublish {
    instances {
        release {
            credentialsPath = "$rootDir/sample1/huawei-credentials.json"
            releasePhase {
                startTime = "2020-11-13T08:01:02+0300"
                endTime = "2020-11-20T15:30:00+0300"
                percent = 10.0
            }
        }
    }
}

or execute from command line:

./gradlew assembleRelease publishHuaweiAppGalleryRelease \
    --clientId=<CLIENT_ID> \
    --clientSecret=<CLIENT_SECRET> \
    --releasePhaseStartTime=2020-11-13T08:01:02+0300 \
    --releasePhaseEndTime=2020-11-20T15:30:00+0300 \
    --releasePhasePercent=10.0

While publishing with release phase you can get the error:

Execution failed for task ':app:publishHuaweiAppGalleryRelease'. Update App File Info is failed. Response: UpdateAppFileInfoResponse(ret=Ret(code=204144644, msg=[AppGalleryConnectPublishService]call cds to query app information failed))

I asked Huawei support. They confirmed the server issue. To work around this problem you should once set the release phase for uploader build from Developer Console. After that plugin should publish next builds without this error. (Sorry for RU screenshot interface locale. Huawei doesn't allow me to change it on EN)

screenshot

One more note. If already there is published version that waiting for review you'll get error:

What went wrong: Execution failed for task ':app:publishHuaweiAppGalleryRelease'. Update App File Info is failed. Response: UpdateAppFileInfoResponse(ret=Ret(code=204144647, msg=[cds]update service failed, additional msg is [The new service has can't be edited service,which can't be updated!]))

For more information see the Issue#10

Known Huawei Publishing API Issues

List of known problems and solutions with the plugin and Huawei AppGallery API that users of the plugin have encountered:

Task :app:publishHuaweiAppGalleryRelease FAILED

Execution failed for task ':app:publishHuaweiAppGalleryRelease'.
> Update App File Info is failed. Response: UpdateAppFileInfoResponse(ret=Ret(code=204144647, msg=[cds]update service failed, additional msg is [The new service has can't be edited service,which can't be updated!]))
  • Huawei Developer Console doesn't save list of countries from previous release. To fix that just use appBasicInfo param with json {"publishCountry": "BY,MD,RU,AM,AZ,GE,KZ,KG,MN,TJ,TM,UZ"}. For more info see parameter description and issue/41.

FAQ

Support the same [Triple-T](https://github.com/Triple-T/gradle-play-publisher) Release Notes catalogs structure.

It's a bad idea to use the same file structure from thirtparty project because my plugin will be strongly depended on however my project even doesn't use it directly. If the Triple-T will change catalogs or files structure it leads to a bug into my plugin.

Instead of I created a flexible settings for my Release Notes params. You can reuse the release notes files of Triple project. See removeHtmlTags param description to remove html tags from Google Play release notes. For example:

huaweiPublish {
    instances {
        release {
            releaseNotes = new ru.cian.huawei.publish.ReleaseNotesExtension(
                [
                    new ru.cian.huawei.publish.ReleaseNote(
                            "en-En",
                            "$projectDir/src/main/play/release-notes/en-En/default.txt"
                    ),
                    new ru.cian.huawei.publish.ReleaseNote(
                            "ru-RU",
                            "$projectDir/src/main/play/release-notes/ru-RU/default.txt"
                    ),
                    new ru.cian.huawei.publish.ReleaseNote(
                            "de-DE",
                            "$projectDir/src/main/play/release-notes/de-DE/default.txt"
                    ),
                    new ru.cian.huawei.publish.ReleaseNote(
                            "tr-TR",
                            "$projectDir/src/main/play/release-notes/tr-TR/default.txt"
                    ),
                    new ru.cian.huawei.publish.ReleaseNote(
                            "pt-BR",
                            "$projectDir/src/main/play/release-notes/pt-BR/default.txt"
                    ),
                ], 
                true
            )
        }
    }
}

In addition, Google and Huawei use different country codes. To quickly compare them, you can use a little trick that @rtsisyk came up with

huaweiPublish {
  instances {
    huaweiRelease {
      credentialsPath = "$rootDir/huawei-appgallery.json"
      buildFormat = 'aab'
      deployType = 'draft' // confirm manually
      releaseDescriptions = []
      def localeOverride = [
          'am' : 'am-ET',
          'gu': 'gu_IN',
          'iw-IL': 'he_IL',
          'kn-IN': 'kn_IN',
          'ml-IN': 'ml_IN',
          'mn-MN': 'mn_MN',
          'mr-IN': 'mr_IN',
          'ta-IN': 'ta_IN',
          'te-IN': 'te_IN',
      ]
      def files = fileTree(dir: "$projectDir/src/google/play/release-notes",
          include: '**/default.txt')
      files.each { File file ->
        def path = file.getPath()
        def locale = file.parentFile.getName()
        locale = localeOverride.get(locale, locale)
        releaseDescriptions.add(new ru.cian.huawei.publish.ReleaseNote(locale, path))
      }
      releaseNotes = new ru.cian.huawei.publish.ReleaseNotesExtension(releaseDescriptions)
    }
  }
}

License

Copyright 2020 Aleksandr Mirko

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

huawei-appgallery-publish-gradle-plugin's People

Contributors

cedrickflocon avatar cosic avatar destanyinside avatar ferprieto avatar ilyagulya avatar juliocbcotta avatar rmarma avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

huawei-appgallery-publish-gradle-plugin's Issues

Publishing bug: The package is being compiled, please try again

It seems that this issue has reappeared with the latest huawei publish plugin version (1.3.1):

> Task :app:publishHuaweiAppGalleryRelease
Huawei AppGallery Publishing API: Generate Config
Huawei AppGallery Publishing API: Found build file: `release.apk`
Huawei AppGallery Publishing API: Get Access Token
Huawei AppGallery Publishing API: Get App ID
Huawei AppGallery Publishing API: Get Upload Url
Huawei AppGallery Publishing API: Upload build file 'app/build/outputs/apk/release/release.apk'
Huawei AppGallery Publishing API: Update App File Info
Huawei AppGallery Publishing API: Submit Review
> Task :app:publishHuaweiAppGalleryRelease FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:publishHuaweiAppGalleryRelease'.
> SubmitResponse(ret=Ret(code=204144727, msg=[AppGalleryConnectPublishService]The package is being compiled, please try again in 3-5 minutes))

Versions
Huawei publish gradle plugin: 1.3.1
Gradle 7.2.0
AGP: 7.1.2

can't build branch snapshot-1.3.0

I just checkout the branch and tried to sync the project on my machine... This is what I got

org.gradle.internal.exceptions.LocationAwareException: Build file '/Users/julio.buenocotta/git/huawei-publish-gradle-plugin/sample-kotlin/build.gradle.kts' line: 3
Plugin [id: 'ru.cian.huawei-publish', version: '1.3.0-SNAPSHOT', artifact: 'ru.cian:huawei-publish-gradle-plugin:1.3.0-SNAPSHOT'] was not found in any of the following sources:

- Gradle Core Plugins (plugin is not in 'org.gradle' namespace)
- Plugin Repositories (could not resolve plugin artifact 'ru.cian:huawei-publish-gradle-plugin:1.3.0-SNAPSHOT')
  Searched in the following repositories:
    Google
    Gradle Central Plugin Repository
    MavenRepo
    MavenLocal(file:/Users/julio.buenocotta/.m2/repository/)
    maven(https://plugins.gradle.org/m2/)
	at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.resolveToFoundResult(DefaultPluginRequestApplicator.java:223)
	at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.lambda$resolvePluginRequests$4(DefaultPluginRequestApplicator.java:148)
	at org.gradle.util.internal.CollectionUtils.collect(CollectionUtils.java:207)
	at org.gradle.util.internal.CollectionUtils.collect(CollectionUtils.java:201)
	at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.resolvePluginRequests(DefaultPluginRequestApplicator.java:146)
	at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.applyPlugins(DefaultPluginRequestApplicator.java:86)
	at org.gradle.kotlin.dsl.provider.PluginRequestsHandler.handle(PluginRequestsHandler.kt:48)
	at org.gradle.kotlin.dsl.provider.StandardKotlinScriptEvaluator$InterpreterHost.applyPluginsTo(KotlinScriptEvaluator.kt:193)
	at org.gradle.kotlin.dsl.execution.Interpreter$ProgramHost.applyPluginsTo(Interpreter.kt:373)
	at Program.execute(Unknown Source)
	at org.gradle.kotlin.dsl.execution.Interpreter$ProgramHost.eval(Interpreter.kt:506)
	at org.gradle.kotlin.dsl.execution.Interpreter.eval(Interpreter.kt:200)
	at org.gradle.kotlin.dsl.provider.StandardKotlinScriptEvaluator.evaluate(KotlinScriptEvaluator.kt:114)
	at org.gradle.kotlin.dsl.provider.KotlinScriptPluginFactory$create$1.invoke(KotlinScriptPluginFactory.kt:51)
	at org.gradle.kotlin.dsl.provider.KotlinScriptPluginFactory$create$1.invoke(KotlinScriptPluginFactory.kt:36)
	at org.gradle.kotlin.dsl.provider.KotlinScriptPlugin.apply(KotlinScriptPlugin.kt:34)
	at org.gradle.configuration.BuildOperationScriptPlugin$1.run(BuildOperationScriptPlugin.java:65)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:74)
	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:74)
	at org.gradle.configuration.BuildOperationScriptPlugin.lambda$apply$0(BuildOperationScriptPlugin.java:62)
	at org.gradle.configuration.internal.DefaultUserCodeApplicationContext.apply(DefaultUserCodeApplicationContext.java:44)
	at org.gradle.configuration.BuildOperationScriptPlugin.apply(BuildOperationScriptPlugin.java:62)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$applyToMutableState$0(DefaultProjectStateRegistry.java:280)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.fromMutableState(DefaultProjectStateRegistry.java:307)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.applyToMutableState(DefaultProjectStateRegistry.java:279)
	at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:42)
	at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:26)
	at org.gradle.configuration.project.ConfigureActionsProjectEvaluator.evaluate(ConfigureActionsProjectEvaluator.java:35)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.lambda$run$0(LifecycleProjectEvaluator.java:100)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$applyToMutableState$0(DefaultProjectStateRegistry.java:280)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$withProjectLock$3(DefaultProjectStateRegistry.java:340)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:213)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.withProjectLock(DefaultProjectStateRegistry.java:340)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.fromMutableState(DefaultProjectStateRegistry.java:321)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.applyToMutableState(DefaultProjectStateRegistry.java:279)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.run(LifecycleProjectEvaluator.java:91)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:74)
	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:74)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:63)
	at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:741)
	at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:149)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.ensureConfigured(DefaultProjectStateRegistry.java:253)
	at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:41)
	at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:57)
	at org.gradle.configuration.DefaultProjectsPreparer.prepareProjects(DefaultProjectsPreparer.java:50)
	at org.gradle.configuration.BuildTreePreparingProjectsPreparer.prepareProjects(BuildTreePreparingProjectsPreparer.java:64)
	at org.gradle.configuration.BuildOperationFiringProjectsPreparer$ConfigureBuild.run(BuildOperationFiringProjectsPreparer.java:52)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:74)
	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:74)
	at org.gradle.configuration.BuildOperationFiringProjectsPreparer.prepareProjects(BuildOperationFiringProjectsPreparer.java:40)
	at org.gradle.initialization.VintageBuildModelController.prepareProjects(VintageBuildModelController.java:85)
	at org.gradle.initialization.VintageBuildModelController.doBuildStages(VintageBuildModelController.java:69)
	at org.gradle.initialization.VintageBuildModelController.scheduleRequestedTasks(VintageBuildModelController.java:61)
	at org.gradle.internal.build.DefaultBuildLifecycleController.lambda$scheduleRequestedTasks$1(DefaultBuildLifecycleController.java:112)
	at org.gradle.internal.build.DefaultBuildLifecycleController.withModel(DefaultBuildLifecycleController.java:134)
	at org.gradle.internal.build.DefaultBuildLifecycleController.scheduleRequestedTasks(DefaultBuildLifecycleController.java:110)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$fromBuildModel$2(DefaultBuildTreeLifecycleController.java:72)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$doBuild$4(DefaultBuildTreeLifecycleController.java:105)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:213)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.doBuild(DefaultBuildTreeLifecycleController.java:99)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.fromBuildModel(DefaultBuildTreeLifecycleController.java:70)
	at org.gradle.tooling.internal.provider.runner.AbstractClientProvidedBuildActionRunner.runClientAction(AbstractClientProvidedBuildActionRunner.java:58)
	at org.gradle.tooling.internal.provider.runner.ClientProvidedPhasedActionRunner.run(ClientProvidedPhasedActionRunner.java:52)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.internal.buildtree.ProblemReportingBuildActionRunner.run(ProblemReportingBuildActionRunner.java:50)
	at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:69)
	at org.gradle.tooling.internal.provider.FileSystemWatchingBuildActionRunner.run(FileSystemWatchingBuildActionRunner.java:90)
	at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:41)
	at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.lambda$execute$0(RootBuildLifecycleBuildActionExecutor.java:40)
	at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:128)
	at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.execute(RootBuildLifecycleBuildActionExecutor.java:40)
	at org.gradle.internal.buildtree.DefaultBuildTreeContext.execute(DefaultBuildTreeContext.java:40)
	at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.lambda$execute$0(BuildTreeLifecycleBuildActionExecutor.java:40)
	at org.gradle.internal.buildtree.BuildTreeState.run(BuildTreeState.java:53)
	at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.execute(BuildTreeLifecycleBuildActionExecutor.java:40)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$3.call(RunAsBuildOperationBuildActionExecutor.java:61)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$3.call(RunAsBuildOperationBuildActionExecutor.java:57)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:79)
	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:79)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor.execute(RunAsBuildOperationBuildActionExecutor.java:57)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecutor.execute(ContinuousBuildActionExecutor.java:103)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecutor.execute(SubscribableBuildActionExecutor.java:64)
	at org.gradle.internal.session.DefaultBuildSessionContext.execute(DefaultBuildSessionContext.java:46)
	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.lambda$execute$0(BuildSessionLifecycleBuildActionExecuter.java:55)
	at org.gradle.internal.session.BuildSessionState.run(BuildSessionState.java:69)
	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.execute(BuildSessionLifecycleBuildActionExecuter.java:54)
	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.execute(BuildSessionLifecycleBuildActionExecuter.java:36)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:36)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:25)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:63)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:58)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:42)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:47)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:31)
	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:65)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:39)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:29)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:35)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:78)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:75)
	at org.gradle.util.internal.Swapper.swap(Swapper.java:38)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:75)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:63)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:84)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52)
	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
	at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: org.gradle.api.plugins.UnknownPluginException: Plugin [id: 'ru.cian.huawei-publish', version: '1.3.0-SNAPSHOT', artifact: 'ru.cian:huawei-publish-gradle-plugin:1.3.0-SNAPSHOT'] was not found in any of the following sources:

- Gradle Core Plugins (plugin is not in 'org.gradle' namespace)
- Plugin Repositories (could not resolve plugin artifact 'ru.cian:huawei-publish-gradle-plugin:1.3.0-SNAPSHOT')
  Searched in the following repositories:
    Google
    Gradle Central Plugin Repository
    MavenRepo
    MavenLocal(file:/Users/julio.buenocotta/.m2/repository/)
    maven(https://plugins.gradle.org/m2/)
	at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.resolveToFoundResult(DefaultPluginRequestApplicator.java:222)
	... 156 more

Facing an issues when upload build with releases notes param

huaweiPublish {
instances {
stagingRelease {
credentialsPath = "$rootDir/huawei-credentials.json"
deployType = "draft"
buildFormat = "apk"
publishTimeoutMs = 15_000
publishPeriodMs = 3_000
releaseTime = "2022-12-25T09:00:00+0800"
releaseNotes = [
new ru.cian.huawei.publish.ReleaseNote(
"uk",
"$projectDir/release-notes-en.txt"
)
]
}
}
}

  • What went wrong:
    Execution failed for task ':app:publishHuaweiAppGalleryStagingRelease'.

Update Release Notes for 'uk' is failed. Response: UpdateReleaseNotesResponse(ret=Ret(code=204144649, msg=[cds]update app information failed, additional msg is [appName cant be empty.]))

Configuration-cache problems

ะ•ัะปะธ ะฒะบะปัŽั‡ะธั‚ัŒ configuration-cache ั‚ะพ ะฒั‹ะดะฐะตั‚ ั‚ะฐะบะธะต ะพัˆะธะฑะบะธ, ะฒะตั€ัะธั 1.4.2, Gradle version is: 8.2.1, Android Plugin version is: 8.1.2

Releases Notes object dint update New Features in App Information

When we execute upload the build together releases notes object, but in store dint see the releases notes is updated in App Information

Screenshot 2022-12-27 at 5 25 24 PM

Setup : 
huaweiPublish {
    instances {
        stagingRelease {
            credentialsPath = "$rootDir/huawei-credentials.json"
            deployType = "publish"
            buildFormat = "apk"
            releaseTime = "2023-12-30T09:00:00+0800"
            releaseNotes = [
                    new ru.cian.huawei.publish.ReleaseNote(
                            "en-GB",
                            "$projectDir/release-notes-en.txt"
                    )
            ]
        }
}

Command : ./gradlew assembleStagingRelease publishHuaweiAppGalleryStagingRelease

Java 8 incompatibility

is there any way to downgrade the java version or solve the compatibility problem? My project uses java 8 and there is no way to increase the version

Gradle version: 7.4.2
AGP version: 7.0.4
Kotlin version: 1.5.20

  • What went wrong:
    A problem occurred configuring root project 'build'.

Could not resolve all files for configuration ':classpath'.
Could not resolve ru.cian:huawei-publish-gradle-plugin:1.3.3.
Required by:
project :
> No matching variant of ru.cian:huawei-publish-gradle-plugin:1.3.3 was found. The consumer was configured to find a runtime of a library compatible with Java 8, packaged as a jar, and its dependencies declared externally, as well as attribute 'org.gradle.plugin.api-version' with value '7.4.2' but:
- Variant 'apiElements' capability ru.cian:huawei-publish-gradle-plugin:1.3.3 declares a library, packaged as a jar, and its dependencies declared externally:
- Incompatible because this component declares an API of a component compatible with Java 11 and the consumer needed a runtime of a component compatible with Java 8
- Other compatible attribute:
- Doesn't say anything about org.gradle.plugin.api-version (required '7.4.2')
- Variant 'runtimeElements' capability ru.cian:huawei-publish-gradle-plugin:1.3.3 declares a runtime of a library, packaged as a jar, and its dependencies declared externally:
- Incompatible because this component declares a component compatible with Java 11 and the consumer needed a component compatible with Java 8
- Other compatible attribute:
- Doesn't say anything about org.gradle.plugin.api-version (required '7.4.2')

API fails for any language when release notes are uploaded

Did you see this error before? It fails for any language and any size of text (less than 500 bytes or less than 500 characters):

gradle publishHuaweiAppGalleryHuaweiRelease

> Task :publishHuaweiAppGalleryHuaweiRelease
Huawei AppGallery Publishing API: Prepare input config
Huawei AppGallery Publishing API: Found build file: `OrganicMaps-23050808-huawei-release.aab`
Huawei AppGallery Publishing API: Get Access Token
Huawei AppGallery Publishing API: Get App ID
Huawei AppGallery Publishing API: Get Upload Url
Huawei AppGallery Publishing API: Upload build file 'build/outputs/bundle/huaweiRelease/OrganicMaps-23050808-huawei-release.aab'
Huawei AppGallery Publishing API: Upload release notes: 1/59, lang=tr-TR

> Task :publishHuaweiAppGalleryHuaweiRelease FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':publishHuaweiAppGalleryHuaweiRelease'.
> Update Release Notes for 'tr-TR' is failed. Response: UpdateReleaseNotesResponse(ret=Ret(code=204144649, msg=[cds]update app information failed, additional msg is [Parameter(appInfo.languages.newFeatures) error: String ,length between 0 and 500]))

Looking for buildFile wildcard example

Hello there,
Could you please give me an example of the use of the buildFile parameter?

I need to match any apk file contained under the path, but the following code unfortunately does not work

buildFile = "app/build/outputs/apk/release/*.apk"

AppBundle publication error: The file is being processed. It may take 2-5 minutes, depending on the size of the software package

Reproduce on library v1.1.0 with options

{
   ...
   publish = true
   buildFormat = "aab"
}

Output:

> Task :app:publishHuaweiAppGalleryRelease
Huawei AppGallery Publishing API: Found build file: `app-release.aab`
Huawei AppGallery Publishing API: Get Credentials
Huawei AppGallery Publishing API: Get Access Token
Huawei AppGallery Publishing API: Get App ID
Huawei AppGallery Publishing API: Get Upload Url
Huawei AppGallery Publishing API: Upload build file
Huawei AppGallery Publishing API: Update App File Info
Huawei AppGallery Publishing API: Submit Release
> Task :app:publishHuaweiAppGalleryRelease FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:publishHuaweiAppGalleryRelease'.
> Ret(msg=[cds]submit failed, additional msg is [The file is being processed. It may take 2-5 minutes, depending on the size of the software package.])

Failure on code 204144727 "The package is being compiled, please try again in 3-5 minutes"

Hi, Huawei AppGallery recently had some changes, not sure when, but they caused the plugin to fail at the final step:

Huawei AppGallery Publishing API: Submit Review

> Task :publishHuaweiAppGallery...Release FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':publishHuaweiAppGallery...Release'.
> SubmitResponse(ret=Ret(code=204144727, msg=[AppGalleryConnectPublishService]The package is being compiled, please try again in 3-5 minutes))

The solution for now is after these "3-5 minutes" to go to their dashboard and publish the update manually, but very annoying. Please fix, probably you can just add a delay after this error comes and reattempt every minute.

huawei-publish-gradle-plugin:1.2.5 - problem with distribution tag: upload-only nothing uploads on AGC

Looks like the whole process passes without an issue however I cannot find ADB file on AGC manage packages page.

Build output:
Final command: ./gradlew bundleRelease publishHuaweiAppGalleryRelease

Output:

> Task :publishHuaweiAppGalleryRelease
Huawei AppGallery Publishing API: Generate Config
Huawei AppGallery Publishing API: Found build file: `app-name.aab`
Huawei AppGallery Publishing API: Get Access Token
Huawei AppGallery Publishing API: Get App ID
Huawei AppGallery Publishing API: Get Upload Url
Huawei AppGallery Publishing API: Upload build file '{localFileLocation}/build/outputs/bundle/release/app-name.aab'
Huawei AppGallery Publishing API: Upload build file without draft and submit on users - Successfully Done!

Is this a plugin issue or maybe problems with AGC API?
I am using plugin version 1,2.5 due to compatibility with gradle v6.8.3 is being used in the project.

Thanks for help :)

The number of apk package is too many

Hi, I faced with error from AppGallery a few day ago, do you have idea what about it and how to fix this?

Update App File Info is failed. Response: UpdateAppFileInfoResponse(ret=Ret(code=204144662, msg=[cds]add apk failed, additional msg is [90200503 The number of apk package is too many]))

App publication requires additional manual step to be available for users

Hello!
I integrated this plugin quite effortlessly, many thanks!
After testing I realised though that the publications are not automatically submitted for review. I would like it to submit the build in a way, that it's available to the users with no further human action. The reality is that it requires me to manually click 'submit' in the console. I additionally receive an email from huawei that Promotion has been enabled for your app #appname# (#appid#). Is this expected? I publish with default config (ie default deployType, regular apk). Is this how this should behave?

1.4.1 was compiled with JDK 19 and breaks compability

After updating to 1.4.1 we see the following error:

> Could not determine the dependencies of null.
   > Could not resolve all task dependencies for configuration ':classpath'.
      > Could not resolve ru.cian:plugin:1.4.1.
        Required by:
            project : > ru.cian.huawei-publish-gradle-plugin:ru.cian.huawei-publish-gradle-plugin.gradle.plugin:1.4.1
         > No matching variant of ru.cian:plugin:1.4.1 was found. The consumer was configured to find a library for use during runtime, compatible with Java 17, packaged as a jar, and its dependencies declared externally, as well as attribute 'org.gradle.plugin.api-version' with value '8.5' but:
             - Variant 'apiElements' capability ru.cian:plugin:1.4.1 declares a library, packaged as a jar, and its dependencies declared externally:
                 - Incompatible because this component declares a component for use during compile-time, compatible with Java 19 and the consumer needed a component for use during runtime, compatible with Java 17
                 - Other compatible attribute:
                     - Doesn't say anything about org.gradle.plugin.api-version (required '8.5')
             - Variant 'runtimeElements' capability ru.cian:plugin:1.4.1 declares a library for use during runtime, packaged as a jar, and its dependencies declared externally:
                 - Incompatible because this component declares a component, compatible with Java 19 and the consumer needed a component, compatible with Java 17
                 - Other compatible attribute:
                     - Doesn't say anything about org.gradle.plugin.api-version (required '8.5')

I opened the "HuaweiPublishPlugin.class" with a hex editor and can clearly see, that the Java Class File Format is set to 00 3F = 63 = Java 19.

You should probably define the jvmTarget in you build.gradle to make sure the plugin is compiled with the desired Java version (otherwise it will pick the jvm version of the compiler that is being used.)

Allow to set clientId and ClientKey via gradle properties

Right now, the client id and key must be in a json file which makes it harder to "hide" the values locally (of course, we could put the file in .gitIgnore or outside the project, but a nicer approach would be to allow it to be populated directly in the huaweiPublish tag

example :

huaweiPublish {
    instances {
        release {
           // credentialsPath = "$rootDir/app/huawei-credentials.json"
            clientId = project.property("huawei_client_id")            
            clientSecret = project.property("huawei_client_secret")            // secret as from PR #8
            buildFormat = "apk"
            publish = false
        }
    }
}

This allows the user to just add these variables into the global gradle.properties and share that file among developers (one file for all projects)

Country code param

Hello,

Is there any way to set up list of countries that my app would be available, or use countries from previous release?
Now when I publish the app by plugin I need to choose countries every time. When I publish the app manually I don't have to do such things, countries list got from previous release.

Thanks

The package is being compiled, please try again in 3-5 minutes

> Task :publishHuaweiAppGalleryHuaweiRelease
Huawei AppGallery Publishing API: Generate Config
Huawei AppGallery Publishing API: Found build file: `OrganicMaps-21090106-huawei-release.aab`
Huawei AppGallery Publishing API: Get Access Token
Huawei AppGallery Publishing API: Get App ID
Huawei AppGallery Publishing API: Get Upload Url
Huawei AppGallery Publishing API: Upload build file '/home/runner/work/organicmaps/organicmaps/android/build/outputs/bundle/huaweiRelease/OrganicMaps-21090106-huawei-release.aab'
Huawei AppGallery Publishing API: Update App File Info
Huawei AppGallery Publishing API: Submit Review


FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':publishHuaweiAppGalleryHuaweiRelease'.
> SubmitResponse(ret=Ret(code=204144727, msg=[AppGalleryConnectPublishService]The package is being compiled, please try again in 3-5 minutes))

Plugin: 1.3.0 (latest)
Gradle: 7.0.2
ADP: 7.0.1

[Bug] Error on upload: 'The language does not exist !'

Hi there,
thanks for the plugin. I got two apps. One supports multiple languages including Russian and I had no problems uploading that app with this plugin. The other app only supports German and is only whitelisted for German users in the App Gallery.

When I try to upload this app I get the error:

Huawei AppGallery Publishing API: Found apk file: `my-app-release.apk`
Huawei AppGallery Publishing API: Get Credentials
Huawei AppGallery Publishing API: Get Access Token
Huawei AppGallery Publishing API: Get App ID
Huawei AppGallery Publishing API: Get Upload Url
Huawei AppGallery Publishing API: Upload APK '/path/to/my/app.apk'
Huawei AppGallery Publishing API: Update App File Info

> Task :app:publishHuaweiAppGalleryMyAppRelease FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:publishHuaweiAppGalleryMyAppRelease'.
> Update App File Info is failed. Response: UpdateAppFileInfoResponse(ret=Ret(code=204144650, msg=[AppGalleryConnectPublishService]The language does not exist !))

I am not certain what the problem is but I suspect the hardcoded lang="ru-RU" query paramter in HuaweiServiceImpl.

Could this be the problem? Would it help not the send the language since it's optional for apk files? Alternativly it could be possible to set the language via gradle.

NoSuchMethodError: 'okhttp3.Call okhttp3.Interceptor$Chain.call()'

Hi,

I'm getting the following error during the publishHuaweiAppGalleryRelease task.
My config:

huaweiPublish {
    instances {
        releaseHuawei {
            credentialsPath = "$rootDir/huawei-credentials.json"
            deployType = "draft"
            buildFormat = "apk"
            publishTimeoutMs = 300_000
            publishPeriodMs = 30_000
            releaseNotes = [
                    new ReleaseNote(
                            "de-DE",
                            "$projectDir/release-notes.txt"
                    )
            ]
        }
    }
> Task :app:publishHuaweiAppGalleryReleaseHuawei FAILED
Huawei AppGallery Publishing API: Prepare input config
Huawei AppGallery Publishing API: Build File Directory: Path to apk
Huawei AppGallery Publishing API: Found build file: `release.apk`
Huawei AppGallery Publishing API: Get Access Token


FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:publishHuaweiAppGalleryReleaseHuawei'.
> 'okhttp3.Call okhttp3.Interceptor$Chain.call()'

* Try:
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:publishHuaweiAppGalleryReleaseHuawei'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:149)
        at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:282)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:147)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:135)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:337)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:324)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:317)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:463)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:380)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47)
Caused by: java.lang.NoSuchMethodError: 'okhttp3.Call okhttp3.Interceptor$Chain.call()'
        at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:46)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
        at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:83)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
        at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:76)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
        at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:201)
        at okhttp3.internal.connection.RealCall.execute(RealCall.kt:154)
        at ru.cian.huawei.publish.service.HuaweiServiceImpl.getToken(HuaweiServiceImpl.kt:343)
        at ru.cian.huawei.publish.HuaweiPublishTask.action(HuaweiPublishTask.kt:202)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
        at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:248)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
        at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:233)
        at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:216)
        at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:199)
        at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:166)
        at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:105)
        at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44)
        at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:59)
        at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:56)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:56)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44)
        at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:67)
        at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:37)
        at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41)
        at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74)
        at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:50)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:28)
        at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.executeDelegateBroadcastingChanges(CaptureStateAfterExecutionStep.java:100)
        at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:72)
        at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:50)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:40)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:29)
        at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:179)
        at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:70)
        at org.gradle.internal.Either$Right.fold(Either.java:175)
        at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:59)
        at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:68)
        at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:46)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:36)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:25)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:36)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:22)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:91)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:55)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:37)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:65)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:36)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:77)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:38)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:94)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:49)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:71)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:45)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.executeWithNonEmptySources(SkipEmptyWorkStep.java:177)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:81)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:53)
        at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:32)
        at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:21)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
        at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36)
        at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23)
        at org.gradle.internal.execution.steps.CleanupStaleOutputsStep.execute(CleanupStaleOutputsStep.java:75)
        at org.gradle.internal.execution.steps.CleanupStaleOutputsStep.execute(CleanupStaleOutputsStep.java:41)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:32)
        at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:293)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:30)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:21)
        at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:37)
        at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:27)
        at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:47)
        at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:34)
        at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:64)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:146)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:135)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:337)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:324)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:317)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:463)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:380)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47)

Any ideas?

Broken Task Configuration Avoidance

Problem

To establish a soft relationship between tasks, the plugin uses the whenTaskAdded method. This breaks the Task Configuration Avoidance.
Scan for task ./gradlew :app:help:
plugin-task-configuration-avoidance-problem

Quick fix

Replace whenTaskAdded with configureEach. But we are still losing "laziness" for the publishHuaweiAppGallery task in this line:

publishTask.get().mustRunAfter(this)

Solution

We can be sure that the project contains assemble and bundle tasks, because the plugin is only used together with com.android.application:

project.plugins.withType<AppPlugin> {
    configureHuaweiPublish(project)
}

Therefore, we can establish the relationship between the tasks as follows:

project.tasks.register<HuaweiPublishTask>(publishTaskName, variant).configure {
    setMustRunAfter(
        setOf(
            project.tasks.named("assemble$variantName"),
            project.tasks.named("bundle$variantName"),
        )
    )
}

Need testing!

AGP compatibility

Huawei-pubilsh-gradle-plugin version 1.2.1 is not compatible with com.android.tools.build:gradle:4.1.1

Log :

* What went wrong:
Execution failed for task ':app:publishHuaweiAppGalleryProdHmsRelease'.
> com.android.build.gradle.internal.scope.InternalArtifactType$BUNDLE cannot be cast to com.android.build.api.artifact.ArtifactType

Gradle Play publisher already has the issue and fixed it : Triple-T/gradle-play-publisher#824
I guess this is the related commit :
Triple-T/gradle-play-publisher@4d52010
Triple-T/gradle-play-publisher@354812b

HTML tags stripping

It looks like that Huawei's AppGallery doesn't support HTML tags in the release notes and description, like Google Play does.

image

Please consider adding automated stripping of HTML tags to allow sharing of the same description with Google Play.

Bug: Can't publish apk

I just tried the release 1.3.0 and the sample project here...

 ./gradlew assembleDemoRelease
 ./gradlew publishHuaweiAppGalleryDemoRelease

Build file /Users/julio.buenocotta/git/huawei-publish-gradle-plugin/sample-groovy/build/outputs/apk/demo/release has wrong file extension that doesn't match with announced buildFormat(APK) plugin extension param.

java.lang.NoSuchMethodException using Android Gradle Plugin 4.2.1

Using:

huawei-publish-gradle-plugin version 1.2.4
android gradle plugin 4.2.1
gradle 6.7.1

Executing: ./gradlew bundleRelease && ./gradlew publishHuaweiAppGalleryRelease

This is what happens:

> Task :app:publishHuaweiAppGalleryRelease FAILED
Huawei AppGallery Publishing API: Generate Config

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:publishHuaweiAppGalleryRelease'.
> java.lang.NoSuchMethodException: com.android.build.gradle.internal.scope.InternalArtifactType.valueOf(java.lang.String)

Any idea about what is causing this issue or what additional logs and data are needed to spot where this error is?

Missing dependency on bundle* task

/gradlew bundleHuaweiRelease publishHuaweiAppGalleryHuaweiRelease

[REDACTED]

[953/953] Linking CXX shared library ../../../../build/intermediates/cmake/huaweiRelease/obj/arm64-v8a/libmapswithme.so

> Task :mergeHuaweiReleaseJniLibFolders
> Task :collectHuaweiReleaseDependencies
> Task :configureHuaweiReleaseDependencies
> Task :parseHuaweiReleaseIntegrityConfig
> Task :validateSigningHuaweiRelease

> Task :publishHuaweiAppGalleryHuaweiRelease FAILED
Huawei AppGallery Publishing API: Generate Config

> Task :mergeHuaweiReleaseNativeLibs


FAILURE: Build failed with an exception.
Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.

Use '--warning-mode all' to show the individual deprecation warnings.
* What went wrong:
See https://docs.gradle.org/7.0/userguide/command_line_interface.html#sec:command_line_warnings
Execution failed for task ':publishHuaweiAppGalleryHuaweiRelease'.
36 actionable tasks: 36 executed
> java.io.FileNotFoundException: /home/runner/work/organicmaps/organicmaps/android/build/outputs/bundle/huaweiRelease/OrganicMaps-21080515-huawei-release.aab (No such file or directory). Please run `assemble*` or `bundle*` task to build the application file before current task.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 51m 0s
Error: Process completed with exit code 1.
0s

UPLOAD_ONLY mode don't work if it's a new apk for the same draft

For some reason when I upload apk with UPLOAD_ONLY mode twice for the same draft it's not saving apk in AppGallery for a second (and further) upload.
For example, I may create app-1.0.apk and upload it. Then I'll see it on AppGallery Console web interface. Then I create app-1.1.apk and upload it too but it'll be not presented in AppGallery Console despite of log


Huawei AppGallery Publishing API: Upload build file '/path/to/app-1.0.apk'
Huawei AppGallery Publishing API: Upload build file without draft and submit on users - Successfully Done!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.