第54章 署名プラグイン

The signing plugin adds the ability to digitally sign built files and artifacts. These digital signatures can then be used to prove who built the artifact the signature is attached to as well as other information such as when the signature was generated.

署名プラグインは、ビルドされたファイルやアーティファクトに電子署名を行う機能を追加します。 この電子署名は、いつその署名がされたのかなどの情報だけでなく、署名されたアーティファクトを誰がビルドしたのかを証明するのに使われます。

The signing plugin currently only provides support for generating PGP signatures (which is the signature format required for publication to the Maven Central Repository).

現在署名プラグインがサポートしているのは、PGP署名(Mavenセントラルリポジトリに公開するのに必要な署名形式)の生成のみです。

54.1. 使用方法 Usage

To use the Signing plugin, include the following in your build script:

署名プラグインを使うには、以下の行をビルドスクリプトに追加します。

例54.1 署名プラグインの使用

build.gradle

apply plugin: 'signing'

54.2. 署名者の資格情報 Signatory credentials

In order to create PGP signatures, you will need a key pair (instructions on creating a key pair using the GnuPG tools can be found in the GnuPG HOWTOs). You need to provide the signing plugin with your key information, which means three things:

PGP署名を作成するには、キーペアが必要です(GnuPGツールを使用してキーペアを作成する手順については、GnuPGのHOWTO文書で見つけることができます)。 署名プラグインでは、このキー情報、つまり以下の三つの情報を設定することができます。

  • The public key ID (an 8 character hexadecimal string).

    公開鍵ID(8文字の16進数文字列)

  • The absolute path to the secret key ring file containing your private key.

    秘密鍵を保存したキーリングファイルの絶対パス

  • The passphrase used to protect your private key.

    秘密鍵を保護するパスフレーズ

These items must be supplied as the values of properties signing.keyId, signing.secretKeyRingFile, and signing.password respectively. Given the personal and private nature of these values, a good practice is to store them in the user gradle.properties file (described in 「GradleプロパティとシステムプロパティGradle properties and system properties).

これらの情報は、それぞれsigning.keyIdsigning.secretKeyRingFilesigning.passwordというプロジェクトプロパティで設定する必要があります。 良いプラクティスは、ユーザーのgradle.propertiesファイル(「GradleプロパティとシステムプロパティGradle properties and system propertiesで解説されています)にこれらを保存することです。

signing.keyId=24875D73
signing.password=secret
signing.secretKeyRingFile=/Users/me/.gnupg/secring.gpg

If specifying this information in the user gradle.properties file is not feasible for your environment, you can source the information however you need to and set the project properties manually.

これらの情報をgradle.propertiesファイルで設定するのが環境の問題で難しい場合は、手動でプロジェクトのプロパティに設定させることも可能です。

import org.gradle.plugins.signing.Sign

gradle.taskGraph.whenReady { taskGraph ->
    if (taskGraph.allTasks.any { it instanceof Sign }) {
        // Use Java 6's console to read from the console (no good for
        // a CI environment)
        Console console = System.console()
        console.printf "\n\nWe have to sign some things in this build." +
                       "\n\nPlease enter your signing details.\n\n"

        def id = console.readLine("PGP Key Id: ")
        def file = console.readLine("PGP Secret Key Ring File (absolute path): ")
        def password = console.readPassword("PGP Private Key Password: ")

        allprojects { ext."signing.keyId" = id }
        allprojects { ext."signing.secretKeyRingFile" = file }
        allprojects { ext."signing.password" = password }

        console.printf "\nThanks.\n\n"
    }
}

54.3. 署名対象を指定する Specifying what to sign

As well as configuring how things are to be signed (i.e. the signatory configuration), you must also specify what is to be signed. The Signing plugin provides a DSL that allows you to specify the tasks and/or configurations that should be signed.

どのように署名するか(つまり署名者情報の指定)だけでなく、何を署名するかというのも設定しなければなりません。 署名プラグインは、署名すべきタスクやコンフィギュレーションを指定するためのDSLを提供しています。

54.3.1. コンフィグレーションに署名する Signing Configurations

It is common to want to sign the artifacts of a configuration. For example, the Java plugin configures a jar to build and this jar artifact is added to the archives configuration. Using the Signing DSL, you can specify that all of the artifacts of this configuration should be signed.

あるコンフィグレーション内のアーティファクトに対して署名をしたいというのは良くあることです。例えば、Javaプラグインは、jarをビルドするよう定義し、そのjarをアーティファクトとしてarchivesコンフィグレーションに追加します。 署名DSLを使えば、このコンフィグレーションに含まれる全てのアーティファクトに署名するよう設定できるのです。

