blob: 93318d182572ebe9febf6574d6d3ef15b25de13c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
import com.pswidersk.gradle.terraform.TerraformTask
import java.io.ByteArrayOutputStream
description = "Apache Beam :: Playground :: Deploy"
val licenseText = "################################################################################\n" +
"# Licensed to the Apache Software Foundation (ASF) under one\n" +
"# or more contributor license agreements. See the NOTICE file\n" +
"# distributed with this work for additional information\n" +
"# regarding copyright ownership. The ASF licenses this file\n" +
"# to you under the Apache License, Version 2.0 (the\n" +
"# \"License\"); you may not use this file except in compliance\n" +
"# with the License. You may obtain a copy of the License at\n" +
"#\n" +
"# http://www.apache.org/licenses/LICENSE-2.0\n" +
"#\n" +
"# Unless required by applicable law or agreed to in writing, software\n" +
"# distributed under the License is distributed on an \"AS IS\" BASIS,\n" +
"# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" +
"# See the License for the specific language governing permissions and\n" +
"# limitations under the License.\n" +
"################################################################################"
plugins {
id("com.pswidersk.terraform-plugin") version "1.0.0"
}
terraformPlugin {
terraformVersion.set("1.0.9")
}
tasks {
/* init Infrastructure for migrate */
register<TerraformTask>("terraformInit") {
// exec args can be passed by commandline, for example
var environment = "unknown"
if (project.hasProperty("project_environment")) {
environment = project.property("project_environment") as String
}
args(
"init", "-migrate-state",
"-backend-config=./environment/$environment/state.tfbackend",
"-var=environment=$environment",
if (file("./environment/$environment/terraform.tfvars").exists()) {
"-var-file=./environment/$environment/terraform.tfvars"
} else {
"-no-color"
}
)
}
/* refresh Infrastucture for remote state */
register<TerraformTask>("terraformRef") {
mustRunAfter(":playground:terraform:terraformInit")
var project_id = "unknown"
var environment = "unknown"
var region = "unknown"
if (project.hasProperty("project_id")) {
project_id = project.property("project_id") as String
}
if (project.hasProperty("project_environment")) {
environment = project.property("project_environment") as String
}
args(
"refresh",
"-lock=false",
"-var=project_id=$project_id",
"-var=environment=$environment",
"-var=region=$region",
if (file("./environment/$environment/terraform.tfvars").exists()) {
"-var-file=./environment/$environment/terraform.tfvars"
} else {
"-no-color"
}
)
}
/* deploy all App */
register<TerraformTask>("terraformApplyApp") {
var project_id = "unknown"
var environment = "unknown"
if (project.hasProperty("project_id")) {
project_id = project.property("project_id") as String
}
if (project.hasProperty("project_environment")) {
environment = project.property("project_environment") as String
}
var docker_tag = if (project.hasProperty("docker-tag")) {
project.property("docker-tag") as String
} else {
environment
}
args(
"apply",
"-auto-approve",
"-lock=false",
"-target=module.applications",
"-var=project_id=$project_id",
"-var=environment=$environment",
"-var=docker_image_tag=$docker_tag",
if (file("./environment/$environment/terraform.tfvars").exists()) {
"-var-file=./environment/$environment/terraform.tfvars"
} else {
"-no-color"
}
)
}
/* deploy App - Only all services for backend */
register<TerraformTask>("terraformApplyAppBack") {
var environment = "unknown"
if (project.hasProperty("project_environment")) {
environment = project.property("project_environment") as String
}
args(
"apply",
"-auto-approve",
"-lock=false",
"-target=module.applications.module.backend",
"-var=environment=$environment",
if (file("./environment/$environment/terraform.tfvars").exists()) {
"-var-file=./environment/$environment/terraform.tfvars"
} else {
"-no-color"
}
)
}
/* deploy App - Only services for frontend */
register<TerraformTask>("terraformApplyAppFront") {
var project_id = "unknown"
var environment = "unknown"
if (project.hasProperty("project_id")) {
project_id = project.property("project_id") as String
}
if (project.hasProperty("project_environment")) {
environment = project.property("project_environment") as String
}
var docker_tag = if (project.hasProperty("docker-tag")) {
project.property("docker-tag") as String
} else {
environment
}
args(
"apply",
"-auto-approve",
"-lock=false",
"-target=module.applications.module.frontend",
"-var=project_id=$project_id",
"-var=environment=$environment",
"-var=docker_image_tag=$docker_tag",
if (file("./environment/$environment/terraform.tfvars").exists()) {
"-var-file=./environment/$environment/terraform.tfvars"
} else {
"-no-color"
}
)
}
/* build only Infrastructurte */
register<TerraformTask>("terraformApplyInf") {
var environment = "unknown"
if (project.hasProperty("project_environment")) {
environment = project.property("project_environment") as String
}
args(
"apply",
"-auto-approve",
"-lock=false",
"-target=module.infrastructure",
"-var=environment=$environment",
if (file("./environment/$environment/terraform.tfvars").exists()) {
"-var-file=./environment/$environment/terraform.tfvars"
} else {
"-no-color"
}
)
}
/* build All */
register<TerraformTask>("terraformApply") {
var project_id = "unknown"
var environment = "unknown"
if (project.hasProperty("project_id")) {
project_id = project.property("project_id") as String
}
if (project.hasProperty("project_environment")) {
environment = project.property("project_environment") as String
}
var docker_tag = if (project.hasProperty("docker-tag")) {
project.property("docker-tag") as String
} else {
environment
}
args(
"apply",
"-auto-approve",
"-lock=false",
"-var=project_id=$project_id",
"-var=environment=$environment",
"-var=docker_image_tag=$docker_tag",
if (file("./environment/$environment/terraform.tfvars").exists()) {
"-var-file=./environment/$environment/terraform.tfvars"
} else {
"-no-color"
}
)
}
register<TerraformTask>("terraformDestroy") {
var project_id = "unknown"
var environment = "unknown"
if (project.hasProperty("project_id")) {
project_id = project.property("project_id") as String
}
if (project.hasProperty("project_environment")) {
environment = project.property("project_environment") as String
}
args(
"destroy",
"-auto-approve",
"-lock=false",
"-var=project_id=$project_id",
"-var=environment=$environment",
if (file("./environment/$environment/terraform.tfvars").exists()) {
"-var-file=./environment/$environment/terraform.tfvars"
} else {
"-no-color"
}
)
}
}
/* set Docker Registry to params from Inf */
tasks.register("setDockerRegistry") {
group = "deploy"
//get Docker Registry
dependsOn(":playground:terraform:terraformInit")
dependsOn(":playground:terraform:terraformRef")
try {
var stdout = ByteArrayOutputStream()
//set Docker Registry
exec {
commandLine = listOf("terraform", "output", "docker-repository-root")
standardOutput = stdout
}
project.rootProject.extra["docker-repository-root"] = stdout.toString().trim().replace("\"", "")
} catch (e: Exception) {
}
}
tasks.register("readState") {
group = "deploy"
dependsOn(":playground:terraform:terraformInit")
dependsOn(":playground:terraform:terraformRef")
}
tasks.register("pushBack") {
group = "deploy"
dependsOn(":playground:backend:containers:go:dockerTagsPush")
dependsOn(":playground:backend:containers:java:dockerTagsPush")
dependsOn(":playground:backend:containers:python:dockerTagsPush")
dependsOn(":playground:backend:containers:scio:dockerTagsPush")
dependsOn(":playground:backend:containers:router:dockerTagsPush")
}
tasks.register("pushFront") {
group = "deploy"
dependsOn(":playground:frontend:dockerTagsPush")
}
tasks.register("prepareConfig") {
group = "deploy"
doLast {
var dns_name = ""
if (project.hasProperty("dns-name")) {
dns_name = project.property("dns-name") as String
}
val configFileName = "config.g.dart"
val modulePath = project(":playground:frontend").projectDir.absolutePath
var file = File("$modulePath/lib/$configFileName")
file.writeText(
"""
const String kAnalyticsUA = 'UA-73650088-2';
const String kApiClientURL =
'https://router.${dns_name}';
const String kApiJavaClientURL =
'https://java.${dns_name}';
const String kApiGoClientURL =
'https://go.${dns_name}';
const String kApiPythonClientURL =
'https://python.${dns_name}';
const String kApiScioClientURL =
'https://scio.${dns_name}';
"""
)
try {
var stdout = ByteArrayOutputStream()
//set Docker Registry
exec {
commandLine = listOf("terraform", "output", "docker-repository-root")
standardOutput = stdout
}
project.rootProject.extra["docker-repository-root"] = stdout.toString().trim().replace("\"", "")
} catch (e: Exception) {
}
}
}
/* initialization infrastructure */
tasks.register("InitInfrastructure") {
group = "deploy"
description = "initialization infrastructure"
val init = tasks.getByName("terraformInit")
val apply = tasks.getByName("terraformApplyInf")
val prepare = tasks.getByName("prepareConfig")
dependsOn(init)
dependsOn(apply)
dependsOn(prepare)
apply.mustRunAfter(init)
prepare.mustRunAfter(apply)
}
tasks.register("indexcreate") {
group = "deploy"
val indexpath = "../index.yaml"
doLast{
exec {
executable("gcloud")
args("app", "deploy", indexpath)
}
}
}
/* build, push, deploy Frontend app */
tasks.register("deployFrontend") {
group = "deploy"
description = "deploy Frontend app"
val read = tasks.getByName("readState")
val push = tasks.getByName("pushFront")
val deploy = tasks.getByName("terraformApplyAppFront")
dependsOn(read)
Thread.sleep(10)
push.mustRunAfter(read)
deploy.mustRunAfter(push)
dependsOn(push)
dependsOn(deploy)
}
/* build, push, deploy Backend app */
tasks.register("deployBackend") {
group = "deploy"
description = "deploy Backend app"
//TODO please add default tag from project_environment property
//if !(project.hasProperty("docker-tag")) {
// project.extra.set("docker-tag", project.property("project_environment") as String)
//}
val config = tasks.getByName("setDockerRegistry")
val push = tasks.getByName("pushBack")
val deploy = tasks.getByName("terraformApplyAppBack")
dependsOn(config)
Thread.sleep(10)
push.mustRunAfter(config)
deploy.mustRunAfter(push)
dependsOn(push)
dependsOn(deploy)
}
tasks.register("takeConfig") {
group = "deploy"
doLast {
var ipaddr = ""
var redis = ""
var proj = ""
var registry = ""
var ipaddrname = ""
var d_tag = ""
var dns_name = ""
var stdout = ByteArrayOutputStream()
if (project.hasProperty("dns-name")) {
dns_name = project.property("dns-name") as String
}
if (project.hasProperty("docker-tag")) {
d_tag = project.property("docker-tag") as String
}
exec {
commandLine = listOf("terraform", "output", "playground_static_ip_address")
standardOutput = stdout
}
ipaddr = stdout.toString().trim().replace("\"", "")
stdout = ByteArrayOutputStream()
exec {
commandLine = listOf("terraform", "output", "playground_redis_ip")
standardOutput = stdout
}
redis = stdout.toString().trim().replace("\"", "")
stdout = ByteArrayOutputStream()
exec {
commandLine = listOf("terraform", "output", "playground_gke_project")
standardOutput = stdout
}
proj = stdout.toString().trim().replace("\"", "")
stdout = ByteArrayOutputStream()
exec {
commandLine = listOf("terraform", "output", "docker-repository-root")
standardOutput = stdout
}
registry = stdout.toString().trim().replace("\"", "")
stdout = ByteArrayOutputStream()
exec {
commandLine = listOf("terraform", "output", "playground_static_ip_address_name")
standardOutput = stdout
}
ipaddrname = stdout.toString().trim().replace("\"", "")
stdout = ByteArrayOutputStream()
val configFileName = "values.yaml"
val modulePath = project(":playground").projectDir.absolutePath
val file = File("$modulePath/infrastructure/helm-playground/$configFileName")
val lines = file.readLines()
val endOfSlice = lines.indexOfFirst { it.contains("static_ip") }
if (endOfSlice != -1) {
val oldContent = lines.slice(0 until endOfSlice)
val flagDelete = file.delete()
if (!flagDelete) {
throw kotlin.RuntimeException("Deleting file failed")
}
val sb = kotlin.text.StringBuilder()
val lastLine = oldContent[oldContent.size - 1]
oldContent.forEach {
if (it == lastLine) {
sb.append(it)
} else {
sb.appendLine(it)
}
}
file.writeText(sb.toString())
}
file.appendText("""
static_ip: ${ipaddr}
redis_ip: ${redis}:6379
project_id: ${proj}
registry: ${registry}
static_ip_name: ${ipaddrname}
tag: $d_tag
dns_name: ${dns_name}
""")
}
}
tasks.register("helmRelease") {
group = "deploy"
val modulePath = project(":playground").projectDir.absolutePath
val hdir = File("$modulePath/infrastructure/helm-playground/")
doLast{
exec {
executable("helm")
args("install", "playground", "$hdir")
}
}
}
tasks.register("gkebackend") {
group = "deploy"
val initTask = tasks.getByName("terraformInit")
val docRegTask = tasks.getByName("setDockerRegistry")
val takeConfigTask = tasks.getByName("takeConfig")
val pushBackTask = tasks.getByName("pushBack")
val pushFrontTask = tasks.getByName("pushFront")
val indexcreateTask = tasks.getByName("indexcreate")
val helmTask = tasks.getByName("helmRelease")
dependsOn(initTask)
dependsOn(docRegTask)
dependsOn(takeConfigTask)
dependsOn(pushBackTask)
dependsOn(pushFrontTask)
dependsOn(indexcreateTask)
dependsOn(helmTask)
docRegTask.mustRunAfter(initTask)
takeConfigTask.mustRunAfter(docRegTask)
pushBackTask.mustRunAfter(takeConfigTask)
pushFrontTask.mustRunAfter(pushBackTask)
indexcreateTask.mustRunAfter(pushFrontTask)
helmTask.mustRunAfter(indexcreateTask)
}