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/*" ] } ] }