GeekFactory

int128.hatenablog.com

GradleからS3に成果物を公開する

GradleからS3に成果物を公開する方法を調べたのでメモです。あらかじめIAMユーザを作成し、キーを取得しておく必要があります。

S3 Maven Repositoryに公開する

Gradleのmaven-publishプラグインを使うと、S3のMavenリポジトリに成果物を公開できます。詳しくは Maven Publishing (new) - Gradle User Guide Version 3.1 を参照してください。

ビルドスクリプトの例を示します。

// build.gradle
plugins {
    id 'java'
    id 'maven-publish'
}

// Travis CIでtag pushを契機にpublishを行う場合
version = System.getenv('TRAVIS_TAG') ?: 'SNAPSHOT'

publishing {
    repositories {
        maven {
            url 's3://your-bucket-name/folder'
            credentials(AwsCredentials) {
                accessKey System.getenv('AWS_ACCESS_KEY_ID')
                secretKey System.getenv('AWS_SECRET_ACCESS_KEY')
            }
        }
    }
    publications {
        mavenJava(MavenPublication) {
            groupId 'com.example'
            artifactId 'foo'
            version project.version
            from components.java
        }
    }
}

S3でファイルを公開する

S3にファイルをアップロードしたい場合はgradle-aws-pluginを使うとよいでしょう。生成したドキュメントをS3のStatic Web Hostingで公開するといった使い方が挙げられます。詳しくは GitHub - classmethod/gradle-aws-plugin: Gradle plugin to manage Amazon Web Services を参照してください。

ビルドスクリプトの例を示します。

plugins {
    id 'jp.classmethod.aws.s3' version '0.30'
}

// Travis CIでbranch pushを契機にpublishを行う場合
version = System.getenv('TRAVIS_BRANCH') ?: 'master'

task publishDocs(type: jp.classmethod.aws.gradle.s3.SyncTask) {
    source "$buildDir/docs"
    bucketName 'your-bucket-name'
    prefix "${project.version}/"
}

Static Web Hostingを使う場合は、バケット内のファイルを公開するBucket Policyを設定しておくとよいでしょう。SyncTaskではアクセス権まで設定できないようです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::your-bucket-name/*"
            ]
        }
    ]
}