Tencent/matrix · error · RuntimeException

No signing configurations.

Error message

No signing configurations.

What it means

bintray-to-maven-central.gradle signs artifacts for Maven Central and requires GPG signing properties (signing.keyId plus secret key/passphrase) to be present. If the project has no 'signing.keyId' property at configuration time, it throws a RuntimeException because unsigned artifacts cannot be published to Maven Central.

Solutions

  1. Pass signing properties: ./gradlew publish -Psigning.keyId=YOURKEYID -Psigning.password=... -Psigning.secretKeyRingFile=/path/to/secring.gpg
  2. Add signing.keyId etc. to ~/.gradle/gradle.properties or the project's gradle.properties (do not commit secrets; use CI secrets)
  3. Generate a GPG key first (gpg --gen-key) and export the secret key ring if you don't have one
  4. If you only intend Bintray/local publishing, don't apply bintray-to-maven-central.gradle

Example fix

// before
./gradlew publishToMavenCentral

// after
./gradlew publishToMavenCentral -Psigning.keyId=ABCDEF01 -Psigning.password="$SIGNING_PASS" -Psigning.secretKeyRingFile=$HOME/.gnupg/secring.gpg
Defensive patterns

Strategy: validation

Validate before calling

// pre-publish check script
if (!project.hasProperty('signing.keyId')) {
    throw new GradleException('Provide -Psigning.keyId (and signing.password, signing.secretKeyRingFile) for Maven Central publishing')
}

Prevention

When it happens

Trigger: Running a publish task from bintray-to-maven-central.gradle without -Psigning.keyId (and typically signing.password / signing.secretKeyRingFile) on the command line, gradle.properties, or local.properties.

Common situations: New contributor running ./gradlew publish locally without GPG setup, CI secrets not injected, or properties defined in ~/.gradle/gradle.properties of a different user.

Related errors


AI-assisted analysis of Tencent/matrix@3b8293bd65 (2026-09-08). Data as JSON: /api/errors/15a0f0b46ec90dae. Report an issue: GitHub.

Appendix: source

Thrown at matrix/matrix-android/gradle/bintray-to-maven-central.gradle:127

    Properties properties = new Properties()
    try {
        properties.load(project.rootProject.file('local.properties').newDataInputStream())
    } catch (Exception e) {
        println("load local properties failed msg:${e.message}")
    }
    return properties.getProperty(key)
}

def getRepositoryUsername() {
    return hasProperty('REPOSITORY_USERNAME') ? REPOSITORY_USERNAME : readPropertyFromLocalProperties('REPOSITORY_USERNAME')
}

def getRepositoryPassword() {
    return hasProperty('REPOSITORY_PASSWORD') ? REPOSITORY_PASSWORD : readPropertyFromLocalProperties('REPOSITORY_PASSWORD')
}

if (!project.hasProperty("signing.keyId")) {
    throw new RuntimeException("No signing configurations.")
}

ext.transmition_tasks = [:]

// Declare publications
publishing.publications {

    (bintray_saving_dir as File).listFiles().each { component_file ->
        transmition_tasks[component_file.name] = [] as Set

        if (target_components != null && component_file.name != target_components) {
            return
        }

        component_file.listFiles().each { version_file ->
            if (!version_file.isDirectory()) {
                return
            }

View on GitHub (pinned to 3b8293bd65)