| /* |
| * Copyright 2012 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. |
| */ |
| import org.yaml.snakeyaml.Yaml |
| |
| ext { |
| |
| // Target registry to be used to publish docker images needed for deployment |
| targetReg = project.hasProperty('targetReg') ? project.getProperty('targetReg') : 'localhost:5000' |
| |
| // The tag used to tag the docker images push to the target registry |
| targetTag = project.hasProperty('targetTag') ? project.getProperty('targetTag') : 'candidate' |
| |
| // Deployment target config file (yaml format); this can be overwritten from the command line |
| // using the -PdeployConfig=<file-path> syntax. |
| deployConfig = project.hasProperty('deployConfig') ? project.getProperty('deployConfig') : './config/default.yml' |
| } |
| |
| task buildBootstrapImage(type: Exec) { |
| commandLine '/usr/bin/docker', 'build', '-t', 'cord-maas-bootstrap', './bootstrap' |
| } |
| |
| task tagBootstrapImage(type: Exec) { |
| dependsOn buildBootstrapImage |
| commandLine '/usr/bin/docker', 'tag', 'cord-maas-bootstrap', "$targetReg/cord-maas-bootstrap:$targetTag" |
| } |
| |
| task publishBootstrapImage(type: Exec) { |
| dependsOn tagBootstrapImage |
| commandLine '/usr/bin/docker', 'push', "$targetReg/cord-maas-bootstrap:$targetTag" |
| } |
| |
| task buildAutomationImage(type: Exec) { |
| commandLine '/usr/bin/docker', 'build', '-t', "cord-maas-automation", "-f", "./automation/Dockerfile", "./automation" |
| } |
| |
| task buildAutomationImageAnsible(type: Exec) { |
| commandLine '/usr/bin/docker', 'build', '-t', "cord-maas-automation:ansible", "-f", "./automation/Dockerfile.ansible", "./automation" |
| } |
| |
| task buildAutomationImages { |
| dependsOn buildAutomationImage |
| dependsOn buildAutomationImageAnsible |
| } |
| |
| task tagAutomationImage(type: Exec) { |
| dependsOn buildAutomationImage |
| commandLine '/usr/bin/docker', 'tag', 'cord-maas-automation', "$targetReg/cord-maas-automation:$targetTag" |
| } |
| |
| task tagAutomationImageAnsible(type: Exec) { |
| dependsOn buildAutomationImageAnsible |
| commandLine '/usr/bin/docker', 'tag', 'cord-maas-automation:ansible', "$targetReg/cord-maas-automation:$targetTag-ansible" |
| } |
| |
| task tagAutomationImages { |
| dependsOn tagAutomationImage |
| dependsOn tagAutomationImageAnsible |
| } |
| |
| task publishAutomationImage(type: Exec) { |
| dependsOn tagAutomationImage |
| commandLine '/usr/bin/docker', 'push', "$targetReg/cord-maas-automation:$targetTag" |
| } |
| |
| task publishAutomationImageAnsible(type: Exec) { |
| dependsOn tagAutomationImageAnsible |
| commandLine '/usr/bin/docker', 'push', "$targetReg/cord-maas-automation:$targetTag-ansible" |
| } |
| |
| task publishAutomationImages { |
| dependsOn publishAutomationImage |
| dependsOn publishAutomationImageAnsible |
| } |
| |
| task buildHarvesterImage(type: Exec) { |
| commandLine '/usr/bin/docker', 'build', '-t', "cord-maas-dhcp-harvester", "./harvester" |
| } |
| |
| task tagHarvesterImage(type: Exec) { |
| dependsOn buildHarvesterImage |
| commandLine '/usr/bin/docker', 'tag', 'cord-maas-dhcp-harvester', "$targetReg/cord-maas-dhcp-harvester:$targetTag" |
| } |
| |
| task publishHarvesterImage(type: Exec) { |
| dependsOn tagHarvesterImage |
| commandLine '/usr/bin/docker', 'push', "$targetReg/cord-maas-dhcp-harvester:$targetTag" |
| } |
| |
| // ~~~~~~~~~~~~~~~~~~~ Global tasks ~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| // To be used to fetch upstream binaries, clone repos, etc. |
| task fetch(type: Exec) { |
| // this is where we fetch upstream artifacts that we do not need internet for the build phase" |
| // Placeholdr example: |
| commandLine "/usr/bin/docker", "pull", "golang:alpine" |
| commandLine "/usr/bin/docker", "pull", "python:2.7-alpine" |
| } |
| |
| // To be used to generate all needed binaries that need to be present on the target |
| // as docker images in the local docker runner. |
| task buildImages { |
| dependsOn buildBootstrapImage |
| dependsOn buildHarvesterImage |
| dependsOn buildAutomationImages |
| } |
| |
| task tagImages { |
| dependsOn tagBootstrapImage |
| dependsOn tagHarvesterImage |
| dependsOn tagAutomationImages |
| } |
| |
| task publish { |
| dependsOn publishBootstrapImage |
| dependsOn publishHarvesterImage |
| dependsOn publishAutomationImages |
| } |
| |
| task build { |
| dependsOn buildImages |
| } |
| |
| // ~~~~~~~~~~~~~~~~~~~ Deployment / Test Tasks ~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| List.metaClass.asParam = { prefix, sep -> |
| if (delegate.size() == 0) { |
| "" |
| } |
| String result = "--" + prefix + "=" |
| String p = "" |
| delegate.each { |
| result += p + "${it}" |
| p = sep |
| } |
| result |
| } |
| |
| List.metaClass.p = { value, name -> |
| if (value != null && value != "") { |
| delegate << name + "=" + value |
| } else { |
| delegate |
| } |
| } |
| |
| List.metaClass.p = { spec -> |
| if (spec != null && spec != "") { |
| delegate += spec |
| } else { |
| delegate |
| } |
| } |
| |
| task deploy (type: Exec) { |
| println "Using deployment config: $deployConfig" |
| File configFile = new File(deployConfig) |
| def yaml = new Yaml() |
| def config = yaml.load(configFile.newReader()) |
| |
| executable = "ansible-playbook" |
| args = ["-i", config.seedNode.ip + ','] |
| |
| if ( config.seedNode.user != null && config.seedNode.user != "" ) { |
| args = args << "--user=$config.seedNode.user" |
| } |
| |
| def extraVars = [] |
| if (config.seedNode) { |
| extraVars = extraVars.p(config.seedNode.extraVars) |
| .p(config.seedNode.password, "ansible_ssh_pass") |
| .p(config.seedNode.sudoPassword, "ansible_sudo_pass") |
| .p(config.seedNode.fabric_ip, "fabric_ip") |
| .p(config.seedNode.management_ip, "management_ip") |
| .p(config.seedNode.external_ip, "external_ip") |
| } |
| |
| if (config.otherServers) { |
| extraVars = extraVars.p(config.otherServers.location, "prov_location") |
| .p(config.otherServers.rolesPath, "prov_role_path") |
| .p(config.otherServers.role, "prov_role") |
| } |
| |
| def skipTags = [].p(config.seedNode.skipTags) |
| |
| args = args.p(skipTags.asParam("skip-tags", ",")).p(extraVars.asParam("extra-vars", " ")) << "head-node.yml" |
| println args |
| } |