/* * Copyright 2015-2016 the original author or authors. * * 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. */ package jp.classmethod.aws.gradle.elasticbeanstalk; import java.util.Arrays; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.Task; import org.gradle.api.plugins.WarPlugin; import org.gradle.api.tasks.bundling.War; import com.google.common.base.Strings; import jp.classmethod.aws.gradle.AwsPlugin; import jp.classmethod.aws.gradle.s3.AmazonS3Plugin; import jp.classmethod.aws.gradle.s3.AmazonS3ProgressiveFileUploadTask; /** * A plugin which configures a AWS Elastic Beanstalk project. */ public class AwsBeanstalkPlugin implements Plugin<Project> { public void apply(Project project) { project.getPluginManager().apply(AwsPlugin.class); project.getPluginManager().apply(AmazonS3Plugin.class); project.getExtensions().create(AwsBeanstalkPluginExtension.NAME, AwsBeanstalkPluginExtension.class, project); applyTasks(project); } private void applyTasks(final Project project) { // NOPMD AwsBeanstalkPluginExtension ebExt = project.getExtensions().findByType(AwsBeanstalkPluginExtension.class); AWSElasticBeanstalkCreateApplicationTask awsEbMigrateApplication = project.getTasks() .create("awsEbMigrateApplication", AWSElasticBeanstalkCreateApplicationTask.class, task -> { task.doFirst(t -> { task.setAppName(ebExt.getAppName()); task.setAppDesc(ebExt.getAppDesc()); }); }); AmazonS3ProgressiveFileUploadTask awsUploadWar = project.getTasks() .create("awsEbUploadBundle", AmazonS3ProgressiveFileUploadTask.class, task -> { WarPlugin war = project.getPlugins().findPlugin(WarPlugin.class); War warTask = war == null ? null : (War) project.getTasks().getByName(WarPlugin.WAR_TASK_NAME); if (war != null) { task.dependsOn(warTask); } task.onlyIf(t -> ebExt.getVersion().getFile() != null || war != null); task.doFirst(t -> { task.setBucketName(ebExt.getVersion().getBucket()); task.setKey(ebExt.getVersion().getKey()); if (warTask != null && ebExt.getVersion().getFile() == null) { task.setFile(warTask.getArchivePath()); } else { task.setFile(ebExt.getVersion().getFile()); } }); }); AWSElasticBeanstalkCreateApplicationVersionTask awsEbCreateApplicationVersion = project.getTasks() .create("awsEbCreateApplicationVersion", AWSElasticBeanstalkCreateApplicationVersionTask.class, task -> { task.dependsOn(awsEbMigrateApplication, awsUploadWar); task.doFirst(t -> { task.setAppName(ebExt.getAppName()); task.setVersionLabel(ebExt.getVersion().getLabel()); task.setBucketName(ebExt.getVersion().getBucket()); task.setKey(ebExt.getVersion().getKey()); }); }); AWSElasticBeanstalkCreateConfigurationTemplateTask awsEbMigrateConfigurationTemplates = project.getTasks() .create("awsEbMigrateConfigurationTemplates", AWSElasticBeanstalkCreateConfigurationTemplateTask.class, task -> { task.dependsOn(awsEbMigrateApplication); task.doFirst(t -> { task.setAppName(ebExt.getAppName()); task.setConfigurationTemplates(ebExt.getConfigurationTemplates()); }); }); AWSElasticBeanstalkCreateEnvironmentTask awsEbMigrateEnvironment = project.getTasks() .create("awsEbMigrateEnvironment", AWSElasticBeanstalkCreateEnvironmentTask.class, task -> { task.dependsOn(awsEbMigrateConfigurationTemplates, awsEbCreateApplicationVersion); task.doFirst(t -> { task.setAppName(ebExt.getAppName()); task.setEnvName(ebExt.getEnvironment().getEnvName()); task.setEnvDesc(ebExt.getEnvironment().getEnvDesc()); task.setTemplateName(ebExt.getEnvironment().getTemplateName()); task.setVersionLabel(ebExt.getEnvironment().getVersionLabel()); task.setTier(ebExt.getTier() != null ? ebExt.getTier() : Tier.WebServer); if (Strings.isNullOrEmpty(ebExt.getEnvironment().getCnamePrefix()) == false) { task.setCnamePrefix(ebExt.getEnvironment().getCnamePrefix()); } if (ebExt.getEnvironment().getTags() != null) { task.setTags(ebExt.getEnvironment().getTags()); } }); }); AWSElasticBeanstalkTerminateEnvironmentTask awsEbTerminateEnvironment = project.getTasks() .create("awsEbTerminateEnvironment", AWSElasticBeanstalkTerminateEnvironmentTask.class, task -> { task.doFirst(t -> { task.setAppName(ebExt.getAppName()); task.setEnvName(ebExt.getEnvironment().getEnvName()); }); }); project.getTasks().create("awsEbWaitEnvironmentReady", AWSElasticBeanstalkWaitEnvironmentStatusTask.class, task -> { task.mustRunAfter(awsEbMigrateEnvironment); task.doFirst(t -> { task.setAppName(ebExt.getAppName()); task.setEnvName(ebExt.getEnvironment().getEnvName()); }); }); AWSElasticBeanstalkWaitEnvironmentStatusTask awsEbWaitEnvironmentTerminated = project.getTasks() .create("awsEbWaitEnvironmentTerminated", AWSElasticBeanstalkWaitEnvironmentStatusTask.class, task -> { task.mustRunAfter(awsEbTerminateEnvironment); task.doFirst(t -> { task.setAppName(ebExt.getAppName()); task.setEnvName(ebExt.getEnvironment().getEnvName()); task.setSuccessStatuses(Arrays.asList("Terminated")); task.setWaitStatuses(Arrays.asList( "Launching", "Updating", "Terminating", "Ready")); }); }); Task awsEbTerminateEnvironmentAndWaitTerminated = project.getTasks() .create("awsEbTerminateEnvironmentAndWaitTerminated") .dependsOn(awsEbTerminateEnvironment, awsEbWaitEnvironmentTerminated); project.getTasks().create("awsEbCleanupApplicationVersions", AWSElasticBeanstalkCleanupApplicationVersionTask.class, task -> { task.doFirst(t -> { task.setAppName(ebExt.getAppName()); }); }); project.getTasks().create("awsEbDeleteApplication", AWSElasticBeanstalkDeleteApplicationTask.class, task -> { task.dependsOn(awsEbTerminateEnvironmentAndWaitTerminated); task.doFirst(t -> { task.setAppName(ebExt.getAppName()); }); }); } }