例54.2 コンフィグレーションに署名する

build.gradle

signing {
    sign configurations.archives
}

This will create a task (of type Sign) in your project named “signArchives”, that will build any archives artifacts (if needed) and then generate signatures for them. The signature files will be placed alongside the artifacts being signed.

これにより、「signArchives」という名前のタスク(Sign型)が追加されます。 このタスクは、archivesのアーティファクトを全て(必要なら)ビルドし、それからそれらのアーティファクト用に署名を作成します。署名ファイルは、署名されるアーティファクトと一緒に置かれます。

例54.3 コンフィグレーションの出力に署名する

gradle signArchives の出力

> gradle signArchives
:compileJava
:processResources
:classes
:jar
:signArchives

BUILD SUCCESSFUL

Total time: 1 secs

54.3.2. タスクに署名する Signing Tasks

In some cases the artifact that you need to sign may not be part of a configuration. In this case you can directly sign the task that produces the artifact to sign.

署名したいものが、コンフィギュレーションに含まれていないというケースもあります。このケースでは、署名するアーティファクトを作成するタスクに対して、直接署名することができます。

例54.4 タスクを署名する

build.gradle

task stuffZip (type: Zip) {
    baseName = "stuff"
    from "src/stuff"
}

signing {
    sign stuffZip
}

This will create a task (of type Sign) in your project named “signStuffZip”, that will build the input task's archive (if needed) and then sign it. The signature file will be placed alongside the artifact being signed.

これにより、「signStuffZip」という名前のタスク(Sign型)がプロジェクトに追加されます。 このタスクは、入力物を(必要なら)ビルドしてアーカイブを作成し、それからそのアーカイブに署名します。署名ファイルは、署名されるアーティファクトと一緒に置かれます。

例54.5 タスクの出力に署名する

gradle signStuffZip の出力

> gradle signStuffZip
:stuffZip
:signStuffZip

BUILD SUCCESSFUL

Total time: 1 secs

For a task to be “signable”, it must produce an archive of some type. Tasks that do this are the Tar, Zip, Jar, War and Ear tasks.

「署名可能」なタスクは、何らかのアーカイブを作成するものに限られます。この種類のタスクには、TarZipJarWarEarがあります。

54.3.3. 条件付き署名 Conditional Signing

A common usage pattern is to only sign build artifacts under certain conditions. For example, you may not wish to sign artifacts for non release versions. To achieve this, you can specify that signing is only required under certain conditions.

よくあるビルドのパターンに、ある特定の条件下に限ってアーティファクトに署名する、というものがあります。例えば、リリースバージョン以外のアーティファクトには署名を付けたくないかもしれません。 これは、署名DSLを必要なロジックで囲めば実現できます。

例54.6 条件付き署名

build.gradle

version = '1.0-SNAPSHOT'
ext.isReleaseVersion = !version.endsWith("SNAPSHOT")

signing {
    required { isReleaseVersion && gradle.taskGraph.hasTask("uploadArchives") }
    sign configurations.archives
}

In this example, we only want to require signing if we are building a release version and we are going to publish it. Because we are inspecting the task graph to determine if we are going to be publishing, we must set the signing.required property to a closure to defer the evaluation. See SigningExtension.setRequired() for more information.

54.4. 署名を公開する Publishing the signatures

When specifying what is to be signed via the Signing DSL, the resultant signature artifacts are automatically added to the signatures and archives dependency configurations. This means that if you want to upload your signatures to your distribution repository along with the artifacts you simply execute the uploadArchives task as normal.

署名DSLで署名対象を指定すると、生成された署名は自動的にsignaturesコンフィギュレーションとarchivesコンフィギュレーションに追加されます。 つまり、署名をアーティファクトと一緒に配布用リポジトリに公開したい場合は、通常通りただuploadArchivesタスクを実行すればいいということです。

54.5. POMファイルに署名する Signing POM files

When deploying signatures for your artifacts to a Maven repository, you will also want to sign the published POM file. The signing plugin adds a signing.signPom() (see: SigningExtension.signPom()) method that can be used in the beforeDeployment() block in your upload task configuration.

例54.7 Signing a POM for deployment

build.gradle

uploadArchives {
    repositories {
        mavenDeployer {
            beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
        }
    }
}

When signing is not required and the POM cannot be signed due to insufficient configuration (i.e. no credentials for signing) then the signPom() method will silently do nothing.