Skip to content

Instantly share code, notes, and snippets.

@fubarhouse
Last active April 2, 2019 11:44
Show Gist options
  • Save fubarhouse/2b0b10472250bf25f7669cf8437da450 to your computer and use it in GitHub Desktop.
Save fubarhouse/2b0b10472250bf25f7669cf8437da450 to your computer and use it in GitHub Desktop.
Magefile for Lagoon
// +build mage
// An abstraction layer for Amazeeio's Lagoon Make process.
// Made to suit compatibility with v0.22.1
package main
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strings"
"github.com/magefile/mage/sh"
)
var baseImages = []string{
"oc",
"mariadb",
"mariadb-drupal",
"mariadb-galera",
"mariadb-galera-drupal",
"postgres",
"postgres-ckan",
"postgres-drupal",
"oc-build-deploy-dind",
"commons",
"nginx",
"nginx-drupal",
"varnish",
"varnish-drupal",
"varnish-persistent",
"varnish-persistent-drupal",
"redis",
"redis-persistent",
"rabbitmq",
"rabbitmq-cluster",
"mongo",
"elasticsearch",
"kibana",
"logstash",
"athenapdf-service",
"curator",
"docker-host",
"yarn-workspace-builder",
}
var services = []string{
"api",
"auth-server",
"logs2slack",
"logs2rocketchat",
"openshiftbuilddeploy",
"openshiftbuilddeploymonitor",
"openshiftjobs",
"openshiftjobsmonitor",
"openshiftmisc",
"openshiftremove",
"rest2tasks",
"webhook-handler",
"webhooks2tasks",
"broker",
"broker-single",
"logs-forwarder",
"logs-db",
"logs-db-ui",
"logs-db-curator",
"logs2logs-db",
"auto-idler",
"storage-calculator",
"api-db",
"drush-alias",
"keycloak",
"keycloak-db",
"ui",
"api-db-galera",
"keycloak-db-galera",
}
var pythonImages = []string{
"python--2.7",
"python__3.7",
"python__2.7-ckan",
"python__2.7-ckandatapusher",
}
var phpImages = []string{
"php__5.6-fpm",
"php__7.0-fpm",
"php__7.1-fpm",
"php__7.2-fpm",
"php__7.3-fpm",
"php__5.6-cli",
"php__7.0-cli",
"php__7.1-cli",
"php__7.2-cli",
"php__7.3-cli",
"php__5.6-cli-drupal",
"php__7.0-cli-drupal",
"php__7.1-cli-drupal",
"php__7.2-cli-drupal",
"php__7.3-cli-drupal",
}
var solrImages = []string{
"solr__5.5",
"solr__6.6",
"solr__7.5",
"solr__5.5-drupal",
"solr__6.6-drupal",
"solr__7.5-drupal",
"solr__5.5-ckan",
"solr__6.6-ckan",
}
var nodeImages = []string{
"node__10",
"node__9",
"node__8",
"node__6",
"node__10-builder",
"node__9-builder",
"node__8-builder",
"node__6-builder",
}
// Build lagoon images on the localhost.
func Build() error {
return sh.Run("make", "build")
}
// Start lagoon on the localhost via docker-compose.
func Run() error {
return sh.Run("docker-compose", "up", "-d")
}
// Terminate lagoon on the localhost via docker-compose.
func Stop() error {
return sh.Run("docker-compose", "down")
}
// Removes and cleans up file system from built lagoon images.
func Clean() error {
return sh.Run("make", "clean")
}
// Run lagoon tests on the localhost.
func Test() error {
return sh.Run("make", "tests")
}
// Push images from the localhost to MiniShift
func Minishift_push() error {
return sh.Run("make", "push-minishift")
}
// Setup Minishift Lagoon
func Minishift_setup() error {
return sh.Run("make", "openshift-lagoon-setup")
}
// Configure Lagoon Local
func Minishift_configure() error {
return sh.Run("make", "openshift/configure-lagoon-local")
}
// Setup UI for local development with docker-compose.
func Ui() error {
return sh.Run("make", "ui-development")
}
// Starts/installs minishift.
func Minishift() error {
return sh.Run("make", "minishift")
}
// Stop minishift.
func Minishift_stop() error {
return sh.Run("make", "minishift")
}
// Cleans minishift.
func Minishift_clean() error {
return sh.Run("make", "openshift/clean")
}
// Scans the file system from $PWD for any kubernetes objects files
func Find() error {
count := 0
fileList := []string{}
err := filepath.Walk(".", func(path string, f os.FileInfo, err error) error {
if strings.HasSuffix(path, "yaml") || strings.HasSuffix(path, "yml") {
b, err := ioutil.ReadFile(path)
if err != nil {
panic(err)
}
s := string(b)
if strings.Contains(s, "spec:") && strings.Contains(s, "kind:") {
fileList = append(fileList, path)
count++
}
}
return nil
})
for _, file := range fileList {
fmt.Println(file)
}
fmt.Printf("\nFound %v Kubernetes object files\n", count)
return err
}
// Build process for images.
func build(identifier string) {
sepOne := strings.Split(identifier, "__")
sepTwo := strings.Split(identifier, "-")
name := strings.Replace(identifier, "--", "__", -1)
buildParams := []string{}
language := sepOne[0]
version := strings.Split(sepOne[len(sepOne)-1], "-")[0]
tag := sepTwo[len(sepTwo)-1]
if version == tag || strings.HasSuffix(tag, version) {
tag = "latest"
}
fmt.Println("Language: ", language)
fmt.Println("Version: ", version)
fmt.Println("Tag: ", tag)
//ddd := strings.Split(sepTwo[len(sepTwo)], "-")
//
//if len(ddd) > 0 {
// fmt.Println(ddd)
//}
dockerfilePath := fmt.Sprintf("images/%v/Dockerfile", name)
if strings.HasPrefix(identifier, "python") {
buildParams = []string{"build", "--quiet", "--build-arg", "LAGOON_VERSION=development", "--build-arg", "IMAGE_REPO=lagoon", "--build-arg", "PYTHON_VERSION="+version, "-t", "lagoon/python:"+tag, "-f", dockerfilePath, name}
} else if strings.HasPrefix(identifier, "php") {
buildParams = []string{"build", "--quiet", "--build-arg", "LAGOON_VERSION=development", "--build-arg", "IMAGE_REPO=lagoon", "--build-arg", "PHP_VERSION="+version, "-t", "lagoon/php:"+tag, "-f", dockerfilePath, name}
} else if strings.HasPrefix(identifier, "node") {
buildParams = []string{"build", "--quiet", "--build-arg", "LAGOON_VERSION=development", "--build-arg", "IMAGE_REPO=lagoon", "--build-arg", "NODE_VERSION="+version, "-t", "lagoon/node:"+tag, "-f", dockerfilePath, name}
} else if strings.HasPrefix(identifier, "solr") {
buildParams = []string{"build", "--quiet", "--build-arg", "LAGOON_VERSION=development", "--build-arg", "IMAGE_REPO=lagoon", "--build-arg", "SOLR_MAJ_MIN_VERSION="+version, "-t", "lagoon/solr:"+tag, "-f", dockerfilePath, name}
}
fmt.Println(buildParams)
}
// Manual build of all images.
func Construct() error {
for _, image := range baseImages {
fmt.Printf("building image lagoon/%v for registry push\n", image)
sh.Run("docker",
"build",
"--quiet",
"--build-arg",
"LAGOON_VERSION=development",
"--build-arg",
"IMAGE_REPO=lagoon",
"-t",
"lagoon/"+image,
"-f",
"images/"+image+"/Dockerfile",
"images/"+image,
)
}
for _, image := range services {
fmt.Printf("building image lagoon/%v for registry push\n", image)
sh.Run("docker",
"build",
"--quiet",
"--build-arg",
"LAGOON_VERSION=development",
"--build-arg",
"IMAGE_REPO=lagoon",
"-t",
"lagoon/"+image,
"-f",
"services/"+image+"/Dockerfile",
"services/"+image,
)
}
for _, image := range pythonImages {
fmt.Printf("building image lagoon/%v for registry push\n", image)
build(image)
}
for _, image := range nodeImages {
fmt.Printf("building image lagoon/%v for registry push\n", image)
build(image)
}
for _, image := range phpImages {
fmt.Printf("building image lagoon/%v for registry push\n", image)
build(image)
}
for _, image := range solrImages {
fmt.Printf("building image lagoon/%v for registry push\n", image)
build(image)
}
return nil
}
// A custom call to push all images to the Open/Mini Shift.
func Thrust() error {
content, err := ioutil.ReadFile("minishift")
if err != nil {
panic(err)
}
MINISHIFT := strings.Trim(string(content), "\n")
fmt.Sprint(MINISHIFT)
for _, image := range baseImages {
err := sh.Run("docker", "image", "inspect", "lagoon/" + image)
if err == nil {
fmt.Printf("pushing lagoon/%v to minishift registry\n", image)
//tagErr := sh.Run("docker", "tag", "lagoon/"+image, MINISHIFT+":3000/lagoon/"+image)
//pushErr := sh.Run("docker", "push", MINISHIFT+":3000/lagoon/"+image)
} else {
fmt.Printf("Error inspecting validity of %v\n", image)
}
}
for _, image := range services {
err := sh.Run("docker", "image", "inspect", "lagoon/" + image)
if err == nil {
fmt.Printf("pushing lagoon/%v to minishift registry\n", image)
//tagErr := sh.Run("docker", "tag", "lagoon/"+image, MINISHIFT+":3000/lagoon/"+image)
//pushErr := sh.Run("docker", "push", MINISHIFT+":3000/lagoon/"+image)
} else {
fmt.Printf("Error inspecting validity of %v\n", image)
}
}
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment